Как скомпилировать s-выражение во время выполнения, а затем выполнить его в Common Lisp - PullRequest
0 голосов
/ 05 декабря 2018

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

1 Ответ

0 голосов
/ 05 декабря 2018

Thx to @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
...