2016-12-04 2 views
1

これは私の最初の日でDr.RacketR5RSです。私は以下の共有コードを変更しようとしています。DrRacket:アプリケーション:プロシージャではないR5RS言語でエラー

;; This is an internal helper procedure. 
;; - it gets the method out of "in-object" 
;; - it invokes the method, passing "for-object" as the 
;; "self" for the method.      
;;     
(define (apply-method in-object for-object message args) 
    (let ((method (get-method message in-object))) 
    (cond ((method? method)     
      (apply method for-object args)) 
      ((eq? in-object for-object) 
     (display method)     
      (error "No method for" message 'in 
      (safe-ask 'UNNAMED-OBJECT 
       in-object 'NAME))) 
      (else (error "Can't delegate" message 
         "from" (safe-ask 'UNNAMED-OBJECT 
        for-object 'NAME) 
       "to" (safe-ask 'UNNAMED-OBJECT 
         in-object 'NAME)))))) 


(define (get-method message object) ; single-inheritance 
    (object message)) 

このスニペットはかなり大きなプロジェクトの一部です。したがって、私は関連する部分だけを共有します。プロジェクト内で、このプロシージャが呼び出されたとき。 letという式で始まる行にエラーがあります。エラーメッセージは次のようになります。

objsys.scm:53:2:アプリケーション:プロシージャではありません。与えられた引数
に適用することができ手続き を期待:
引数... #fを:問題を解決するために私を助けることができる誰もがあるのであれば

error message caption

、私は疑問に思います。 EDIT

私は上記の誤用または非整列paranthesisのような構文エラーがあると思われるが、私はエラーの原因となる正確な場所を見つけることができません。

+0

問題は、実装よりも 'apply-method'の使用法にあるようです。どこかに ''オブジェクト内 '' f 'が適用されています。 – molbdnilo

答えて

0

apply-methodを使用した場合、in-objectの値は#fです。 apply-method(get-method message in-object)get-methodを行うにしようとすると、その後(#f 'some-unknown-message)に変身(in-object message)を適用し、#fので、手続きのラケットはないであるとして、それを処理する問題を抱えているとアプリケーションの間に与えられた値#fがプロシージャではないことを伝えるエラーで終了。

あなたはラケットを使用しているので、おそらくデバッガを起動して、get-methodにブレークポイントを設定すれば、それが表示されます。 SchemeとRacketの言語はすべてのバインディングに対して1つの名前空間しか持たないので、名前付きプロシージャーが同じ変数を占めるため、同じ名前でプロシージャーと変数を持つことはできません。

関連する問題