Почему все процедуры должны быть определены до того, как компилятор их увидит?
Например, взгляните на этот код (из tspl4):
(define proc1
(lambda (x y)
(proc2 y x)))
Если я запускаю это как мою программу в схеме...
#!r6rs
(import (rnrs))
(define proc1
(lambda (x y)
(proc2 y x)))
Я получаю эту ошибку:
expand: unbound identifier in module in: proc2
... Этот код работает нормально, хотя:
#!r6rs
(import (rnrs))
(define proc2
+)
(define proc1
(lambda (x y)
(proc2 y x)))
(display (proc1 2 3)) ;output: 5
1 ответ
Решение
Все они должны быть определены в одном и том же модуле (= "библиотека" на языке r6rs). Но вы можете определить их в любом порядке - например, в последнем фрагменте вы можете поменять местами два определения, и оно будет работать нормально. Но обратите внимание, что вы не можете поставить определения после display
line - это выражение, которое использует их значение, поэтому, если вы переместите определения функций после него, вы получите ошибку времени выполнения. (Обратите внимание на тот факт, что это ошибка времени выполнения, а не ошибка времени компиляции.)