Значення періоду в (. 123)


12

Я дізнався, що . /path/to/fileв bash використовується для виконання файлу. Я просто цікавлюсь, але в Emacs я щось подібне переглядаю

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Схоже, Emacs просто читає (. 123)як 123, що сталося?


.не є функцією. .не є змінною. Нічого не сталося - zip, zero, zilch, nada.
законник

@lawlist Це здається трохи складнішим за це. Напр., qsdfЦе не є функцією, але вона (qsdf 123)дає void function.... І (. 123 456)приводить до синтаксичної помилки ". in wrong context".
Т. Веррон

1
Схоже,
кращий

1
Btw, можливо , еквівалент баша .(або 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 ...


Хіба не Гіле GNU?
Т. Веррон

Так, але так є MIT-схема в наші дні.
wasamasa

3
Подумайте про повідомлення про помилку Emacs. Це не "нормальна" поведінка Ліспа. Більше того, схоже на недокументовану поведінку.
Дрю

Про це я повідомив у помилці №24875 .
xuchunyang
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.