5

MIT-Scheme 9.x を使用して、デバッガーまたはその他のツールを使用して匿名の複合手続き (ラムダ関数を返すことによって作成された) を検査する方法はありますか?

たとえば、私は現在次のようなことをしています。

(foo 2 3)

そして、次のようなエラー メッセージが表示されます。

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

... foo がさらにディスパッチを行っている場所 (foo はここでは問題ではなく、より深いところにあります)。この例では、 #[compound-procedure 65] の内部構造を知りたいと思っています。そこにいる Lisp/Scheme ウィザードは、それらの詳細を取得する方法を知っていますか? ありがとう。

4

1 に答える 1

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スキームには、特定のデバッグタスクに役立つファーストクラスオブジェクトとして、環境をいじるためのものもたくさんあります。それが役立つことを願っています!

于 2012-01-11T18:28:16.683 に答える