0
(define-syntax my-class
    (syntax-rules ()
        [(my-class <class-name> (<attr> ...) 
            (method (bigger-x other) (> x (other 'x))))
         (define (<class-name> <attr> ...)
           (lambda (msg)
             (cond [(equal? msg (quote <attr>)) <attr>] ... 
                   [(equal? msg 'bigger-x) (lambda (other) (> x (other 'x)))]
                   [else "Unrecognized message!"])))]))

これは良いテンプレートではありません。しかし、 の構文を説明するのには適していますdefine-syntax。4行目にメソッドが1つしかない理由がわかりません。quote <attr>式の中の[(equal? msg (quote <attr>)) <attr>]もメソッドではありませんか? それらの構造は非常に似ています。

4

1 に答える 1

0

quote <attr>式の中の[(equal? msg (quote <attr>)) <attr>]もメソッドではありませんか?

「関数」を意味すると仮定すると、はい、実行時に評価される関数です。my-classたとえば、 は で定義されているため、コンパイル時に評価される関数ですdefine-syntax

my-class「メソッド」の定義を拡張するために使用しているようですbigger-x。これは、値xを引数と比較する関数です。この場合、condは実行時に評価され、識別子であることが判明した(quote <attr>)場合はシンボルに展開されます。<attr>いくつかのコンテキストがないと、何が何であるかを知るのが難しく(実行時にx変数が見つからない場合は例外が発生します)、定義されている方法では、常に渡す必要があります(または同様の構文。有効な構文に一致するようにします)。xmy-class(method (bigger-x other) (> x (other 'x)))methodbigger-x

于 2018-12-10T04:42:35.213 に答える