2012-01-10 8 views
5

Utilizzando MIT-Scheme 9.x, esiste un modo per utilizzare il debugger o qualche altro strumento per ispezionare una procedura composta anonima (creata restituendo una funzione lambda), ad es. per scoprire esattamente quale codice a quale linea proviene?Con MIT-Scheme, c'è un modo per ispezionare un oggetto con procedura composta?

Per esempio, attualmente sto facendo qualcosa di simile:

(foo 2 3) 

E vedo un messaggio di errore del tipo:

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

... dove foo sta facendo qualche ulteriore invio (foo è non il problema qui, si trova più in profondità). In questo esempio, vorrei davvero conoscere l'interno di # [compound-procedure 65] poiché ovviamente non è quello che mi aspettavo. Un mago Lisp/Scheme là fuori conosce un modo per ottenere quei dettagli? Grazie.

risposta

7

Esistono alcuni strumenti di debug interessanti descritti in questa pagina: Debugging Aids.

Dal breve esperimento ho provato, penso che si può utilizzare la funzione pp per ispezionare l'origine di un oggetto procedimento composto:

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> 

Sembra che si può anche ottenere la fonte di lambda funzioni e compilato funzioni:

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

c'è qualche altri strumenti interessante riflessione sulla pagina collegata. Schema MIT ha anche un bunch of stuff per fare scherzi con gli ambienti come oggetti di prima classe che possono essere utili per alcune attività di debug. Spero possa aiutare!

+0

Sì, questo aiuta molto - esattamente ciò che era necessario! – limist

+4

Ancora più corto: (pp # @ 42), dove 42 è il numero della procedura. – limist