2011-02-15 23 views
15

Usando defn o fn es fácil crear una función que toma un argumento que lo ignora y devuelve 1:función anónima regresar 1, usando #()

(defn ret1 [arg] 1) 
(fn [arg] 1) 

¿Es posible hacer esto con el #() ¿macro? No me refiero a usar algo feo o "trampas" como

#(/ % %) or 
#(if (nil? %) 1 1) 

quiero decir, literalmente, haciendo caso omiso de los parámetros y volver 1. No puedo encontrar una sintaxis limpia que funciona.

+0

Esto funciona - acercándose .. # (last (list% 1)) – Markc

Respuesta

26

#(do %& 1) ... pero (constantly 1) es mejor.

+1

Aha! Sí, eso es más limpio que mi último intento de usar # (último (lista)). También me gusta que lo haya generalizado a cualquier cantidad de parámetros usando% &. La pregunta original fue inspirada por el SICP 1.37 que estipula el uso de (lambda (i) 1.0) para devolver 1.0. El mapeo obvio para clojure fue (fn [i] 1) pero me pregunté cómo hacerlo con #(). ¡Gracias! – Markc

5

La sintaxis #() no se puede usar para crear funciones que tienen parámetros no utilizados de la manera que su descripción lo requiere. Esta es una limitación de la macro del lector #().

recomendaría no usando #() y en su lugar sólo escribir (en constante 1) que es una manera muy breve para crear una función que hace caso omiso de un parámetro y en su lugar siempre devuelve 1.

+2

* La sintaxis #() no se puede usar para crear funciones que tienen parámetros no utilizados * Claro que puede (ver mi respuesta), pero es no es la mejor manera – fogus

+0

@drcode Admita que la respuesta es incorrecta. Al igual que usted, nunca hubiera pensado en insertar un '% &' perdido para invocar una lista de argumentos arbitraria. – Thumbnail

+0

@drcode ... ¿o no? Es discutible que mencionar argumentos, incluso sin evaluarlos, constituya * uso *. Pero ciertamente son * ignorados *, como lo requiere la pregunta. – Thumbnail

Cuestiones relacionadas