Emacs中的SLIME和CCL迷你缓冲区文档



当使用Emacs、SLIME和Clozure CL时,我有一个小问题:aref的函数签名(我还没有看到任何其他实例(仅显示为(aref a)

当我转到源代码时,有问题的代码以(defun aref (a &lexpr subs)开头。据我所知,&lexpr不是一个有效的CL lambda列表关键字。因此,这表明SLIME由于"怪异"关键字而没有显示正确的函数签名。

但当我对svref做同样的事情时,比如说,没有什么(至少对我来说(能证实上述炒作。所以也许SLIME也做了些什么。

有人能指出相关文件吗(我在SLIME手册和CCL手册中没有发现任何相关内容(,或者有人有变通方法/解决方案吗?

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的进化says(强调矿(:

MacLisp引入了LEXPR,这是一种任意数量的参数,并将它们放在堆栈上;

(请参阅https://www.dreamsongs.com/Files/Hopl2.pdf)

通过替换修复

您可以在Swank级别通过用&rest替换&lexpr来修复它。您只需要修补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

最新更新