С MIT-Scheme, есть ли способ проверить объект составной процедуры? - PullRequest
5 голосов
/ 10 января 2012

Используя MIT-схему 9.x, есть ли способ использовать отладчик или какой-либо другой инструмент для проверки анонимной составной процедуры (созданной путем возврата лямбда-функции), например, чтобы точно узнать, из какого кода и с какой строки он берется?

Например, я сейчас делаю что-то вроде:

(foo 2 3)

И я вижу сообщение об ошибке вроде:

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

... где foo выполняет дальнейшую отправку (foo здесь не проблема, она лежит глубже). В этом примере я действительно хотел бы знать внутреннюю часть # [составной процедуры 65], поскольку это явно не то, что я ожидал. Знает ли мастер Lisp / Scheme способ получить эти детали? Спасибо.

1 Ответ

7 голосов
/ 11 января 2012

На этой странице описаны некоторые интересные инструменты отладки: Средства отладки .

Из короткого эксперимента, который я пробовал, я думаю, что вы можете использовать функцию 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 ]=> 

Есть несколько других интересных инструментов отражения насвязанная страница.Схема MIT также имеет связку вещей для работы со средами в качестве объектов первого класса, которые могут быть полезны для определенных задач отладки.Надеюсь, это поможет!

...