【问题标题】:Extendable Vector Type可扩展向量类型
【发布时间】:2017-06-05 21:15:49
【问题描述】:

如何正确指定可扩展向量的 common-lisp 类型(即,vector-push-extend 可接受),以便可以复制它。例如,如果一个向量定义为:

(defparameter v (make-array 2
                            :initial-contents '((a (b)) (c (d) e))
                            :adjustable t
                            :fill-pointer t))

我复制它的简单(不正确)方法是:

(map 'array #'copy-tree v)

但这会在 sbcl 中产生类型错误。一个适当的序列类型规范可以做到这一点吗?

【问题讨论】:

    标签: vector common-lisp adjustable-array


    【解决方案1】:

    简单复制

    你可以这样做:

    (map (type-of v) #'copy-tree v)
    

    什么类型?

    CL-USER> (type-of v)
    (VECTOR T 2)
    

    以下内容就足够了:

    (map 'vector #'copy-tree v)
    

    This graph 有助于记住类型层次结构,尤其是数组和向量。

    可调,填充指针,...

    但是,生成的向量是不可调整的。也许这样的事情会有所帮助:

    (defun my-copy (vector)
      (map-into (make-array (array-dimensions vector)
                            :adjustable (adjustable-array-p vector)
                            :fill-pointer (fill-pointer vector))
                #'copy-tree
                vector))
    

    【讨论】:

    • 我的下一个 goto 是循环宏,但 map-into 很好地分块。也感谢类型层次结构参考。
    【解决方案2】:

    MAP 结果类型需要一个序列类型说明符ARRAY 不是一个。 SEQUENCE 的子类型示例为 VECTORLIST

    VECTOR 的类型声明语法为:vector [{element-type | *} [{size | *}]]

    没有办法在向量类型声明中指定可调整填充指针位移等特征。相应的功能选项也没有作为函数make-sequence 的关键字提供。 copy-seq 也不会创建具有此类特征的向量。要创建此类向量,您必须使用 MAKE-ARRAY

    因此选项是:

    • 也许向量类型就足够了
    • 对于具有特殊功能的向量,通过MAKE-ARRAY 创建它们并使用MAP-INTO 等函数 -> 请参阅coredump 的出色答案。

    【讨论】:

      猜你喜欢
      • 2022-09-24
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      相关资源
      最近更新 更多