可读地打印lisp函数

可读地打印lisp函数,lisp,common-lisp,Lisp,Common Lisp,我正在试用lisp,并正在学习《实用通用lisp》 是否有一个命令可以打印以前在REPL中定义的函数,以便以后读取?我试过了 (print #'function-name) 但这会导致包含在#中的输出无法读回(如果*可读取打印*设置为t,我只会得到一个错误)。我使用princ或prin1而不是print得到相同的结果 我有点惊讶这不容易找到。我在lisp上读到的一些内容鼓励在REPL上进行实验,但是如果在输入函数后无法保存它们,则必须在输入它们之前将它们写入单独的文件中,这在一定程度上违背了这

我正在试用lisp,并正在学习《实用通用lisp》

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

(print #'function-name)
但这会导致包含在
#
中的输出无法读回(如果
*可读取打印
*
设置为
t
,我只会得到一个错误)。我使用
princ
prin1
而不是
print
得到相同的结果


我有点惊讶这不容易找到。我在lisp上读到的一些内容鼓励在REPL上进行实验,但是如果在输入函数后无法保存它们,则必须在输入它们之前将它们写入单独的文件中,这在一定程度上违背了这一点。

函数是编译的,它们的源代码永远不会存储。我建议您使用Emacs+Slime,在那里浏览您的历史记录很容易。

简而言之,没有,但是,相反很容易-使用Emacs&Slime将它们写入文件并发送到repl非常容易

默认情况下,iirc
C-xe
计算repl中紧靠点(emacs光标)之前的表单

这为您提供了两个方面的最佳效果—文件的一致性和repl的交互性


祝你的口齿不清之旅好运

无法读回函数对象

1) 您可以使用函数DRIBBLE,它会将REPL输入保存到文件中

2) 从编辑器到REPL的求值是常见的。您不需要向REPL键入,您可以在编辑器文本缓冲区中键入,然后将表达式从那里发送到REPL

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

CL-USER 200>(defun foo(a)(+ab))
福
CL-USER 201>(函数lambda表达式#'foo)
(LAMBDA(A)(声明(系统::源代码级#))
(声明(LAMBDA-NAME FOO))
(+A B))
无
福

我建议您使用emacs。加载漂亮的打印机功能。包装为(引用pp)。这是一台漂亮的打印机。Slime还可以漂亮地打印功能(如果我没记错的话),但是带有emacs的软件包很不错

(第页)

我写了一个format语句,用于打印匿名(或命名)函数,但代码在另一台机器上。如果你感兴趣,请告诉我,我会努力找到它

[……]

是的,您可以在以后查找并打印在REPL中键入的函数,只需检查命名空间中的函数名。将名称空间视为哈希表。如果函数 已被实习,则应显示在命名空间中。我认为有一种方法 比如,映射名称空间

lisp的一些实现要求您设置一个变量,以保持函数代码附加到函数符号;这就像调试c中的符号一样。它占用空间 但是调试自动生成的函数是一件棘手的事情,需要在一些宏1扩展中进行调试

尝试使用命令。。。我画的是空白。已经有一段时间了。通常最大的问题是修复未命名的函数(lambda表达式)。一些实现还实现了“命名匿名函数”或类似的功能

<是否有一个命令可以打印以前在REPL上定义的函数,打印方式<以后可以读取

一个非常好的问题。是的,你可以。它可能像写fasl流之类的东西一样简单
有点复杂。

谢谢,我还没有下载slime,但我会看一看。确实如此,它的强大功能是一个很好的解释的100倍!但请注意,
函数lambda表达式
需要函数,而不是符号。因此
(函数lambda expression#'foo)
保证为您提供
foo的lambda表达式(如果可用)。对于某些实现,可以使用符号调用
函数lambda expression
,但对于其他实现,可能不起作用。例如,在CMUCL和SBCL中,它确实需要一个函数。
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