gpt4 book ai didi

common-lisp - 进化 lisp 图像

转载 作者:行者123 更新时间:2023-12-04 01:10:13 26 4
gpt4 key购买 nike

我喜欢基于图像的语言的想法,最近我一直在通过 sbcl 使用 Common Lisp。我在一些地方读到了关于如何通过能够保存和加载虚拟机的镜像,您可以改进在该镜像上运行的应用程序或应用程序集。

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

现在,我确实将代码写入源代码并通过 repl 加载它,所以我在那里有一个副本,但这似乎是一个明显的功能。

最佳答案

Common Lisp 有 的想法包裹 .包是一种符号注册表,用作符号的命名空间。您可以向 Common Lisp 询问所有包的列表。

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 哪些符号包含在包中。
CL-USER 2 > (loop for symbol being
each external-symbol in (find-package "COMMON-LISP")
collect symbol)
(MAKE-ARRAY INVOKE-DEBUGGER STRING-TRIM ...)

为了更简单,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>

有时,Common Lisp 也记录了函数的定义。然后可以使用函数 FUNCTION-LAMBDA-EXPRESSION 来检索“它”。
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))

但是现在通常 Common Lisp 实现不使用记录的定义,而是记录每个 Lisp 构造的源位置。

大多数 Common Lisp 实现可以以特定于实现的方式跟踪源位置。

Common Lisp 标准定义了一个函数 ED。
CL-USER 7 > (ed 'www-utils:make-lock)

这将调用一个编辑器(内部或外部)并且应该打开该函数的源代码。为了实现这一点,Common Lisp 需要跟踪每个函数的源位置。接下来,编辑器需要访问该源。有时记录的位置是绝对路径/Users/joswig/lisp/utils.lisp 。如果编辑器想要打开该文件,它应该是可访问的。但也可以使用逻辑路径名,如 http:server;utils.lisp 。然后将其转换为真实的物理路径名。稍后可以配置此转换。因此,可以将 Lisp 移动到具有不同路径名的不同机器上,配置逻辑路径名 HTTP,然后 Lisp 仍然可以找到所有源代码,即使它位于具有不同文件系统结构的不同机器上。因此,要使其工作可能需要一些配置。但它是一个非常有用的功能,并且被广泛使用。

源代码的记录方式和源代码位置的记录方式取决于实现,并且是各自 Lisp 与其开发环境相结合的特性。 Better Lisp 实现在这方面有很多特性。

关于common-lisp - 进化 lisp 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com