可读地打印lisp功能

Ope*_*uce 8 lisp common-lisp

我正在尝试使用lisp,并在http://www.gigamonkeys.com/book/上阅读Practical Common Lisp一书.

是否有一个命令可以打印以前在REPL中定义的函数,以后可以读取?我试过了

(print #'function-name)
Run Code Online (Sandbox Code Playgroud)

但是这会导致封闭的输出#<>无法读回(如果*print-readably*设置为TI则只会出错).我使用princprin1取代相同的结果print.

我有点惊讶这不容易找到.我在lisp上阅读的一些内容鼓励在REPL中进行实验,但如果在输入后无法保存函数,则在进入它们之前,您必须将它们写在单独的文件中,这部分失败了关键点.

Rai*_*wig 12

无法读回函数对象.

1)您可以使用DRIBBLE功能,这会将REPL输入保存到文件中.

2)从编辑器到REPL的评估很常见.您不需要键入REPL,您可以键入编辑器文本缓冲区并将表达式从那里发送到REPL.

3)Common Lisp具有FUNCTION-LAMBDA-EXPRESSION,在某些情况下可能能够恢复源代码(或Lisp系统记录为源代码):

CL-USER 200 > (defun foo (a) (+ a b))
FOO

CL-USER 201 > (function-lambda-expression #'foo)
(LAMBDA (A) (DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 41C00751D3>))
  (DECLARE (LAMBDA-NAME FOO))
  (+ A B))
NIL
FOO
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释!但请注意,`function-lambda-expression`需要一个函数,而不是一个符号.所以``(function-lambda-expression#'foo)`保证为你提供`foo`的lambda表达式(如果可用的话).对于某些实现,可以使用符号调用`function-lambda-expression`,但对于其他实现,它可能无效.例如,在CMUCL和SBCL中,它确实需要一个功能. (3认同)