代码之家  ›  专栏  ›  技术社区  ›  Hennes

LISP中动态构建的函数

  •  -1
  • Hennes  · 技术社区  · 10 年前

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

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

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

    欢迎任何参考或范例。

    2 回复  |  直到 10 年前
        1
  •  6
  •   Rainer Joswig mmmmmm    10 年前

    Lisp代码是数据:列表、符号、数字。。。

    (defun foo () 42)
    

    Lisp具有以下功能 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
    

    它真的是编译的吗?

    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
    

    看起来。。。

        2
  •  3
  •   jkiiski    10 年前

    正如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
    

    这构成了 lambda 表达式使用 backquote 语法,但您可以使用常规的列表操作来构建它( push , cons 等等)。