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

标签 vector lisp common-lisp

所以,我正在尝试学习 Lisp,但在定义字符串是什么时遇到了一个问题。

我正在阅读 Paul Graham 的 ANSI Common Lisp,在这本书中它指出字符串是向量或一维数组。

所以,我创建了一个字符串:

(defvar *my-string* "abc")

然后我可以通过这种方式访问​​ my-string 的第一个值:

(aref *my-string* 0)

但如果它是一个向量,为什么我不能以这种方式访问​​该元素:

(svref *my-string* 0)

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

(defvar my-vec (make-array 4 :initial-element 1))

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

(svref my-vec 0) ; returns 1

当我在 String 上尝试 svref 时忘记添加错误:

“值“abc”不是 (SIMPLE-ARRAY T (*)) 类型。”

最佳答案

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

您可以通过调用来查看:

(vector-p *my-string*)

返回真

不同于:

(simple-vector-p *my-string*)

返回 false。

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

关于vector - 如果 lisp 中的字符串是向量,为什么我不能使用 svref 访问第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164417/

相关文章:

loops - Common Lisp 循环

c++ - 如何在不导致内存错误的情况下从 vector 中删除对象指针?

c# - 在 C# 中使用 Lisp

c++ - 复制后的 std::vector 容量

functional-programming - Racket - 构建内置成员函数

error-handling - 如何访问:cause, :via and :trace keys of an exception in Clojure?

function - "+"如何在 Common Lisp 中使用特殊运算符/表单实现

tree - 树中的 Lisp 成员节点

c++ - 将 txt 文件中每一行的 4 个值存储到一个对象中 - C++

c++ - 在 C++ 中使用 vector vector (二维 vector )的邻接表表示