2012-01-10 36 views
5

使用MIT-Scheme 9.x,有没有一种方法使用调试器或其他工具来检查匿名复合过程(通过返回lambda函数创建)找出来自哪一行的确切代码?使用MIT-Scheme,有没有办法检查复合过程对象?

例如,我正在做这样的事情:

(foo 2 3) 

而且我看到一个错误信息,如:

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

...其中foo是做一些进一步的调度(foo是不是这里的问题,它更深层)。在这个例子中,我真的很想知道#[复合过程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 ]=> 

在链接页面上还有一些其他有趣的反射工具。麻省理工学院计划也有一个bunch of stuff与环境作为一流的对象,可用于某些调试任务。希望有所帮助!

+0

是的,这有助于很多 - 正是需要的! – limist 2012-01-12 17:40:58

+4

甚至更​​短:(pp#@ 42),其中42是程序编号。 – limist 2012-01-12 18:35:58

相关问题