如何在LISP中执行文本?

时间:2015-02-03 13:54:24

标签: lisp common-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执行列表中的四个命令?

1 个答案:

答案 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*)