2012-01-10 5 views
5

MIT-Scheme 9.xを使用すると、デバッガやその他のツールを使用して、(ラムダ関数を返すことによって作成された)匿名の複合手続きを検査する方法がありますか?それはどのようなコードから来ているのか正確に調べることができますか? fooがある(fooはさらにいくつかの派遣を行っているMITスキームでは、複合手続きオブジェクトを検査する方法はありますか?

;The procedure #[compound-procedure 65] has been called with 2 arguments; it requires exactly 0 arguments. 

...:

たとえば、私は現在のようなものやってる:

(foo 2 3) 

をそして私のようなエラーメッセージが表示されますここの問題ではなく、より深いところにある)。この例では、#[compound-procedure 65]の内部を知りたいのは、明らかに私が期待していたものではないからです。それらの詳細を取得する方法を知っているLisp/Schemeウィザードはありますか?ありがとう。

答えて

7

このページで説明しているデバッグツールは、Debugging Aidsです。

私が試した短い実験から、私はあなたが複合手続きオブジェクトのソースを検査するpp機能を使用することができると思う:

1 ]=> (define (sum-squares x y) (+ (* x x) (* y y))) 

;Value: sum-squares 

1 ]=> (sum-squares 3) 

;The procedure #[compound-procedure 13 sum-squares] 
;has been called with 1 argument 
;it requires exactly 2 arguments. 
;To continue, call RESTART with an option number: 
; (RESTART 1) => Return to read-eval-print level 1. 

2 error> (pp #[compound-procedure 13 sum-squares]) 
(named-lambda (sum-squares x y) 
    (+ (* x x) (* y y))) 
;Unspecified return value 

2 error> 

あなたもlambda機能のソースを得ることができると思われ、コンパイル関数:

1 ]=> (define (make-acc-gen n) (lambda (i) (set! n (+ n i)) n)) 

;Value: make-acc-gen 

1 ]=> (pp (make-acc-gen 0)) 
(lambda (i) 
    (set! n (+ n i)) 
    n) 
;Unspecified return value 

1 ]=> display 

;Value 15: #[compiled-procedure 15 ("output" #x16) #x1a #x101b23bd2] 

1 ]=> (pp #[compiled-procedure 15 ("output" #x16) #x1a #x101b23bd2]) 
(named-lambda (display object #!optional port environment) 
    (let ((port (optional-output-port port 'display))) 
    (unparse-object/top-level object port #f environment) 
    ((%record-ref (%record-ref port 1) 14) port))) 
;Unspecified return value 

1 ]=> 

リンク先のページには、他にも興味深い反射ツールがあります。 MIT Schemeには、特定のデバッグ作業に役立つファーストクラスのオブジェクトとして環境を混乱させるためのbunch of stuffもあります。希望が助けてくれる!

+0

はい、これは多くの手助けをします。 – limist

+4

さらに短く:(pp#@ 42)、42は手続き番号です。 – limist

関連する問題