Lisp允许您在列表中定义A和B等符号,如
(setf mylist '(+ 1 2 A))然后,您可以在任何时候返回,并将A设置为一个值,用于ex。(set 'A 100)。此时,您可以执行(eval mylist)并返回103号。然后,您可以重复地将A重新分配到任何新值。
看起来Lisp既保存了文字"A“(符号的名称),又保存了它的赋值。这允许动态变量分配/重新分配。有点像一张查表。允许这样做的底层数据结构或机制是什么?
编辑:具体来说,这是如何在内部完成的(或者是外部的,因为包看起来是直接的)?寻找一个深入的技术解决方案,重点是如何在Lisp-2中实现它。
发布于 2012-03-30 20:18:56
请注意,'(+ 12 A)不是变量,而是计算为对象的形式(引号(+ 12 A))。列表中的A是一个符号,但它不是变量。
变量是由符号表示的存储位置。
Re:像Lisp这样的语言是如何在运行时进行这种评估的?
Lisp有两种变量:动态变量和词法变量。动态变量可以在运行时进行评估,因为您可以获取一个符号并确定它是否具有动态变量绑定,并检索或分配该绑定。
词汇变量是那些在编译时被“烘焙”的变量:没有任何可移植的方法来按名称对它们进行反映。
这两种变量对于不同的目的都是有用的。
动态变量可以存储在与符号相关联的位置,称为值单元格。(这个术语实际上出现在ANSI公共Lisp中)。该符号用作检索单元格(如果有)的一种键。例如,值单元格可以是存储在哈希表中的某些cons单元格的cdr字段,其中键是符号。各种实现是可能的。
一个复杂的问题是,Lisp支持动态变量的本地重新绑定:也就是说,您可以使用let或其他绑定构造为动态变量创建本地绑定,这些绑定隐藏了任何现有的绑定。当构造退出(以任何方式:通过throw包括非本地出口等)时,隐藏绑定将被恢复。这个动态作用域必须以某种方式实现,这意味着动态变量查找不一定只是在追逐从符号到值单元格的指针。
更复杂的是,多线程Lisps的用户希望拥有动态变量的每线程绑定。
这里可能有更多的信息:http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Dynamic_scoping
发布于 2012-03-30 21:37:34
在公共项中,Lisp符号本身就是对象,能够用与它们相关联的值命名属性。在读取时创建符号(在当前包中),如下所示:
> 'a
A您可以使用(describe 'a)或(inspect 'a)检查它们(此处使用CLISP )。您可以使用(set 'a 1)设置这个symol。但您也可以在此之后调用(defun a (x) (+ 1 x))。检查符号'a现在显示它同时包含一个值和一个函数定义。这反映了Common对于变量的值和函数有单独的名称空间。符号将此额外信息存储在其属性列表中:
[19]> (symbol-value 'a)
1
[20]> (symbol-function 'a)
#<FUNCTION A (X) (DECLARE (SYSTEM::IN-DEFUN A)) (BLOCK A (+ X 1))>
[21]> (symbol-plist 'a)
(SYSTEM::DEFINITION
((DEFUN A (X) (+ X 1)) .
#(NIL NIL NIL NIL ((DECLARATION OPTIMIZE DECLARATION)))))
[44]> (setf (get 'a 'prop1) 12)
12
[45]> (symbol-plist 'a)
(PROP1 12 SYSTEM::DEFINITION
((DEFUN A (X) (+ X 1)) .
#(NIL NIL NIL NIL ((DECLARATION OPTIMIZE DECLARATION)))))另请参阅
http://www.lispworks.com/documentation/HyperSpec/Body/f_get.htm#get http://www.lispworks.com/documentation/HyperSpec/Body/f_intern.htm#intern
https://stackoverflow.com/questions/9948142
复制相似问题