Todo, estoy empezando a echar un vistazo al lenguaje Clojure, y tenía un par de preguntas sobre algo que estoy tratando de hacer. El objetivo general es alias la función de secuencia every?
a all?
. Estoy seguro de que hay una función o macro que hace alias-ing (o algo parecido), pero quería ver si era posible con algunas de las construcciones básicas que conozco hasta ahora. Mi enfoque iba a ser definir una función llamada all?
que aplica sus argumentos a la implementación every?
.Pregunta de metaprogramación Clojure (para un principiante)
Tengo curiosidad por ver si esto puede hacerse agnóstico, así que quería parametrizar mi función de alias para tomar dos argumentos, el nuevo nombre (como Palabra clave) y el nombre anterior (como una referencia de función). Al esforzarme por alcanzar este objetivo, me he encontrado con dos problemas.
1) Definición de funciones nombradas con palabras clave arroja errores. Aparentemente quiere clojure.lang.IObj
.
user=> (defn :foo "bar")
java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to clojure.lang.IObj (NO_SOURCE_FILE:0)
¿Hay una función para emitir una palabra clave a un Iobj, u otros medios para parametrizar el nombre de una función que acaba de definir con algún valor proporcionado? (En Ruby, define_method entre otras técnicas hace esto)
irb(main)> self.class.instance_eval do
irb(main)* define_method(:foo) { "bar" }
irb(main)> end
=> #<Proc>
irb(main)> foo
=> "bar"
2) Recoger todos los argumentos a una función en una sola variable. Incluso funciones básicas como (+ 1 2 3 4)
toman una cantidad variable de argumentos. Todas las técnicas de definición de funciones que he visto hasta ahora toman una cantidad específica de argumentos, sin posibilidad de agregar todo en una lista para su manejo en el cuerpo de la función. Una vez más, lo que voy a hacer se hace en Ruby así:
irb(main)> def foo(*args)
irb(main)> p args
irb(main)> end
=> nil
irb(main)> foo(1, 2, 3)
[1, 2, 3]
=> nil
¡Gracias por cualquier ayuda que me puedan dar!
Acabo de publicar una Gist con una función 'intern-alias' realizando el diseño al que se aludía en el último párrafo. Agregaré una docstring en un segundo. Copia el meta del original al alias, admite la creación de alias en espacios de nombres distintos al actual, acepta tanto símbolos como Vars como los originales & c. Ver http://gist.github.com/464970 –
Vamos, amigo. ¡Al menos dale a otras personas una oportunidad! ¿No hay algún tipo de medicamento que pueda tomar para reducir su nivel de inteligencia a * normal *? Vuelve con nosotros, hermano, te extrañamos. : p – Rayne
Gracias por el comentario en profundidad. Definitivamente iluminó la mayoría de todo lo que estaba buscando. Con respecto al punto n. ° 3 (los vars se nombran por símbolos, no por palabras clave), ¿hay alguna manera de incluir una palabra clave en un símbolo? Digamos, por el bien de un ejercicio, quería escribir una función que incluyera def, y tomé dos argumentos, una palabra clave y un valor, y luego llamé internamente def y llamé a la variable el nombre de la palabra clave. ¿Posible? –