Hen*_*nes -1 lisp metaprogramming common-lisp
我有一个关于动态构建的函数(或类似的东西)的问题.在Java中,我可以以编程方式将一些Source写入一个String,编译该字符串并像函数一样多次执行它.
想象一下,我有一些遗传算法来创建最佳代码来获取n个输入参数,根据基因组计算它们并返回m个输出参数.所以我想知道是否可能(并且我很确定它是),创建一个列表列表....包含该函数,然后使用不同的输入参数调用此函数几千次以计算错误率.
我现在需要的是一个例子,如何以编程方式创建这样的列表以及如何使用它.目前我完全陷入困境.
任何参考或例子都受到热烈欢迎.
Lisp代码是数据:列表,符号,数字,......
(defun foo () 42)
Run Code Online (Sandbox Code Playgroud)
Lisp具有list和的功能+.你可以用它:
(list 'defun
'foo
'()
(+ 25 17))
Run Code Online (Sandbox Code Playgroud)
你如何编译一个函数?评估代码并编译它.
(compile (eval my-function-definition))
Run Code Online (Sandbox Code Playgroud)
所以放在一起:
CL-USER 10 > (compile (eval (list 'defun 'foo '() (+ 25 17))))
FOO
NIL
NIL
CL-USER 11 > (foo)
42
Run Code Online (Sandbox Code Playgroud)
真的编译了吗?
CL-USER 11 > (disassemble 'foo)
424000EA3C:
0: 49396275 cmpq [r10+75], rsp
4: 7720 ja L1
6: 4883F900 cmpq rcx, 0
10: 751A jne L1
12: 4157 push r15
14: 55 push rbp
15: 4889E5 moveq rbp, rsp
18: 4989DF moveq r15, rbx
21: BF50010000 move edi, 150
26: B901000000 move ecx, 1
31: 4889EC moveq rsp, rbp
34: 5D pop rbp
35: 415F pop r15
37: C3 ret
L1: 38: 41FFA6E7020000 jmp [r14+2E7] ; SYSTEM::*%WRONG-NUMBER-OF-ARGUMENTS-STUB
45: 90 nop
46: 90 nop
47: 90 nop
48: 90 nop
49: 90 nop
50: 90 nop
51: 90 nop
Run Code Online (Sandbox Code Playgroud)
似乎如此...