2012-01-10 5 views
5

Korzystając z MIT-Scheme 9.x, istnieje sposób użycia debuggera lub innego narzędzia do sprawdzenia anonimowej procedury złożonej (utworzonej przez zwrócenie funkcji lambda), np. dowiedzieć się dokładnie, z jakiego kodu pochodzi?Z MIT-Scheme, czy istnieje sposób na sprawdzenie obiektu złożonej procedury?

Na przykład, jestem obecnie robi coś takiego:

(foo 2 3) 

I widzę komunikat o błędzie, jak:

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

... gdzie foo robi jakąś dalszą wysyłkę (foo jest nie problem tutaj, leży głębiej). W tym przykładzie chciałbym znać wewnętrzne # # procedury złożonej 65, ponieważ nie jest to oczywiście to, czego się spodziewałem. Czy kreator Lisp/Scheme wie, w jaki sposób uzyskać te szczegóły? Dzięki.

Odpowiedz

7

Istnieje kilka interesujących narzędzi do debugowania opisanych na tej stronie: Debugging Aids.

Z krótkim eksperymencie próbowałem, myślę, że można użyć funkcji pp aby zbadać źródło obiektu procedury związek:

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> 

Wydaje się, że można nawet dostać źródło lambda funkcji i skompilowane funkcje:

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 ]=> 

Istnieje kilka innych interesujących narzędzi do refleksji na połączonej stronie. MIT Scheme ma także bunch of stuff dla niechlujstwa ze środowiskami jako obiekty pierwszej klasy, które mogą być przydatne dla niektórych zadań debugowania. Mam nadzieję, że pomaga!

+0

Tak, to bardzo pomaga - dokładnie to, co było potrzebne! – limist

+4

Jeszcze krócej: (pp # @ 42), gdzie 42 to numer procedury. – limist

Powiązane problemy