Significato del periodo in (. 123)


12

Ho imparato . /path/to/filein bash è usato per eseguire un file. Solo per curiosità, valuto qualcosa di simile al seguente in Emacs

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Sembra che Emacs legga semplicemente (. 123)come 123, cosa è successo?


.non è una funzione. .non è una variabile. Non è successo nulla: zip, zero, zilch, nada.
elenco delle leggi

@lawlist Sembra essere un po 'più complicato di così. Ad esempio qsdfnon è nemmeno una funzione, ma (qsdf 123)cede void function.... E (. 123 456)genera un errore di sintassi ". in wrong context".
T. Verron,

1
Mi sembra un caso limite nel lettore ...
Wasamasa,

1
A proposito, l'equivalente di bash .(o source) in elisp è probabilmente load.
T. Verron,

(. 123)su tutorialspoint.com/execute_lisp_online.php*** - READ from #<INPUT BUFFERED FILE-STREAM CHARACTER #P"main.lisp" @1>: token "." not allowed here. In emacs: (boundp '.)nile (fboundp '.)nil. Cioè, l'effetto descritto da te è molto strano!
Tobias,

Risposte:


15

Sembra che Emacs legga semplicemente (. 123) come 123, cosa è successo?

È esattamente quello che è successo. Per eseguire il backup con fonti:

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

Questo è il caso speciale di read_listin lread.c. Normalmente a . viene trattato impostando il cdr della coda precedentemente letta da qualunque cosa segue. Tuttavia, nel caso in cui non ci sia coda (come durante la lettura (. 123)), la cosa successiva viene letta e restituita così com'è. Personalmente, mi aspetto che ciò comporti un errore di sintassi non valido, ma sono sicuro che qualcuno abbia messo lì il caso speciale per aggirare fonti particolarmente terribili. Ho provato come si comportano gli altri interpreti Lisp per divertimento e nessuno csi, pile sbclmi permetto di leggere questo, quindi potrebbe valere la pena segnalare un bug.

modifica: Guile si comporta allo stesso modo, lo schema MIT no. La mia teoria di questo comportamento è una cosa GNU ...


Anche Guile GNU non è?
T. Verron,

Sì, ma lo è anche il MIT-Scheme in questi giorni.
Wasamasa,

3
Ti preghiamo di considerare la segnalazione di un bug di Emacs. Questo non è un comportamento "normale" di Lisp. Inoltre, sembra essere un comportamento senza documenti.
Disegnato il

L'ho segnalato nel bug # 24875 .
xuchunyang,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.