我有一个关于动态构建的函数(或类似的东西)的问题。在Java中,我可以通过编程方式将一些Source写入一个String,编译该字符串并像函数一样多次执行它。
想象一下,我有一些遗传算法可以创建最佳代码来获取n个输入参数,根据基因组计算它们并返回m个输出参数。所以我想知道它是否可能(而且我确定它是),创建一个包含该函数的列表列表....然后用不同的输入调用这个函数几千次用于计算错误率的参数。
我现在需要的是一个例子,如何以编程方式创建这样的列表以及如何使用它。目前我完全被卡住了。
热烈欢迎任何参考或例子。
答案 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
表达式,但您也可以使用常规列表操作操作(push
,cons
等)构建它。 / p>