gpt4 book ai didi

functional-programming - LISP 中的变量和符号有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:28 25 4
gpt4 key购买 nike

在范围方面?在内存中的实际实现?语法?例如,if (let a 1) 'a' 是变量还是符号?

最佳答案

Jörg 的回答指出了正确的方向。让我补充一点。

我将讨论类似于 Common Lisp 的 Lisp。

作为数据结构的符号

符号是 Lisp 中真正的数据结构。您可以创建符号,可以使用符号,可以存储符号,可以传递符号,符号可以是更大数据结构的一部分,例如符号列表。一个符号有一个名字,可以有一个值,也可以有一个函数值。

因此您可以获取一个符号并设置它的值。

(setf (symbol-value 'foo) 42)

通常一个人会写(setq foo 42) , 或 (set 'foo 42)(setf foo 42) .

代码中表示变量的符号

但是!

(defun foo (a)
(setq a 42))

(let ((a 10))
(setq a 42))

源代码中上面的两种形式都有符号和a写得像一个符号并使用函数 READ阅读该来源返回一个符号 a在一些列表中。但是 setq操作未设置 a 的符号值至 42 .这里是LETDEFUN引入一个变量 a我们用符号书写。因此 SETQ然后操作将变量值设置为 42 .

词汇绑定(bind)

所以,如果我们看一下:

(defvar foo nil)

(defun bar (baz)
(setq foo 3)
(setq baz 3))

我们引入一个全局变量FOO .

在酒吧第一SETQ设置全局变量的符号值 FOO .第二个SETQ设置局部变量 BAZ3 .在这两种情况下,我们使用相同的 SETQ我们把变量写成一个符号,但在第一种情况下是 FOO捐赠一个全局变量,并将这些值存储在符号值中。在第二种情况下 BAZ表示局部变量以及如何存储值,我们不知道。我们所能做的就是访问变量以获取其值。在 Common Lisp 中,无法使用符号 BAZ。并获取局部变量值。我们无法使用符号访问局部变量绑定(bind)及其值。这是 Common Lisp 中局部变量的词法绑定(bind)工作方式的一部分。

例如,这导致观察到,在没有记录调试信息的编译代码中,符号 BAZ离开了。它可以是处理器中的寄存器或以其他方式实现。符号FOO仍然存在,因为我们将它用作全局变量。

符号的各种用途

符号是一种数据类型,是 Lisp 中的一种数据结构。

变量是概念上的东西。全局变量基于符号。不是局部词法变量。

在源代码中,我们使用符号为函数、类和变量编写各种名称。

有一些概念上的重叠:

(defun foo (bar) (setq bar 'baz))

在上面的源代码中,defun , foo , bar , setqbaz都是符号。

DEFUN是提供宏的符号。 FOO是提供功能的符号。 SETQ是提供特殊运算符的符号。 BAZ是用作数据的符号。因此 BAZ 之前的引用. BAR是一个变量。在编译代码中不再需要它的符号。

关于functional-programming - LISP 中的变量和符号有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3590221/

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