Emacs 中的 SLIME 和 CCL 迷你缓冲区文档
SLIME and CCL minibuffer documentation in Emacs
在使用 Emacs、SLIME 和 Clozure CL 时,我有一个小问题:
aref
的函数签名(我还没有看到任何其他实例)仅显示为 (aref a)
.
当我查看源代码时,有问题的代码以 (defun aref (a &lexpr subs)
开头。据我所知,&lexpr
不是有效的 CL lambda 列表关键字。所以这表明由于 "weird" 关键字,SLIME 没有显示正确的函数签名。
但是当我对 svref
做同样的事情时,比如说,没有任何东西(至少对我而言)可以证实上述假设。所以也许 SLIME 也做了一些事情。
任何人都可以指出相关文档(我没有在 SLIME 手册和 CCL 手册中找到任何相关内容)或者任何人有 workaround/solution 吗?
SVREF
不采用数组索引列表,因为它的第一个参数是一个向量。一个数组可能是多维的,这就解释了为什么有可变数量的下标。对于 AREF
,可能的来源是:
.../ccl/level-0/l0-array.lisp
#'AREF
.../ccl/compiler/optimizers.lisp
(COMPILER-MACRO AREF)
.../ccl/compiler/nx1.lisp
#'CCL::NX1-AREF
其中,只有第一个在其参数列表中包含不常见的 &lexpr
关键字。
一个实验:
CL-USER> (defun foobar (a &lexpr b) (list a b))
;Compiler warnings :
; In FOOBAR: Unused lexical variable &LEXPR
FOOBAR
让我们使用 CCL 中未导出的符号(自动完成找到它):
CL-USER> (defun foobar (a ccl::&lexpr b) (list a b))
FOOBAR
这次成功了,试试看吧:
CL-USER> (foobar 0 1 2 3 4)
(0 17563471524599)
Lisp 的进化 说(强调我的):
MacLisp introduced the LEXPR , which is a type of function that takes
any number of arguments and puts them on the stack;
(参见 https://www.dreamsongs.com/Files/Hopl2.pdf)
通过替换修复
您可以在 Swank 级别修复它,方法是将 &lexpr
替换为 &rest
。您只需要修补 ccl.lisp
,它为 Clozure 提供 arglist
的实现:
(defimplementation arglist (fname)
(multiple-value-bind (arglist binding) (let ((*break-on-signals* nil))
(ccl:arglist fname))
(if binding
(substitute '&rest 'ccl::&lexpr arglist)
:not-available)))
更多详情
事实上,在swank-arglists.lisp
中你可以看到未知的东西放在一个单独的列表中,称为:unknown-junk
。要查看实际效果,请执行以下操作:
CL-USER> (trace swank::decoded-arglist-to-string)
NIL
然后,写入 (aref
并按 Space,这将触发对参数列表的查询并产生以下跟踪:
0> Calling (SWANK::DECODED-ARGLIST-TO-STRING #S(SWANK/BACKEND:ARGLIST :PROVIDED-ARGS NIL :REQUIRED-ARGS (CCL::A) :OPTIONAL-ARGS NIL :KEY-P NIL :KEYWORD-ARGS NIL :REST NIL :BODY-P NIL :ALLOW-OTHER-KEYS-P NIL :AUX-ARGS NIL :ANY-P NIL :ANY-ARGS NIL :KNOWN-JUNK NIL :UNKNOWN-JUNK (CCL::&LEXPR CCL::SUBS)) :PRINT-RIGHT-MARGIN 159 :OPERATOR AREF :HIGHLIGHT (0))
<0 SWANK::DECODED-ARGLIST-TO-STRING returned "(aref ===> a <===)"
注意 :UNKNOWN-JUNK (CCL::&LEXPR CCL::SUBS))
部分。
也许更好的解决办法是让 Swank 了解 &lexpr
?
在使用 Emacs、SLIME 和 Clozure CL 时,我有一个小问题:
aref
的函数签名(我还没有看到任何其他实例)仅显示为 (aref a)
.
当我查看源代码时,有问题的代码以 (defun aref (a &lexpr subs)
开头。据我所知,&lexpr
不是有效的 CL lambda 列表关键字。所以这表明由于 "weird" 关键字,SLIME 没有显示正确的函数签名。
但是当我对 svref
做同样的事情时,比如说,没有任何东西(至少对我而言)可以证实上述假设。所以也许 SLIME 也做了一些事情。
任何人都可以指出相关文档(我没有在 SLIME 手册和 CCL 手册中找到任何相关内容)或者任何人有 workaround/solution 吗?
SVREF
不采用数组索引列表,因为它的第一个参数是一个向量。一个数组可能是多维的,这就解释了为什么有可变数量的下标。对于 AREF
,可能的来源是:
.../ccl/level-0/l0-array.lisp
#'AREF
.../ccl/compiler/optimizers.lisp
(COMPILER-MACRO AREF)
.../ccl/compiler/nx1.lisp
#'CCL::NX1-AREF
其中,只有第一个在其参数列表中包含不常见的 &lexpr
关键字。
一个实验:
CL-USER> (defun foobar (a &lexpr b) (list a b))
;Compiler warnings :
; In FOOBAR: Unused lexical variable &LEXPR
FOOBAR
让我们使用 CCL 中未导出的符号(自动完成找到它):
CL-USER> (defun foobar (a ccl::&lexpr b) (list a b))
FOOBAR
这次成功了,试试看吧:
CL-USER> (foobar 0 1 2 3 4)
(0 17563471524599)
Lisp 的进化 说(强调我的):
MacLisp introduced the LEXPR , which is a type of function that takes any number of arguments and puts them on the stack;
(参见 https://www.dreamsongs.com/Files/Hopl2.pdf)
通过替换修复
您可以在 Swank 级别修复它,方法是将 &lexpr
替换为 &rest
。您只需要修补 ccl.lisp
,它为 Clozure 提供 arglist
的实现:
(defimplementation arglist (fname)
(multiple-value-bind (arglist binding) (let ((*break-on-signals* nil))
(ccl:arglist fname))
(if binding
(substitute '&rest 'ccl::&lexpr arglist)
:not-available)))
更多详情
事实上,在swank-arglists.lisp
中你可以看到未知的东西放在一个单独的列表中,称为:unknown-junk
。要查看实际效果,请执行以下操作:
CL-USER> (trace swank::decoded-arglist-to-string)
NIL
然后,写入 (aref
并按 Space,这将触发对参数列表的查询并产生以下跟踪:
0> Calling (SWANK::DECODED-ARGLIST-TO-STRING #S(SWANK/BACKEND:ARGLIST :PROVIDED-ARGS NIL :REQUIRED-ARGS (CCL::A) :OPTIONAL-ARGS NIL :KEY-P NIL :KEYWORD-ARGS NIL :REST NIL :BODY-P NIL :ALLOW-OTHER-KEYS-P NIL :AUX-ARGS NIL :ANY-P NIL :ANY-ARGS NIL :KNOWN-JUNK NIL :UNKNOWN-JUNK (CCL::&LEXPR CCL::SUBS)) :PRINT-RIGHT-MARGIN 159 :OPERATOR AREF :HIGHLIGHT (0))
<0 SWANK::DECODED-ARGLIST-TO-STRING returned "(aref ===> a <===)"
注意 :UNKNOWN-JUNK (CCL::&LEXPR CCL::SUBS))
部分。
也许更好的解决办法是让 Swank 了解 &lexpr
?