如何检查给定变量值是否为string类型

时间:2013-09-01 14:48:55

标签: string types common-lisp sbcl

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

通过

中的结果类型确定类型
(type-of "rowrowrowyourboat")
> (SIMPLE-ARRAY CHARACTER (17))

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

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

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

使用直观的动态确定示例字符串类型的hack也没有任何好处,因为它们的长度不一样(大部分时间)

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

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

2 个答案:

答案 0 :(得分:8)

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

(stringp "getlydownthestream") ; ==> T

它在文档中说与编写

相同
(typep "ifyouseeacrocodile" 'string) ; ==> T

答案 1 :(得分:4)

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

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

您可以询问某些Lisp值是某种类型还是具有哪种类型。 Lisp对象附加了类型。

Common Lisp没有类型'string'?你为什么不查看文档?这很容易。

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

STRING:http://www.lispworks.com/documentation/HyperSpec/Body/a_string.htm#string

系统类STRING:http://www.lispworks.com/documentation/HyperSpec/Body/t_string.htm

所以Common Lisp的类型为STRING

Strings Dictionary还列出了其他字符串类型:BASE-STRINGSIMPLE-STRINGSIMPLE-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中的变量可以输入,但这是另一个故事。