Я работаю над программой, которая генерирует программу (Генетическое программирование).Я строю во время выполнения 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