假设以下宏执行:
(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执行列表中的四个命令?
答案 0 :(得分:3)
您可以使用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*)
或只是args本身列表:
(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*)