Emacs中的SLIME和CCL微型缓冲区文档

时间:2018-12-15 20:31:06

标签: lisp common-lisp slime clozure-cl

在使用Emacs,SLIME和Clozure CL时,我有些不高兴: aref(我尚未见过其他实例)的功能签名仅显示为(aref a)

当我去寻找源代码时,相关代码以(defun aref (a &lexpr subs)开头。据我所知,&lexpr不是有效的CL lambda列表关键字。因此,这表明SLIME由于关键字“ weird”而无法显示正确的功能签名。

但是,当我对svref执行相同操作时,请说,没有(至少对我来说)可以证实上述假设。所以也许SLIME也可以做些什么。

有人可以指向相关文档(我在SLIME手册和CCL手册中没有找到任何相关的内容)还是有人有解决方法/解决方案?

1 个答案:

答案 0 :(得分:3)

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引入了LEXPR,这是一种需要   任意数量的参数并将它们放在堆栈;

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

通过替换固定

您可以通过将&lexpr替换为&rest来将其修复为Swank级别。您只需要修补ccl.lisp,即可为arglist的Clozure提供实现:

(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