首页 > 解决方案 > 从字符串向量中区分整数

问题描述

我正在尝试调度数组的类型。这是一个测试用例:

(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)

但这无济于事。似乎integerstring总是混为一谈。谁能明白为什么?

标签: common-lisp

解决方案


typecaseinteger只能区分实现上不同的类型, s 和stringsare的数组不太可能。例如,您可以通过以下方式进行测试:

(eq (upgraded-array-element-type 'integer)
    (upgraded-array-element-type 'string))

这很可能会返回t。事实上,upgraded-array-element-type这两种类型很可能是它本身t:可以存储通用的最专用数组与可以存储通用string的数组相同integer,因为这两种类型都确实要求数组的元素是通用指针.

这里的问题是,当typecase看到一个数组时,它可以调度的只是数组的实现类型,而不是其他任何东西,而且这两种类型在许多情况下是相同的,但它们在概念上并不相同。


推荐阅读