2008-10-06 16 views
8

Después de entender (citar), tengo curiosidad sobre cómo uno puede hacer que la instrucción se ejecute. Mi primer pensamiento fueEjecutando el código almacenado como una lista

(defvar x '(+ 2 21)) 
`(,@x) 

pero eso sólo se evalúa como (+ 2 21), o el contenido de x. ¿Cómo se podría ejecutar el código que se colocó en una lista?

+1

Creo que estás haciendo la pregunta incorrecta. ¿Qué quieres hacer realmente? –

Respuesta

16

(eval '(+ 2 21))

+0

Wow - es tan simple ... –

+0

:) Tenga en cuenta que puede hacer algunas cosas interesantes con un contragolpe para controlar lo que evalúa eval. – Rich

+0

Ahora tengo curiosidad ... ¿puedo darme un ejemplo, por favor? –

0

@ Christián Romo:

ejemplo de acento grave: se puede aplicar un poco de aplicación usando eval y de acento grave, porque se puede empalmar argumentos en una forma. No va a ser lo más eficiente del mundo, pero:

(eval `(and ,@(loop for x from 1 upto 4 collect `(evenp ,x)))) 

es equivalente a

(eval '(and (evenp 1) (evenp 2) (evenp 3) (evenp 4))) 

Por cierto, esto tiene el mismo resultado que el (mucho más eficiente)

(every 'evenp '(1 2 3 4)) 

¡Espero que satisfaga tu curiosidad!

+0

Eso es interesante ... Tendré que aprender más acerca de todos estos pequeños y elegantes trucos. –

0

Eche un vistazo al divertido tutorial de Lisp al http://lisperati.com/. Hay versiones para Common Lisp y Emacs Lisp, y demuestra el uso de quasiquote y macros.

Cuestiones relacionadas