Los contras de lisp comunes crean una lista a partir de dos símbolos, ¿los contras de clojure requieren una secuencia para contras?

StackOverflow https://stackoverflow.com/questions/3222789

Pregunta

(Descargo de responsabilidad: soy consciente de la importancia de Seqs en Clojure)

En lisp común, la función cons se puede utilizar para combinar dos símbolos en una lista:

(def s 'x)
(def l 'y)
(cons s l)

En clojure, solo puedes usar contras en una secuencia, los contras no se han extendido para que funcionen con dos símbolos.Entonces tienes que escribir:

(def s 'x)
(def l 'y)
(cons s '(l))

¿Existe un patrón de nivel superior en Clojure que explique esta diferencia entre Common LISP y Clojure?

¿Fue útil?

Solución

En Clojure, a diferencia de los Lisps tradicionales, las listas no son las estructuras de datos principales.Las estructuras de datos pueden implementar la ISeq interfaz, que es otra vista de la estructura de datos que se proporciona, lo que permite que las mismas funciones accedan a los elementos de cada uno.(Las listas ya implementan esto. seq? comprueba si algo se implementa ISeq.(seq? '(1 2)), (seq? [1 2])) Clojure simplemente actúa de manera diferente (con razón), en el sentido de que cuando cons se utiliza, una secuencia (en realidad es del tipo clojure.lang.Cons) construido de a y (seq b) es regresado.(a siendo arg 1 y b arg 2) Obviamente, los símbolos no se implementan ni se pueden implementar. ISeq.

Clojure.org/sequences

Secuencias screencast/charla de Rich Hickey Sin embargo, tenga en cuenta que rest ha cambiado y su comportamiento anterior ahora está en next, y eso lazy-cons ha sido reemplazado por lazy-seq y cons.

clojure.lang.RT

Otros consejos

En comunes Lisp Contras crea una llamada celda de consulta, que es similar a un registro con dos ranuras: el 'automóvil' y el 'cdr'.

Puede poner cualquier cosa en esas dos ranuras de una celda CONS.

Las células

contras se utilizan para construir listas.Pero uno puede crear todo tipo de estructuras de datos con contras Celfs: árboles, gráficos, varios tipos de listas especializadas, ...

Las implementaciones de LISP están altamente optimizadas para proporcionar celdas con contras muy eficientes.

Una lista Lisp es solo una forma común de usar celdas de contras (ver descripción de rainer).Es mejor ver a Clojure como si no tuviera celdas de desventajas (aunque algo similar podría esconderse debajo del capó).El Clojure cons es un nombre inapropiado, en realidad debería llamarse simplemente prepend.

En Clojure, se prefiere el uso de un vector de dos elementos: [:a :b].Bajo el capó, estos pequeños vectores se implementan como matrices de Java y son extremadamente simples y rápidas.

Una mano corta para (cons :a '(:b)) (o (cons :a (cons :b nil))) es list: (list :a :b).

Cuando tu dices

> (cons 'a 'b)

en ceceo común no obtienes una lista sino un par de puntos: (a . b), mientras que el resultado de

> (cons 'a (cons 'b nil))

es el par de puntos (a . ( b . nil)).

En la primera lista el cdr() de eso no es una lista, ya que está aquí b y no nil, por lo que es una lista inadecuada.Las listas apropiadas deben ser terminadas por nil.Por lo tanto, funciones de orden superior como mapcar() y amigos no funcionarán, pero salvamos un celular de contras.Supongo que los diseñadores de Clojure eliminaron esta característica por la confusión que podría causar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top