1

Modern Scheme (およびその子孫である Racket) は、非常に強力な衛生的なマクロ システムを備えています。quote私にquasiquoteは、(非衛生的な)マクロを定義するという彼らの歴史的立場を失ってしまったように思えます(私が誤解していなければ、Common Lisp ではまだ行われているように)。実際には言語レポートでは、quoteデータquasiquote、特にリストを構築する便利な方法としてのみ提示されます。確かに、彼女が退屈に耐えられるなら、それらがなくても大丈夫です。たとえば、 の(quote (+ 1 2))ように書き換えることができ、 のように書き換える(list (quote +) 1 2)こと(quasiquote (+ (unquote (- 2 1)) 2))ができます(list (quote +) (- 2 1) 2)

ここで、Scheme にシンボルの新しいプリミティブ型を導入するとします。大文字で始まる識別子はシンボルであり、それ以外の場合は変数です。soXは記号 を意味し、上記の例はおよびxのように記述できます。(が記号を表しているとしましょう。)とは冗長であると言えますか? それとも何かが恋しいですか?(list Plus 1 2)(list Plus (- 2 1) 2)Plus+quotequasiquote

編集

  1. evalいくつかのまれなケースではまだ有用なようです: EVAL in SCHEME

  2. 明確な質問。

4

2 に答える 2

6

あなたの質問は不明です。引用に技術的な必要性があるかどうかを尋ねているようです。これが本当なら、あなたの new$ プリミティブのようなもの'です。かっこで囲まれた形式を引用する便利さは、引用符で囲まれた記号だけをいつでも使用できるため、厳密に必要になることはありませんでしたが、この便利さは、より高い表現レベルについて話し始めるときに非常に重要です。私が何を意味するかを理解するために、の引用は(+ x 1)となる(list '+ 'x 1)、そしてその引用は となります(list 'list (list 'quote '+) (list 'quote 'x) 1)-- これにより、通常の利点がquote明らかになります...

有用であることに関してevalは、間違いなく有用です。マクロについて理解すべき主なことは、マクロがコードの静的部分を変換することです。実際、ほとんどの実装では、コンパイルの一部としてマクロが展開されます。正当な使用法は、eval動的に生成された入力に依存するものとまったく同じです。

于 2013-04-06T13:08:50.883 に答える
2

はい、quote冗長ですが、大文字の規則は必要ありません。quote識別子 (シンボル) を続けて、string->symbolシンボルの文字列コンテンツを含む式を生成できます。

(quote x) => (string->symbol "x")
于 2013-04-06T15:18:44.370 に答える