我正在开发一个生成程序(遗传编程)的程序。我在运行时构建了一个 s 表达式,今天我像这样使用 eval:
(defvar *program* '(+ x 1))
(defvar x 10)
(eval *program*) ;; returns 11
对多个 x 进行了评估,我想在运行时将 s 表达式编译成一个函数,然后为多个 x 调用它以提高性能。
我不知道该怎么做,我会很感激一些帮助。这是我所拥有的:
;;;; This is not working code
(defmacro compile-program (args &body body)
(compile nil `(lambda (,@args)
(declare (ignorable ,@args))
(progn ,@body))))
(funcall (compile-program (x) *program*) 10) ;; returns (+ X 1)
(funcall (compile-program (x) (+ x 1)) 10) ;; returns 11
编辑: 感谢@RainerJoswig 我做了以下修改并且它有效:
;;;; Working Code
(defvar *program* '(+ x 1))
(defun compile-program (args program)
(compile nil `(lambda ,args
(declare (ignorable ,@args))
,program)))
(funcall (compile-program '(x) *program*) 10) ;; returns 11