2

我正在开发一个生成程序(遗传编程)的程序。我在运行时构建了一个 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
4

1 回答 1

2

感谢@RainerJoswig 和@coredump 我做了以下修改并且它有效:

;;;; 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
于 2018-12-05T14:19:31.713 回答