LISP中的动态构建功能

Hen*_*nes -1 lisp metaprogramming common-lisp

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

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

我现在需要的是一个例子,如何以编程方式创建这样的列表以及如何使用它.目前我完全陷入困境.

任何参考或例子都受到热烈欢迎.

Rai*_*wig 6

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)

似乎如此...