¿Por qué dijo el padre de Clojure que los verdaderos/falsos de Scheme están rotos?
null common-lisp (3)
En Scheme, cualquier valor (aparte de #f que es False) se puede usar como True en una prueba condicional. Más información here .
Actualizar Olvida esta respuesta, ya que es lo mismo para Clojure, por supuesto. No me gusta esta verdad implícita para todos los valores que no son falsos, por ejemplo en (println (si 1 es "verdadero" "falso")). Personalmente lo consideraría roto, pero Rich probablemente esté pensando en otra cosa.
En este video , Rich Hickey presentó Clojure para programadores de Lisp.
En el momento 01:10:42, habló sobre nil / false / end-of-sequence / ''() entre Clojure / Common Lisp / Scheme / Java. Él dijo: "El esquema tiene verdadero y falso, pero están rotos".
No entiendo por qué dijo eso y ¿por qué considera que está "roto"?
Me parece que preferirías verlo de la boca del caballo, así que aquí hay una selección de un mensaje que Rich publicó:
El esquema #t es casi completamente sin sentido, ya que el esquema de los condicionales prueba para # f / no- # f, no # f / # t. No creo que el valor #f tenga mucha utilidad en absoluto, y basar condicionales significa escribir mucho (if (not (null? X)) ... where (si x ... va a funcionar en Clojure / CL , y una reducción sustancial en el poder expresivo cuando se trata de secuencias, filtros, etc.
Los enlaces en ese mensaje también valen la pena, aunque el segundo puede ser un poco poético.
De la tabla que publicaste, supongo que es porque Scheme, a diferencia de todos los demás idiomas en el gráfico, usa algo distinto de nil
o false
para el end-of-seq
. Como ''()
non-#f
es non-#f
, sería un valor de verdad en un condicional, pero actúa como un valor falso para las verificaciones de final de secuencia.