You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ClozureCL中,如何用(type-of)得到(SIMPLE-ARRAY ARRAY (5 3 *))类型?

问题分析与解决方案

首先得明确Common Lisp类型系统里的一个核心区别:你目标中的'(SIMPLE-ARRAY ARRAY (5 3 *))是一个类型描述符(type specifier),它用来匹配一类数组——所有简单数组、元素类型为ARRAY、前两个维度固定为5和3、第三个维度可以是任意正整数。但type-of函数返回的是对象的具体实际类型,对于数组来说,维度都是确定的整数,永远不会包含通配符*,因为每个数组的维度都是明确固定的。

所以,不存在任何值val能让(type-of val)直接等于'(SIMPLE-ARRAY ARRAY (5 3 *))——这是两者语义上的本质差异,前者是具体对象的精确类型,后者是用来匹配多类类型的通配符式描述。

不过看你当前的尝试,你之前的val类型是(SIMPLE-ARRAY T (5 3 33)),问题出在两个地方:

  • 元素类型是默认的T,而非需求中的ARRAY
  • 你混淆了“类型符合描述符”和“type-of结果等于描述符”这两个概念

要创建一个符合(SIMPLE-ARRAY ARRAY (5 3 *))描述的数组,你可以这样写:

;; 创建简单数组,指定元素类型为ARRAY,前两个维度5、3,第三个维度选任意正整数即可(比如42)
(setf val (make-array '(5 3 42) :element-type 'array :initial-element #(1 2 3)))

这时候(type-of val)会返回(SIMPLE-ARRAY ARRAY (5 3 42)),虽然它不等于你要的通配符描述,但这个val完全满足(typep val '(SIMPLE-ARRAY ARRAY (5 3 *)))的检查——这才是类型描述符的正确用法:用来判断对象是否属于某一类类型,而非和type-of的结果直接相等。

如果你的测试必须要求x严格等于'(SIMPLE-ARRAY ARRAY (5 3 *)),那确实无法通过(type-of val)实现,因为type-of永远返回具体类型。这种情况下,你可能需要重新理解测试的意图,或者调整断言逻辑,从检查x是否等于该描述符,改为检查val是否符合该描述符。

内容的提问来源于stack exchange,提问作者Sage Gerard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:11