2008-10-06 6 views
8

Après avoir compris (citation), je suis curieux de savoir comment on pourrait provoquer l'exécution de l'instruction. Ma première pensée étaitExécuter le code stocké sous forme de liste

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

mais qui vient d'évaluer à (+ 2 21), ou le contenu de x. Comment exécuter un code qui a été placé dans une liste?

+1

Je pense que vous posez la mauvaise question. Que veux tu vraiment faire? –

Répondre

16

(eval '(+ 2 21))

+0

Wow - c'est si simple ... –

+0

:) Notez que vous pouvez faire des choses intéressantes avec backtick pour contrôler ce qui est évalué par eval. – Rich

+0

Maintenant, je suis curieux ... puis-je avoir un exemple s'il vous plaît? –

0

@ Christián Romo:

backtick exemple: vous pouvez mettre en œuvre un peu appliquer à l'aide eval et backtick, parce que vous pouvez raccorder des arguments en une forme. Ne va pas être la chose la plus efficace dans le monde, mais:

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

est équivalent à

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

Soit dit en passant, ce qui a le même résultat que le (beaucoup plus efficace)

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

Espoir qui satisfait votre curiosité!

+0

C'est intéressant ... Je vais devoir en apprendre plus sur tous ces petits trucs de fantaisie. –

0

Jetez un coup d'œil au tutoriel amusant de Lisp au http://lisperati.com/. Il existe des versions pour Common Lisp et Emacs Lisp, et cela démontre l'utilisation de quasiquote et de macros.

Questions connexes