Почему все процедуры должны быть определены до того, как компилятор их увидит?

Например, взгляните на этот код (из 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 - это выражение, которое использует их значение, поэтому, если вы переместите определения функций после него, вы получите ошибку времени выполнения. (Обратите внимание на тот факт, что это ошибка времени выполнения, а не ошибка времени компиляции.)

Другие вопросы по тегам