common-lisp - 从字符串向量中区分整数
问题描述
我正在尝试调度数组的类型。这是一个测试用例:
(defun column-summary2 (column)
(typecase column
(simple-double-float-vector (format t "Column is a simple-double-float-vector~%"))
;; (simple-integer-vector (format t "Column is a simple-integer-vector~%"))
;; (simple-string-vector (format t "Column is a simple-string-vector~%"))
((simple-array string (*)) (format t "~A Column is a string-array~%" column))
((simple-array float (*)) (format t "~A is a simple-float-array~%" column))
((simple-array integer (*)) (format t "~A is a simple-float-array~%" column))
(bit-vector (make-bit-vector-summary :length (length column) :count (count 1 column))))))
对于内置类型 ,bit-vector
和我自己的simple-double-float-vector
类型,这可以按预期工作:
(deftype simple-double-float-vector (&optional (length '*))
"Simple vector of double-float elements."
`(simple-array double-float (,length)))
但对于字符串和整数失败:
LS-USER> (df::column-summary2 #("foo" "bar" "baz"))
#(foo bar baz) Column is a string-array
NIL
LS-USER> (df::column-summary2 #(1 2 3))
#(1 2 3) Column is a string-array
我尝试为这两个定义类型:
(deftype simple-integer-vector (&optional (length '*))
"Simple vector of integer elements."
`(simple-array integer (,length)))
(deftype simple-string-vector (&optional (length '*))
"Simple vector of integer elements."
`(simple-array string (,length)))
编辑:强制似乎也失败了:
CL-USER> (type-of (coerce #(4 4 1 1 2 1 4 2 2 4 4 3 3 3 4 4 4 1 2 1 1 2 2 4 2 1 2 2 4 6 8 2) '(simple-array integer (32))))
(SIMPLE-VECTOR 32)
CL-USER> (type-of (coerce #("foo" "bar" "baz") '(simple-array string (3))))
(SIMPLE-VECTOR 3)
但这无济于事。似乎integer
和string
总是混为一谈。谁能明白为什么?
解决方案
typecase
integer
只能区分实现上不同的类型, s 和strings
are的数组不太可能。例如,您可以通过以下方式进行测试:
(eq (upgraded-array-element-type 'integer)
(upgraded-array-element-type 'string))
这很可能会返回t
。事实上,upgraded-array-element-type
这两种类型很可能是它本身t
:可以存储通用的最专用数组与可以存储通用string
的数组相同integer
,因为这两种类型都确实要求数组的元素是通用指针.
这里的问题是,当typecase
看到一个数组时,它可以调度的只是数组的实现类型,而不是其他任何东西,而且这两种类型在许多情况下是相同的,但它们在概念上并不相同。
推荐阅读
- vhdl - UART 在 VHDL 中接收数据
- javascript - 为什么 JavaScript 中优先级较低的运算符首先被执行?
- php - PHP 非阻塞 http 请求
- scala - 在 Scala 中,理解的产出是如何工作的?
- macos - 有关更多详细信息,请参阅:'go help gopath'
- swift - 未找到“FBSDKCoreKit/FBSDKAppLink.h”文件
- php - Laravel 将输入作为具有不同键的数组发布未验证
- java - 如何防止单击 NonScrollableViewPager 中的其他选项卡?
- ionic3 - 我在移动应用程序中使用 ionic3 和 angular4,我对 ion-datetime 有疑问,我的要求是仅显示当前日期和未来 15 天
- ios - UICollectionView 拖放移除半透明单元格