5

基本上我会说你必须使用(typep var 'string-type),但据我所知,没有像 string 这样的类型。

通过 type-of 结果确定类型

(type-of "rowrowrowyourboat")
> (SIMPLE-ARRAY CHARACTER (17))

这是一种我可以以通用方式寻找的类型,因为寻找SIMPLE-ARRAY不会有任何好处:

(typep "rowrowrowyourboat" 'simple-array)
> t

(typep (make-array 1) 'simple-array)
> t

并且使用直观的方法来动态确定示例字符串的类型也没有任何好处,因为它们的长度不会相同(大多数情况下)

(typep "rowrowrowyourboat" (type-of "string"))
> nil

所以我想知道检查给定变量是否为字符串类型的规范方法是什么?

4

2 回答 2

9

大多数类型在 CL 中都有一个谓词,即使字符串是一个字符序列,它也存在一个函数 stringp,它完全符合您的要求。

(stringp "getlydownthestream") ; ==> T

它在文档中说这与写作相同

(typep "ifyouseeacrocodile" 'string) ; ==> T
于 2013-09-01T15:31:56.263 回答
4

你的问题有几个误解。通常在 Lisp 中,变量没有类型。

重复:Lisp 中的变量没有类型

您可以询问某个 Lisp 值是否属于某种类型或它具有什么类型。Lisp 对象具有附加的类型。

Common Lisp 没有“字符串”类型?你为什么不看文档?这很容易。

Common Lisp HyperSpec:http ://www.lispworks.com/documentation/HyperSpec/Front/index.htm

符号索引:http ://www.lispworks.com/documentation/HyperSpec/Front/X_Symbol.htm

S 的符号索引:http ://www.lispworks.com/documentation/HyperSpec/Front/X_Alph_S.htm

字符串: http ://www.lispworks.com/documentation/HyperSpec/Body/a_string.htm#string

系统类字符串:http ://www.lispworks.com/documentation/HyperSpec/Body/t_string.htm

所以 Common Lisp 有一个类型STRING

字符串字典还列出了其他字符串类型:BASE-STRING, SIMPLE-STRING, SIMPLE-BASE-STRING.

我使用的是 LispWorks,所以返回的类型看起来有点不同:

CL-USER 20 > (type-of "foo")
SIMPLE-BASE-STRING

CL-USER 21 > (typep "foo" 'string)
T

CL-USER 22 > (stringp "foo")
T

CL-USER 23 > (subtypep 'simple-base-string 'string)
T
T

CL-USER 24 > (let ((var "foo")) (typep var 'string))
T

秘密:Common Lisp 中的变量可以输入,但那是另一回事了。

于 2013-09-01T15:46:33.217 回答