为什么我在 Elisp 中索引列表时遇到问题?

Why am I having issues indexing a list in Elisp?

我一直在玩 ELisp,我的代码中又出现了一个奇怪的错误

我得到的错误是:

  Debugger entered--Lisp error: (error "Bad bounding indices: 2, 3")
  signal(error ("Bad bounding indices: 2, 3"))
  error("%s" "Bad bounding indices: 2, 3")
  subseq((quote (2 2 2 2)) 2 3)
  (matrix-from-values 1 number-of-columns-on-output (subseq (nth 2 matrix) (+ (* row-index number-of-columns-on-input) start-column) (+ (* row-index number-of-columns-on-input) end-column)))
  (let ((number-of-columns-on-input (nth 1 matrix)) (number-of-columns-on-output (- end-column start-column)) (row-index (- row 1))) (matrix-from-values 1 number-of-columns-on-output (subseq (nth 2 matrix) (+ (* row-index number-of-columns-on-input) start-column) (+ (* row-index number-of-columns-on-input) end-column))))
  matrix-extract-subrow((2 2 (quote (2 2 2 2))) 1 2 3)
  [..more stuff..]

可能我没有正确读取错误,但据我了解,解释器从内到外评估我的函数(“(矩阵..[blah-blah]”东西)并绊倒:

  subseq((quote (2 2 2 2)) 2 3)

但是如果我进入 *scratch* 缓冲区并且 运行:

(subseq (quote (2 2 2 2)) 2 3)

运行还好

我认为你在某处引用了额外的一层。如果我评估

,我可以重现你的错误
(subseq (quote (quote (2 2 2 2))) 2 3)

没有看到你是 运行 的实际 elisp 代码,以及当它出错时你是如何调用它的,很难说得更具体。

您混淆了表达式。在源代码中您编写表达式,而在上面的调试器输出中您看到的是值。 eval 取一个表达式和 returns 相应的值,而 quote 可以用来取一个值并将其转换回一个(平凡的)表达式,该表达式只是 returns 该值.

因此,当您看到 subseq((quote (2 2 2 2)) 2 3) 时,这意味着 subseq 被调用时使用了一个值 (quote (2 2 2 2)),例如,您可以通过计算 (quote (quote (2 2 2 2))).[= 这样的表达式来获得该值19=]

您剥离了其余的回溯,但查看

matrix-extract-subrow((2 2 (quote (2 2 2 2))) 1 2 3)

好像你有类似的地方

... '(2 2 '(2 2 2 2)) ...

应该是

... '(2 2 (2 2 2 2)) ..

相反。