¿Hay variables en las comprensiones de secuencias de Clojure?

Estoy leyendo Programación Clojure 2da edición, y en la página 49 cubre la construcción de bucle for de Clojure, que dice que en realidad es una comprensión de secuencia.

Los autores sugieren el siguiente código:

(defn indexed [coll] (map-indexed vector coll))

(defn index-filter [pred col]
  (when pred
    (for [[idx elt] (indexed col) :when (pred elt)] idx)))

(index-filter #{\a} "aba")
(0 2)

... es preferible a un ejemplo imperativo basado en Java, y la evidencia dada es que "mediante el uso de funciones de orden superior... el índice funcional de cualquiera evita toda necesidad de variables".

¿Qué son "idx", "elt" si no son variables? ¿Significan variables además de los acumuladores?

Además, ¿por qué #{\a} en lugar de "a"?

preguntado el 26 de septiembre de 12 a las 16:09

2 Respuestas

pred es un función - #{\a} es un conjunto que contiene el carácter a. En Clojure, un conjunto es una función que devuelve verdadero si su argumento \a está contenido por ella. También podrías usar #(= % \a) or (fn [x] (= \a x)).

Como implica la otra respuesta, "no se creó ningún estado al hacer este ejemplo". idx y elt funcionan como variables, pero son locales solo para el for secuencia de comprensión, por lo que el código es más compacto, no con estado y posiblemente más claro (una vez que esté acostumbrado a secuenciar comprensiones, al menos :-)), tal vez el texto no sea lo más claro posible en este punto.

Respondido el 26 de Septiembre de 12 a las 22:09

  1. No hay variables en los lenguajes funcionales. En realidad, necesitas distinguir variable y propuesta de. idx es solo un nombre vinculado a un valor concreto, y no puede reasignarlo (pero puedes rebotarlo a otro valor).

  2. Primer parámetro de la función index-filter es predicado, eso significa función que devuelve true or false. #{\a} es una estructura de datos set, pero también se puede tratar como una función. Si pasa el elemento como argumento para establecer la función, devuelve este argumento (como verdadero) si el elemento existe y nil (como false) de lo contrario. Entonces puede pensar en este predicado establecido como una función anónima escrita de una manera más comprensible #(contains? #{\a} %)

Respondido el 26 de Septiembre de 12 a las 16:09

Así que antes en el capítulo hablan de "vars", es decir (def a 1). Supongo que donde estoy confundido es la diferencia entre una variable y una var inmutable cuyo valor cambia. ¿Es esto en efecto la creación de idx1, idx2, idx3, etc. en la memoria para cada iteración, y cuando se elimina la referencia de idx, devuelve el último valor que se mantuvo en idx? - Isocianato de alilo

simplemente no puede cambiar el valor vinculado en el alcance donde está definido. entonces, por ejemplo, cada iteración tiene un valor exacto de idx y no puede simplemente reasignarlo como en los idiomas imperativos: contratiempo

Vars son ubicaciones de memoria reales cuyo contenido se puede leer y escribir. Los enlaces en una lista de comprensión, como en una expresión (let [] ...), son de naturaleza más léxica: puede pensar en los símbolos aquí como marcadores de posición que se reemplazan con un valor real cuando se evalúa la expresión. - Alex

Todavía no entiendo esto. Si es A. un puntero con nombre a un lugar en la memoria, B. tiene un valor y C. cambia dinámicamente... ¿cómo no es una variable? Si estos son realmente inmutables, entonces creo que todos serían ubicaciones separadas en la memoria (y allí tendrían que recolectar basura de alguna manera) - Isocianato de alilo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.