Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Variables deftype如何处理符号,为什么它与defvar/defun不同_Variables_Types_Binding_Lisp_Common Lisp - Fatal编程技术网

Variables deftype如何处理符号,为什么它与defvar/defun不同

Variables deftype如何处理符号,为什么它与defvar/defun不同,variables,types,binding,lisp,common-lisp,Variables,Types,Binding,Lisp,Common Lisp,Common Lisp中符号的单元格绑定似乎没有扩展到(deftype),是不是(deftype)将[symbol,predicate body]作为[key,value]添加到环境用于类型检查的关联映射中 我可以理解为什么类型谓词不会存储在函数单元格中,但是否有原因没有“特殊运算符”单元格或类型说明符的专用属性列表属性?存储类型信息的位置完全取决于实现。某些实现可能决定使用符号plist。另一个可能使用一些单独的表,其中符号只是键 我不会对这些细节读太多。它完全依赖于存储类型信息的实现。某些实

Common Lisp中符号的单元格绑定似乎没有扩展到(deftype),是不是(deftype)将[symbol,predicate body]作为[key,value]添加到环境用于类型检查的关联映射中


我可以理解为什么类型谓词不会存储在函数单元格中,但是否有原因没有“特殊运算符”单元格或类型说明符的专用属性列表属性?

存储类型信息的位置完全取决于实现。某些实现可能决定使用符号plist。另一个可能使用一些单独的表,其中符号只是键


我不会对这些细节读太多。

它完全依赖于存储类型信息的实现。某些实现可能决定使用符号plist。另一个可能使用一些单独的表,其中符号只是键

我不会对这些细节读太多。

类型是CL中的二级对象:没有表示标准语言中可用类型的对象:只有类型名称–类型说明符。显然,类型没有访问器。此外,CL中的类型通常根本不是用符号命名的:类型说明符可以是各种符号、类或列表

有表示某些类型的一流对象:类。类是CL中的第一类对象,类有一个访问器:。比如说

> (typep 1 'integer)
t

> (typep 1 (find-class 'integer))
但是
(find class'(integer 0))
是错误的,而
(typep 1'(integer 0))
是正确的(并且是正确的)

请注意,类不是类型:它们是类型说明符(请参阅),并且仅适用于有限范围的类型

符号是否具有特殊的“类”槽(用于
查找类
访问),或者类是否存储在某个按符号索引的表的其他位置,这取决于实现。从历史上看,后者显然是正确的,但至少有些实现现在可能有类槽

事实上,符号是否有任何插槽取决于实现:
符号值
符号函数
符号plist
符号包
符号名
c可能引用某些“符号”对象中的插槽,也可能只是引用按符号索引的表,其中符号只是插入的字符串。当然,有些人可能做一个,有些人做另一个

一个很好的例子是
符号值
:对于声明为特殊的变量
符号值
检索其当前动态值:

(let ((%x% 1))
  (declare (special %x%))
  (symbol-value '%x%))
计算结果为
1

但是有几种可能的方法可以实现这一点:在使用浅绑定的系统中,变量的绑定存储在与符号相关联的某个插槽中,并且在绑定或解除绑定符号时适当修改该插槽,旧绑定存储在某个堆栈上(请参阅)。在具有深度绑定的系统中,它不是,通过搜索绑定堆栈来检索绑定。天真的浅绑定系统在存在多线程的情况下有相当严重的问题,而天真的深绑定系统则没有。使用哪种策略完全取决于实现,当然,这意味着它完全取决于实现
符号值实际做什么,以及符号是否有“值”槽

我非常确信,所有使用多线程的实现都做了明显正确的事情:在类似

(let ((%x% 1))
  (declare (special %x%))
  (some-function ...))
然后,
%x%
符号值仅在相应线程的
某些函数的动态范围内为
1
,并且它可能具有其他值或在所有其他线程中解除绑定。在多线程真正并发运行的实现中(例如在多个内核上)这意味着
符号值
不能访问
%x%

类型的某个唯一插槽在CL中是二级对象:没有表示标准语言中可用类型的对象:只有类型名称–类型说明符。显然,类型没有访问器。此外,CL中的类型通常根本不是用符号命名的:类型说明符可以是各种符号、类或列表

有表示某些类型的一流对象:类。类是CL中的第一类对象,类有一个访问器:。比如说

> (typep 1 'integer)
t

> (typep 1 (find-class 'integer))
但是
(find class'(integer 0))
是错误的,而
(typep 1'(integer 0))
是正确的(并且是正确的)

请注意,类不是类型:它们是类型说明符(请参阅),并且仅适用于有限范围的类型

符号是否具有特殊的“类”槽(用于
查找类
访问),或者类是否存储在某个按符号索引的表的其他位置,这取决于实现。从历史上看,后者显然是正确的,但至少有些实现现在可能有类槽

事实上,符号是否有任何插槽取决于实现:
符号值
符号函数
符号plist
符号包
符号名
c可能引用某些“符号”对象中的插槽,也可能只是引用按符号索引的表,其中符号只是插入的字符串。当然,有些人可能做一个,有些人做另一个

一个很好的例子是
符号值
:对于声明为特殊的变量
符号值
检索其当前动态值:

(let ((%x% 1))
  (declare (special %x%))
  (symbol-value '%x%))
计算结果为
1

但是有几种可能的方法可以实现这一点:在使用浅绑定的系统中,变量的绑定存储在与符号相关联的某个插槽中,然后