LISP中的动态构建功能

时间:2016-02-09 07:58:21

标签: lisp common-lisp metaprogramming

我有一个关于动态构建的函数(或类似的东西)的问题。在Java中,我可以通过编程方式将一些Source写入一个String,编译该字符串并像函数一样多次执行它。

想象一下,我有一些遗传算法可以创建最佳代码来获取n个输入参数,根据基因组计算它们并返回m个输出参数。所以我想知道它是否可能(而且我确定它是),创建一个包含该函数的列表列表....然后用不同的输入调用这个函数几千次用于计算错误率的参数。

我现在需要的是一个例子,如何以编程方式创建这样的列表以及如何使用它。目前我完全被卡住了。

热烈欢迎任何参考或例子。

2 个答案:

答案 0 :(得分:6)

Lisp代码是数据:列表,符号,数字......

Options -Indexes
RewriteEngine On
RewriteRule ^user/([0-9]+)/?$    index.php?a=user&id=$1    [QSA,L]
RewriteRule ^img/([0-9]+)/?$    index.php?a=img&id=$1    [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?a=$1 [QSA,L]

Lisp具有(defun foo () 42) list等功能。你可以使用它:

+

你如何编译一个函数?评估代码并编译它。

(list 'defun
      'foo
      '()
      (+ 25 17))

所以放在一起:

(compile (eval my-function-definition))

它真的编译好了吗?

CL-USER 10 > (compile (eval (list 'defun 'foo '() (+ 25 17))))
FOO
NIL
NIL

CL-USER 11 > (foo)
42

似乎是......

答案 1 :(得分:3)

正如Rainer Joswig所说,你应该阅读一些Lisp书(特别是关于列表操作和宏的章节),但这是一个使用compile的非常简单的例子:

(defun test (op number)
  (let ((func (compile nil `(lambda (y)
                              (,op y y)))))
    (format t "The function is ~:[not compiled~;compiled~].~%"
            (compiled-function-p func))
    (funcall func number)))

(test '+ 5) ; => 10
(test '* 5) ; => 25

这使用backquote语法构造lambda表达式,但您也可以使用常规列表操作操作(pushcons等)构建它。 / p>