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 ?


.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 ...


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.