Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 演化lisp图像_Common Lisp_Sbcl - Fatal编程技术网

Common lisp 演化lisp图像

Common lisp 演化lisp图像,common-lisp,sbcl,Common Lisp,Sbcl,我喜欢基于图像的语言,最近我一直在通过sbcl玩弄CommonLisp。我在一些地方读到过关于如何通过保存和加载虚拟机的映像,发展一个或一组运行在该映像上的应用程序 我知道如何将代码加载到图像中并使其运行,slime使这类事情变得非常好,但我的问题是:如何知道图像中定义了哪些函数?假设我想在函数运行几天或几个月后对其进行更新,但我记不起它的名称。是否有任何方法可以获取代码,甚至只是图像中定义的函数的名称 现在,我确实将代码写到源代码中,并通过repl加载,因此我在那里有一个副本,但这似乎是一个明

我喜欢基于图像的语言,最近我一直在通过sbcl玩弄CommonLisp。我在一些地方读到过关于如何通过保存和加载虚拟机的映像,发展一个或一组运行在该映像上的应用程序

我知道如何将代码加载到图像中并使其运行,slime使这类事情变得非常好,但我的问题是:如何知道图像中定义了哪些函数?假设我想在函数运行几天或几个月后对其进行更新,但我记不起它的名称。是否有任何方法可以获取代码,甚至只是图像中定义的函数的名称


现在,我确实将代码写到源代码中,并通过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