(。123)での期間の意味


12

. /path/to/filebashで学んだことは、ファイルの実行に使用されます。好奇心から、私はEmacsで次のようなものを評価します

(. 123)
     ⇒ 123

(read "(. 123)")
     ⇒ 123

Emacsは単にと読みます(. 123)123、どうしたのですか?


.関数ではありません。 .変数ではありません。何も起こらなかった-zip、zero、zilch、nada。
法律家

@lawlistそれはそれより少し複雑であるようです。例えばqsdf、関数でもありませんが、を(qsdf 123)生成しvoid function...ます。そして、(. 123 456)構文エラーを生成します". in wrong context"
T.バーロン16年

1
私にとって読者のエッジケースのように見えます
...-wasamasa

1
ところで、elisp のbash .(またはsource)に相当するものはおそらくであるload
T. Verron

(. 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インタプリタは、楽しさとのどれものためにどのように動作するかを私は試してみたcsipilsbclこれを読ん許可証を行うことは価値があるバグレポートかもしれので、。

編集:Guileは同じ動作をしますが、MIT-Schemeは動作しません。この振る舞いがGNUのものであるという私の理論があります...


Guile GNUも同様ですか?
T. Verron

はい、しかし最近のMIT-Schemeもそうです。
wasamasa

3
Emacsのバグの報告を検討してください。これは「通常の」Lispの動作ではありません。さらに、文書化されていない動作のようです。
ドリュー

これをbug#24875で報告しました。
xuchunyang
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.