(.123)中的句点含义


12

. /path/to/file在bash中了解到用于执行文件。出于好奇,我在Emacs中评估了以下内容

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

看起来Emacs只是读(. 123)123,发生了什么事?


.不是功能。 .不是变量。什么都没发生-zip,零,zilch,nada。
法律列表

@lawlist似乎要复杂得多。例如,qsdf它也不是一个函数,而是(qsdf 123)yield void function...。并(. 123 456)产生语法错误". in wrong context"
T. Verron '16

1
对我来说,这
似乎

1
顺便说一句,相当于elisp 中bash的.(或source)等价于load
T. Verron '16

(. 123)tutorialspoint.com/execute_lisp_online.php上给出*** - READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"main.lisp" @1>: token "." not allowed here。在emacs中:(boundp '.)nil(fboundp '.)nil。即,您描述的效果非常奇怪!
Tobias

Answers:


15

看起来Emacs只是将(.123)读为123,发生了什么事?

就是这样。要使用源进行备份:

if (ch == '.')
  {
    if (!NILP (tail))
      XSETCDR (tail, read0 (readcharfun));
    else
      val = read0 (readcharfun);
    read1 (readcharfun, &ch, 0);

    if (ch == ')')
      {
        if (doc_reference == 1)
          return make_number (0);
        if (doc_reference == 2 && INTEGERP (XCDR (val)))
          /* ... */
        return val;
      }
    invalid_syntax (". in wrong context");
  }

这是特殊情况read_listlread.c。通常,. 通过以下方式设置先前读取的尾部的cdr来处理a 。但是,在没有尾巴的情况下(如读取时 (. 123)),将读取下一个内容并按原样返回。就个人而言,我希望这会导致无效的语法错误,但是我敢肯定,有人将特殊情况放在那儿,以解决特别可怕的资源。我已经尝试了其他Lisp解释器的娱乐方式,但并没有这样做csipil并且sbcl允许阅读此书,因此可能值得提交错误报告。

编辑:Guile的行为相同,而MIT-Scheme则不然。我的理论认为这种行为是GNU事物...


Guile GNU也是吗?
T. Verron,

是的,但是最近的MIT-Scheme也是如此。
wasamasa

3
请考虑报告Emacs错误。这不是“正常”的Lisp行为。而且,这似乎是未记录的行为。
提请

我在bug#24875中报告了这个问题。
xuchunyang '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.