如何让文本在 LISP 中执行?

How to get a text to be executed in LISP?

假设执行下面的宏:

(make-model '((1 2)(3 4)(5 6)(7 8)))

,可以生成如下列表:

((MAKE-INSTANCE 'MODEL :NAME 7 :ID 8) 
 (MAKE-INSTANCE 'MODEL :NAME 5 :ID 6)
 (MAKE-INSTANCE 'MODEL :NAME 3 :ID 4) 
 (MAKE-INSTANCE 'MODEL :NAME 1 :ID 2))

如果我将结果存储在一个参数中(例如 *test*),我怎样才能让 lisp 执行列表中的四个命令?

您可以使用 eval:

(mapcar #'eval *test*)

不过,这是一个suboptimal solution

你最好保存一个 lambda:

(defmacro make-model-lambda (args)
  (list* 'lambda () (apply #'make-model args)))
(defparameter *test* (make-model-lambda ....))
(funcall *test*)

或者只是参数本身的列表:

(defparameter *test*
  (mapcar (lambda (name-id)
            (list 'model :name (first name-id) :id (second name-id)))
          '((1 2)(3 4)(5 6)(7 8))))
(mapcar #'apply *test*)