Значение периода в (. 123)

12

Я узнал, что . /path/to/fileв Bash используется для выполнения файла. Просто из любопытства я оценил что-то вроде следующего в Emacs

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Похоже , что Emacs просто читает , (. 123)как то 123, что произошло?

xuchunyang
источник
.это не функция. .не является переменной Ничего не произошло - почтовый индекс, ноль, пшик, нада.
юрист
@lawlist Кажется, все немного сложнее. Например, qsdfэто не функция, но (qsdf 123)дает void function.... И (. 123 456)выдает синтаксическую ошибку ". in wrong context".
Т. Веррон
1
Для меня это выглядит как
крайний
1
Кстати, эквивалент bash .(или source) в elisp, вероятно load.
Т. Веррон
(. 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. Т.е. описанный тобой эффект очень странный!
Тобиас

Ответы:

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_listв lread.c. Обычно a . обрабатывается путем установки cdr ранее прочитанного хвоста следующим образом. Однако в случае, если хвоста нет (как при чтении (. 123)), следующая вещь читается и возвращается как есть. Лично я ожидал бы, что это приведет к неправильной синтаксической ошибке, но я уверен, что кто-то поместил туда специальный случай, чтобы обойти странно ужасные источники. Я попробовал, как ведут себя другие интерпретаторы Lisp csi, pilи sbclничего не делаю , и разрешаю читать это, так что это может стоить сообщения об ошибке.

редактировать: Guile ведет себя так же, MIT-схема не. Вот моя теория о том, что это поведение - вещь GNU ...

wasamasa
источник
Разве Guile GNU тоже?
Т. Веррон
Да, но MIT-Scheme в наши дни тоже.
Васамаса
3
Пожалуйста, рассмотрите сообщение об ошибке Emacs. Это не "нормальное" поведение Lisp. Более того, это похоже на недокументированное поведение.
Дрю
Я сообщил об этом в ошибке # 24875 .
xuchunyang