2012-02-07 30 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

多了一個方法或許添加到您的對象,響應「宏?在Java程序員的術語中:避免instanceof調用。如果你的所有對象遵循一個通用協議,比如實現一個宏?方法,會解決問題嗎?

在更多有特色的語言,如完整的球拍,使用structure type property也將工作。由於你故意在r5rs中,你的選擇更加有限。

+0

感謝您的回覆。恐怕我無法使用完整的Racket,因爲我的大學目前限制我們使用r5rs。 '宏將不幸地解決它,因爲我的所有對象都發送了'宏'?無法迴應此類查詢。 – ChewToy 2012-02-07 19:07:15

+0

嗯。你能否讓所有的對象都支持返回構造函數的「類型」方法?你可以改變什麼限制? – dyoo 2012-02-07 19:37:13