Почему все процедуры должны быть определены до того, как компилятор их увидит? - PullRequest
0 голосов
/ 05 июня 2010

Например, посмотрите на этот код (из 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 Ответ

2 голосов
/ 05 июня 2010

Все они должны быть определены в одном и том же модуле (= "библиотека" на языке r6rs). Но вы можете определить их в любом порядке - например, в последнем фрагменте вы можете поменять местами два определения, и оно будет работать нормально. Но обратите внимание, что вы не можете поместить определения после строки display - это выражение, которое использует их значение , поэтому, если вы переместите определения функций после него, вы получите ошибку времени выполнения. (Обратите внимание, что это ошибка во время выполнения , а не во время компиляции.)

...