Significado do período em (. 123)

12

Eu aprendi . /path/to/fileno bash é usado para executar um arquivo. Por curiosidade, avalio algo como o seguinte no Emacs

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Parece que o Emacs simplesmente lê (. 123)como 123, o que aconteceu?

xuchunyang
fonte
.não é uma função. .não é uma variável Nada aconteceu - zip, zero, zilch, nada.
lawlist
@lawlist Parece ser um pouco mais complicado que isso. Por exemplo, qsdftambém não é uma função, mas (qsdf 123)produz void function.... E (. 123 456)gera um erro de sintaxe ". in wrong context".
44230 T. Verron
1
Parece um caso extremo em que o leitor me ...
wasamasa
1
Btw, provavelmente o equivalente de bash .(ou source) no elisp load.
precisa
(. 123)em tutorialspoint.com/execute_lisp_online.php fornece *** - READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"main.lisp" @1>: token "." not allowed here. No emacs: (boundp '.)nile (fboundp '.)nil. Ou seja, o efeito descrito por você é muito estranho!
Tobias

Respostas:

15

Parece que o Emacs simplesmente lê (. 123) como 123, o que aconteceu?

Foi exatamente o que aconteceu. Para fazer backup com fontes:

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");
  }

Este é o caso especial de read_listin lread.c. Normalmente a . é tratado definindo o cdr da cauda lida anteriormente pelo que segue. No entanto, no caso de não haver cauda (como na leitura (. 123)), a próxima coisa é lida e retornada como está. Pessoalmente, eu esperaria que isso levasse a um erro de sintaxe inválido, mas tenho certeza que alguém colocou o caso especial lá para solucionar fontes particularmente terríveis. Eu tentei como outros intérpretes do Lisp se comportam por diversão e nada disso csi, pile sbclpermitem ler isso, então pode valer a pena um relatório de erro.

edit: Guile se comporta da mesma forma, o MIT-Scheme não. Lá se vai minha teoria de que esse comportamento é uma coisa do GNU ...

wasamasa
fonte
O Guile GNU também não é?
precisa
Sim, mas o mesmo acontece com o MIT-Scheme atualmente.
Wasamasa
3
Por favor, considere relatar um bug do Emacs. Este não é um comportamento "normal" do Lisp. Além disso, parece ser um comportamento não documentado.
Drew Drew
Eu relatei isso no bug # 24875 .
precisa saber é o seguinte