Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/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
Types 在common lisp中,如何定义类型之间的关系?_Types_Lisp_Common Lisp - Fatal编程技术网

Types 在common lisp中,如何定义类型之间的关系?

Types 在common lisp中,如何定义类型之间的关系?,types,lisp,common-lisp,Types,Lisp,Common Lisp,在使用Lisp时,我注意到以下几点: (subtypep 'string '(array character)) ==> NIL, T (subtypep '(array character) 'string) ==> NIL, T 当 (typep (make-string x) '(array character)) ==> T (typep (make-array x :element-type :character) 'string) ==>T 对于x的任何值

在使用Lisp时,我注意到以下几点:

(subtypep 'string '(array character)) ==> NIL, T
(subtypep '(array character) 'string) ==> NIL, T

(typep (make-string x) '(array character)) ==> T
(typep (make-array x :element-type :character) 'string) ==>T
对于x的任何值

这意味着“subsubip”表示“string”和“(array character)是两种不同的类型,而“typep”表示一种类型的任何实例也是另一种类型的实例

除非(1)不是真的-请举例-为什么会发生这种情况?我发现很难理解,因为我假设一个类型在没有实例的情况下在概念上不可能存在,也就是说,它是由实例定义的:它是具有一组特定属性的对象的类(在数学意义上)。这是正确的吗


编辑:正如正确指出的那样,
(数组字符)
不一定是
字符串的子类型
,原因很简单,因为存在多维字符数组。但是我仍然无法想象一个
字符串
的实例没有
(数组字符)

的类型。实际上,这在您的实现中是很奇怪的。(可能与某些优化有关)

例如,在SBCL中,如果您
(descripe'string)
,您将得到
字符串名称一个基本类型说明符:(undocumented)
。有趣的是,对于
基本字符串
来说是相同的,但是:

(subtypep 'base-string 'array) => T
(subtypep 'base-string '(array base-char)) => T
(subtypep 'string 'array) => T
(subtypep 'string '(array character)) => NIL
(subtypep 'string '(array base-char)) => NIL
(subtypep 'string '(array standard-char)) => NIL
(subtypep 'string '(array extended-char)) => NIL

这是一个实际问题:

ccl e$ rlwrap ./dx86cl64
Loading ~/ccl-init.lisp
Welcome to Clozure Common Lisp Version 1.7-dev-r14614M-trunk  (DarwinX8664)!
? (subtypep 'string '(array character))
T
T
? 
尝试:

在SBCL和其他实现中需要理解。(vector nil)作为字符串的子类型的要求遵循标准,即使在实现中基字符和字符是等效的。

请参见)

公共Lisp中的数组是可变的。CL中的数组是不变的,而不是试图假装它们是协变或逆变的,并添加复杂的动态检查。因此,除非它们相同,否则
(数组字符1)
(数组基字符1)
之间不存在子类型关系。程序不应该在后者中存储非基字符,并且程序可以从前者中读取非基字符


阵列升级会给新手带来进一步的困惑。请记住,虽然有些编译器使用类型声明是为了安全,但它们的主要目标是性能。类型化数组映射(升级)到一组经过特殊处理的数组元素类型。这些特殊的数组类型必须形成一个晶格(确保我们能够合理地找到最特殊的特殊类型),但仍然没有子类型关系。

Base string是(array Base char)的子类型。是什么阻止字符串成为(数组字符)的子类型?回答这个问题最好的地方可能是sbcl-devel邮件列表。这可能是一个优化或错误。
(subtypep '(vector nil) 'string)