为什么我在 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)) ..
相反。
我一直在玩 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)) ..
相反。