2012-01-10 12 views
5

Sử dụng MIT-Scheme 9.x, có cách nào bằng cách sử dụng trình gỡ lỗi hoặc một số công cụ khác để kiểm tra quy trình hợp nhất ẩn danh (được tạo bằng cách trả về hàm lambda), ví dụ: để tìm ra chính xác mã nào ở dòng nào?Với MIT-Scheme, có cách nào để kiểm tra đối tượng hợp chất không?

Ví dụ, tôi đang làm một cái gì đó như:

(foo 2 3) 

Và tôi thấy thông báo lỗi như:

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

... nơi foo được làm một số công văn tiếp theo (foo là không phải vấn đề ở đây, nó nằm sâu hơn). Trong ví dụ này, tôi thực sự muốn biết nội bộ của # [compound-procedure 65] vì nó rõ ràng không phải là những gì tôi mong đợi. Có một thuật sĩ Lisp/Scheme ra có biết một cách để có được những chi tiết đó? Cảm ơn.

Trả lời

7

Có một số công cụ gỡ lỗi thú vị được mô tả trên trang này: Debugging Aids.

Từ thí nghiệm ngắn tôi đã cố gắng, tôi nghĩ bạn có thể sử dụng pp chức năng để kiểm tra nguồn gốc của một đối tượng thủ tục hợp chất:

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> 

Dường như bạn thậm chí có thể nhận được nguồn gốc của lambda chức năng và biên soạn chức năng:

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ó một số công cụ phản chiếu thú vị khác trên trang được liên kết. Chương trình MIT cũng có một số bunch of stuff để làm rối tung các môi trường như các đối tượng lớp đầu tiên có thể hữu ích cho các tác vụ gỡ lỗi nhất định. Hy vọng rằng sẽ giúp!

+0

Có, điều này giúp ích rất nhiều - chính xác những gì cần thiết! – limist

+4

Thậm chí ngắn hơn: (trang # @ 42), trong đó 42 là số quy trình. – limist