gpt4 book ai didi

common-lisp - (LET ((x ...)) 中的 X 是一个完整的符号吗?

转载 作者:行者123 更新时间:2023-12-02 17:58:37 25 4
gpt4 key购买 nike

或者换句话说:CL 中的变量是否有可能不是符号(的一部分)?

我想我可能对 CL 中的变量有一个深刻的误解。

我一直认为 CL 没有变量,只有符号,而符号(除其他属性外)有名称和值单元格(即变量)。
当有人说“变量x的值为42”时,我认为它是“名为x的符号的值单元格”的缩写> 存储值 42"

但这可能是错误的。

当我输入时

> (let ((a 42))
(type-of 'a))
SYMBOL
; caught STYLE-WARNING:
; The variable A is defined but never used.

本例中的词法变量 a 是一个完整的符号,其值单元格已设置为 42?

因为警告变量A已定义但从未使用暗示了其他情况,并且词法变量似乎与以下形式的符号a不同('a 类型)

最佳答案

Common Lisp 有两种数据类型,它们对于求值具有特殊含义:

  • cons cells/列表 -> 用于 Lisp 源代码,列表是 Lisp 形式
  • 符号 -> 用作各种目的的名称

如果你想在 Lisp 代码中使用它们作为数据,那么你必须引用它们。

两者都在 Lisp 源代码中使用,但是一旦编译代码,它们可能会消失。

变量在源代码中被写为符号。但在编译后的代码中,当它们是词法变量时,它们可能会消失。

使用 SBCL 的示例:

一个文件

(defun test (foo)
(+ foo foo))

现在我们做:

CL-USER> (proclaim '(optimize (debug 0)))  ; the compiler saves no debug info
; No value
CL-USER> (compile-file "/tmp/test.lisp")
; compiling file "/private/tmp/test.lisp" (written 23 MAY 2017 09:06:51 PM):
; compiling (DEFUN TEST ...)

; /tmp/test.fasl written
; compilation finished in 0:00:00.013
#P"/private/tmp/test.fasl"
NIL
NIL
CL-USER> (find-symbol "FOO")
FOO
:INTERNAL

编译器已读取源代码并创建编译后的 FASL 文件。我们看到符号 FOO 现在位于当前包中。 FOO 在我们的源代码中命名变量。

现在退出 SBCL 并重新启动它。

让我们加载机器代码:

CL-USER> (load "/tmp/test")
T
CL-USER> (find-symbol "FOO")
NIL
NIL

不再有符号FOO了。也不可能使用符号 FOO 检索变量 FOO 的词法值。不存在从符号到词汇值的映射(如某种显式词汇环境)。

关于common-lisp - (LET ((x ...)) 中的 X 是一个完整的符号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44141715/

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