Bedeutung der Periode in (. 123)

12

Ich habe . /path/to/filein Bash gelernt, dass es verwendet wird, um eine Datei auszuführen. Aus reiner Neugier habe ich in Emacs so etwas wie das Folgende bewertet

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Es sieht aus wie Emacs liest einfach (. 123)wie 123, was passiert ist ?

xuchunyang
quelle
.ist keine Funktion. .ist keine Variable. Nichts ist passiert - zip, zero, zilch, nada.
Gesetzesliste
@lawlist Es scheint etwas komplizierter zu sein. ZB qsdfist auch keine Funktion, sondern (qsdf 123)ergibt void function.... Und (. 123 456)ergibt einen Syntaxfehler ". in wrong context".
T. Verron
1
Sieht für mich nach einem
Randfall
1
Übrigens ist das Äquivalent von bash .(oder source) in elisp wahrscheinlich load.
T. Verron
(. 123)auf tutorialspoint.com/execute_lisp_online.php gibt *** - READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"main.lisp" @1>: token "." not allowed here. In Emacs: (boundp '.)nilund (fboundp '.)nil. Dh der von Ihnen beschriebene Effekt ist sehr seltsam!
Tobias

Antworten:

15

Es sieht so aus, als würde Emacs einfach (. 123) als 123 lesen. Was ist passiert?

Genau das ist passiert. So sichern Sie es mit Quellen:

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

Dies ist der Sonderfall für read_listin lread.c. Normalerweise . wird a behandelt, indem die cdr des zuvor gelesenen Endes wie folgt eingestellt wird. Wenn jedoch kein Schwanz vorhanden ist (wie beim Lesen (. 123)), wird das nächste gelesen und so zurückgegeben, wie es ist. Persönlich würde ich davon ausgehen, dass dies zu einem ungültigen Syntaxfehler führt, aber ich bin sicher, dass jemand den Sonderfall dort abgelegt hat, um besonders schreckliche Quellen zu umgehen. Ich habe ausprobiert, wie sich andere Lisp-Interpreten zum Spaß verhalten csi, pilund sbclerlaube es, dies zu lesen, daher ist es möglicherweise einen Fehlerbericht wert.

edit: Guile verhält sich genauso, MIT-Schema nicht. Nach meiner Theorie ist dieses Verhalten eine GNU-Sache ...

Wasamasa
quelle
Ist Guile GNU nicht auch?
T. Verron
Ja, aber heutzutage ist das MIT-Schema es auch.
Wasamasa
3
Bitte denken Sie daran, einen Emacs-Fehler zu melden. Dies ist kein "normales" Lisp-Verhalten. Darüber hinaus scheint es sich um undokumentiertes Verhalten zu handeln.
Drew
Ich habe dies in Fehler # 24875 gemeldet .
Xuchunyang