Elispのリーダーを変更するにはどうすればよいですか?


12

リーダーを変更すると、新しい読み取り構文を(のような導入が可能になる#(hash table)'(quoted))。多くのLispにはこの機能がありますが、elispにはそのような機能は存在しないようです。


Cソースをハックします。
wasamasa

3
Emacs Lispには、Lispでプログラム可能なリーダーがありません。
ドリュー

@wasamasaさて、それは常にオプションです:) ポータブルなものではなく、オプションです。
ショーンオールレッド

「多くのLispにはこれがある」と思う。実際の質問ではありません。本当の質問をしたいです。タイトルを短くして、本文に言い換えることをお勧めします。
YoungFrog

@YoungFrogの編集を歓迎します。過度に言葉遣いをせずに、より直接的または適切なことを考えることはできませんでした。質問は簡単です。長くする必要はありません。
ショーンオールレッド

回答:


11

マニュアルには、実際にはリーダーマクロを実行できないことが示されています。

付録CによるCommon Lispの移植

リーダーマクロ。Common Lispには、個々の文字のレベルで機能する2番目のタイプのマクロが含まれています。たとえば、Common Lispは 'と呼ばれるリーダーマクロによる引用表記を実装しますが、Emacs Lispのパーサーは引用を特別なケースとして扱います。一部のLispパッケージは、リーダーマクロを使用して、Emacsパーサーが読み取ることができない特別な構文を作成します。


これはElispではなく、特別なリーダーマクロを使用するCommon Lispソフトウェアに関するものだと思います。このページは、CLコードをElispに移植することに関するものです。そして、はい、公式には読者はカスタマイズできませんが、以下の私の答えを参照してください
...-mishoo

ここでsyntax.c
のも

9

どうやらそれはできますが、多くの作業の準備をしてください。(または、週末に取り組むつもりなので、しないでください;-)。

(defvar *orig-read* (symbol-function 'read))

(defun read (&optional in)
  (message "reading from %s" load-file-name)
  (funcall *orig-read* in))

(setq load-read-function (symbol-function 'read))

今やるべきことは「すべて」です。Elispが行うすべての機能と、必要な機能をすべてサポートする完全なLispリーダーを実装することです。defpackage一例として、これを使用してCLのような内部シンボルをパッケージ化できます。また、正規表現の特別な構文は、私がひどくやりたいことです(より正確には、バックスラッシュを解釈しない文字列構文)。

編集:ここに概念実証の実装があります:https : //github.com/mishoo/elisp-reader.el


おそらく、あなたが提案したように完全なLispリーダーを実際に実装するまで、これを答えとして投稿しないことをお勧めします(私は推測しますが、これは些細なことではありません)。
ダン

@Dan実行可能です。Cで実行すると、文字列処理が面倒になるほど痛みが大きくなります。
-wasamasa

1
@Danが機能したので、実装にリンクを追加するために回答を編集しました。
-mishoo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.