2

Racket では、次の方法で構文を定義できます。

(define-syntax foo
  (syntax-rules ()
    ((_ "abc") 'xyz)))

走ることで

(foo "abc")

xyz を返します。define を使用してこれを実装します。

(define (foo x)
  (match x ["abc" 'xyz]))

今回、

(foo "abc")

それでも 'xyz を返します。これらの異なるフォームを使用することの違いは何ですか?

4

2 に答える 2

3

define-syntaxマクロを定義します。マクロはコンパイル時に処理され、コンパイルされる新しいコードを生成し、関数は実行時に実行されます。その結果、マクロはランタイム変数にアクセスできず、引数を評価しません。違いを確認するには、次を試してください。

(define param "abc")
(foo param)

を定義する 2 つの方法を使用しますfoo。これは関数では機能しますが、マクロでは機能しません。

于 2013-09-13T00:08:22.737 に答える
1

これを試して:

(define abc "abc")
(foo abc)

2 つのバージョン間で非常に異なる結果が表示されます。

于 2013-09-13T00:06:55.740 に答える