如何让文本在 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*)
假设执行下面的宏:
(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*)