Common lisp 演化lisp图像
我喜欢基于图像的语言,最近我一直在通过sbcl玩弄CommonLisp。我在一些地方读到过关于如何通过保存和加载虚拟机的映像,发展一个或一组运行在该映像上的应用程序 我知道如何将代码加载到图像中并使其运行,slime使这类事情变得非常好,但我的问题是:如何知道图像中定义了哪些函数?假设我想在函数运行几天或几个月后对其进行更新,但我记不起它的名称。是否有任何方法可以获取代码,甚至只是图像中定义的函数的名称Common lisp 演化lisp图像,common-lisp,sbcl,Common Lisp,Sbcl,我喜欢基于图像的语言,最近我一直在通过sbcl玩弄CommonLisp。我在一些地方读到过关于如何通过保存和加载虚拟机的映像,发展一个或一组运行在该映像上的应用程序 我知道如何将代码加载到图像中并使其运行,slime使这类事情变得非常好,但我的问题是:如何知道图像中定义了哪些函数?假设我想在函数运行几天或几个月后对其进行更新,但我记不起它的名称。是否有任何方法可以获取代码,甚至只是图像中定义的函数的名称 现在,我确实将代码写到源代码中,并通过repl加载,因此我在那里有一个副本,但这似乎是一个明
现在,我确实将代码写到源代码中,并通过repl加载,因此我在那里有一个副本,但这似乎是一个明显的特性。Common Lisp有包的想法。包是一种符号注册表,用作符号的名称空间。您可以要求CommonLisp提供所有包的列表
CL-USER 1 > (list-all-packages)
(#<The SQL-COMMON package, 0/4 internal, 28/32 external>
#<The LOOP package, 245/256 internal, 3/4 external>
#<The COMM package, 0/4 internal, 940/1024 external>
#<The REG package, 41/64 internal, 0/4 external>
...)
为了方便起见,Common Lisp提供了APROPOS和APROPOS-LIST函数
CL-USER 3 > (apropos "MAKE-LOCK")
MP::INTERNAL-MAKE-LOCK (defined)
MP:MAKE-LOCK (defined)
WWW-UTILS:MAKE-LOCK (defined)
MAKE-LOCK
RESOURCES::MAKE-LOCK (defined)
MINIPROC:MAKE-LOCK (defined)
函数、类等使用符号作为其标识符。你也可以问一个符号,它表示什么功能
CL-USER 4 > (symbol-function 'www-utils:make-lock)
#<Function WWW-UTILS:MAKE-LOCK 41E006A69C>
这将调用编辑器(内部或外部),并应打开该函数的源代码。为了实现这一点,CommonLisp需要跟踪每个函数的源位置。接下来,编辑器需要访问该源代码。有时记录的位置是绝对路径/Users/joswig/lisp/utils.lisp。如果编辑器想要打开该文件,则应该可以访问该文件。但也可以使用逻辑路径名,如http:server;utils.lisp。然后将其转换为真实的物理路径名。稍后可以配置此转换。因此,可以将Lisp移动到具有不同路径名的不同机器上,配置逻辑路径名HTTP,然后Lisp仍然可以找到所有源代码,即使它位于具有不同文件系统结构的不同机器上。因此,要使其工作,可能需要一些配置。但是它是一个非常有用的特性,并且被广泛使用
源代码的记录方式和源位置的记录方式取决于实现,并且是相应Lisp及其开发环境的一个功能。更好的Lisp实现在这方面有很多功能。如果您愿意,还可以使用do符号或do外部符号: 例如:
>> (do-external-symbols (s (find-package :foo-package)) (print s))
FOO-PACKAGE:XXX
FOO-PACKAGE:YYY
FOO-PACKAGE:ZZZ
NIL
其中XXX、YYY和ZZZ是包中的所有外部符号:foo包
CL-USER 5 > (defun foo (a) (* (sin a) a))
FOO
CL-USER 6 > (pprint (function-lambda-expression 'foo))
(LAMBDA (A)
(DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 41403151C3>))
(DECLARE (LAMBDA-NAME FOO))
(* (SIN A) A))
CL-USER 7 > (ed 'www-utils:make-lock)
>> (do-external-symbols (s (find-package :foo-package)) (print s))
FOO-PACKAGE:XXX
FOO-PACKAGE:YYY
FOO-PACKAGE:ZZZ
NIL