2012-01-10 9 views
5

Usando MIT-Scheme 9.x, ¿hay alguna manera de utilizar el depurador o alguna otra herramienta para inspeccionar un procedimiento compuesto anónimo (creado al devolver una función lambda), p. para averiguar exactamente qué código y de qué línea proviene?Con MIT-Scheme, ¿hay alguna manera de inspeccionar un objeto de procedimiento compuesto?

Por ejemplo, actualmente estoy haciendo algo como:

(foo 2 3) 

Y veo un mensaje de error como:

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

... donde foo está haciendo un envío adicional (foo es no es el problema aquí, es más profundo). En este ejemplo, realmente me gustaría saber las partes internas de # [compuesto-procedimiento 65], ya que obviamente no es lo que esperaba. ¿Un asistente de Lisp/Scheme conoce una forma de obtener esos detalles? Gracias.

Respuesta

7

Hay algunas herramientas de depuración interesantes que se describen en esta página: Debugging Aids.

Desde el corto experimento he intentado, creo que se puede utilizar la función pp para inspeccionar la fuente de un procedimiento objeto compuesto:

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> 

Parece ser que incluso se puede conseguir la fuente de lambda funciones y compilado funciones:

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

Hay algunas otras herramientas de reflexión interesantes en la página vinculada. MIT Scheme también tiene un bunch of stuff para jugar con los entornos como objetos de primera clase que pueden ser útiles para ciertas tareas de depuración. ¡Espero que ayude!

+0

Sí, esto ayuda mucho, ¡exactamente lo que se necesitaba! – limist

+4

Aún más corto: (pp # @ 42), donde 42 es el número de procedimiento. – limist

Cuestiones relacionadas