2012-02-07 13 views
0

私たちはスキームバージョンr5rsを使用して、ポインターを指しているタイプのプロシージャーポインターを調べようとしています。タイプのプロシージャ参照を確認していますか?

我々が使用してオブジェクトを作成しました:

(define (%macro name exp env) 
    (define (set-exp new_exp) (set! exp new_exp)) 
    (define (set-env new_env) (set! env new_env)) 
    (define (set-name new_name) (set! name new_name)) 

    (define (%dispatch call) 
    (cond 
     ((eq? call 'get-exp) exp) 
     ((eq? call 'get-env) env) 
     ((eq? call 'get-name) name) 

     ((eq? call 'set-exp) set-exp) 
     ((eq? call 'set-env) set-env) 
     ((eq? call 'set-name) set-name) 
)) 

    %dispatch 
) 

我々は、それがコードの別の部分にディスパッチ関数を指すかどうかを判断するための手順の参照を確認したい:

(define (macro? exp) 
    (eq? %macro exp) 
) 

これは動作していないようですが、マクロオブジェクト(実際にはディスパッチプロシージャ)を指している場合、ポインタを正しくチェックするにはどうすればいいですか?

すべてのヘルプは大歓迎です:)

答えて

3

多分に「マクロを応答し、あなたのオブジェクトに1つのより多くのメソッドを追加します?。 Javaプログラマーの観点からは、instanceof呼び出しを避けてください。すべてのオブジェクトがマクロの実装のような共通のプロトコルに従っている場合方法、それは問題を解決するだろうか?

フルラケットのようなもっと機能豊かな言語では、structure type propertyを使用すると機能します。あなたは故意にr5rsであるので、あなたの選択肢はより限定されています。

+0

ご返信ありがとうございます。私の大学は現在、私たちにr5rsの使用を制限しているので、私は完全なラケットを使用することはできません。すべてのオブジェクトが "マクロ"を送信したので、マクロは不幸にも解決しませんでした。そのようなクエリには応答できません。 – ChewToy

+0

Hmmm。すべてのオブジェクトでコンストラクタを返す "type"メソッドをサポートできますか?変更できるものにはどのような制限がありますか? – dyoo

関連する問題