【问题标题】:How to set an element in a multi-dimensional array in elisp如何在elisp中设置多维数组中的元素
【发布时间】:2017-03-05 02:21:17
【问题描述】:

我正在与使用 elisp 的人合作,我们一直在努力使用多维数组。

问题在于,如果我们尝试使用设置值

(setf (elt (elt m-array 0) 0) 5))

我们最终会得到这样的东西

[[0 0 0 5] [0 0 0 5] [0 0 0 5] [0 0 0 5]]

这不是我们想要的。现在 Common Lisp 有我们需要的支持来解决这个问题。不幸的是,我们只能使用 elisp。我的问题是,鉴于我们只有 elisp,我们如何才能解决这个问题,以便我们只在向量中设置一个向量。

喜欢:

[[0 0 0 5] [0 0 0 0] [0 0 0 0] [0 0 0 0]]

【问题讨论】:

    标签: vector lisp elisp


    【解决方案1】:

    虽然 Common Lisp 有 multidimensional arrays,但 Emacs Lisp 只有 vectors(一维数组)。

    您正在尝试使用向量的向量在 ELisp 中模拟多维数组(这确实是一个相当标准的技巧),但您需要小心避免“混叠” - 即,您需要确保您的嵌套数组不是相同的对象。

    你的问题表明

    (eq (aref m-array 0) (aref m-array 1))
    ==> t
    

    因为您可能像这样创建了您的m-array

    (setq m-array (make-vector 5 (make-vector 5)))
    

    你需要像这样创建你的m-array

    (setq m-array (make-vector 5 nil))
    (dotimes (i 5)
      (setf (aref m-array i) (make-vector 5 0)))
    

    【讨论】:

    • 你完全正确。我确实使用了make-vector。这现在更有意义了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2021-12-29
    • 2014-04-17
    • 2014-03-10
    • 2013-11-08
    • 2014-12-17
    相关资源
    最近更新 更多