如果lisp中的字符串是向量,为什么我不能使用svref访问第一个元素?

Ara*_*idi 6 lisp vector common-lisp

所以,我正在尝试学习Lisp,我在定义String是什么时遇到了一个问题.

我正在阅读Paul Graham的ANSI Common Lisp,在本书中它指出String是一个向量或一维数组.

所以,我创建一个String:

(defvar *my-string* "abc")
Run Code Online (Sandbox Code Playgroud)

然后我可以这样访问my-string的第一个值:

(aref *my-string* 0)
Run Code Online (Sandbox Code Playgroud)

但如果它是一个向量,为什么我不能这样访问该元素:

(svref *my-string* 0)
Run Code Online (Sandbox Code Playgroud)

我的意思是,当我以这种方式创建矢量时:

(defvar my-vec (make-array 4 :initial-element 1))
Run Code Online (Sandbox Code Playgroud)

我可以使用svref访问第一个元素:

(svref my-vec 0) ; returns 1
Run Code Online (Sandbox Code Playgroud)

我在String上尝试使用svref时忘了添加错误:

"值"abc"不属于类型(SIMPLE-ARRAY T(*))."

sou*_*eck 8

字符串是一个向量,但它不是一个简单的向量.svref将一个简单向量作为第一个参数.

您可以致电:

(vector-p *my-string*)
Run Code Online (Sandbox Code Playgroud)

返回true

不同于:

(simple-vector-p *my-string*)
Run Code Online (Sandbox Code Playgroud)

返回false.

请注意,它(simple-vector-p my-vec)也将返回true,这确认了make-array创建一个简单向量.


Jos*_*lor 5

soulcheck的答案绝对正确,但值得花时间熟悉HyperSpec.例如,如果你从svref的页面开始,底部有一个注释:

笔记:

svrefaref相同,只是它要求它的第一个参数是一个简单的向量.

简单向量的词汇表条目(上面链接)说:

简单的向量 Ñ.一个向量类型 简单矢量,有时被称为" 简单一般矢量 ".不是所有的向量简单的简单的矢量 -仅那些具有元素类型 .

15.2数组字典在这里也很有帮助,就像15个数组一样.