Загрузка файла, который определяет значения, перезаписывает привязки верхнего уровня - PullRequest
3 голосов
/ 08 августа 2011

Если у меня есть файл test.scm:

(define foo 5)

и затем с помощью REPL:

(define foo 2)

foo
==> 2

(define bar
  (lambda ()
    (load "test.scm")
    foo))

foo
==> 2

(bar)
==> 5

foo
==> 5

Другими словами, загрузка файла в одном лексическом контексте позволяет привязкам выходить на верхний уровень. Почему это так, и есть ли способ включить другой файл в соответствии с C #include, т.е. выполнить команды, как если бы они были встроены в код в этой точке?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

Если бы код, выполняемый load, мог получить доступ к лексическому контексту формы load, это не был бы лексический контекст.

Ситуация была бынесколько иначе, если бы load был макросом, а не функцией, но даже тогда стандартные макросы R5RS гигиеничны и не могут легко испортить лексический контекст.

Однако вы могли бы написать макрос defmacro в стилеэто делает то, о чем вы просите, читая файл и возвращая форму begin, содержащую все прочитанное из файла.

Пример кода:

(define-macro (include file)
  (let ((read-forms
         (lambda ()
           (let loop ((forms '()))
             (let ((form (read)))
               (if (eof-object? form)
                   (reverse forms)
                   (loop (cons form forms))))))))
    (with-input-from-file file
      (lambda ()
        (cons 'begin (read-forms))))))

Обратите внимание, что define-macro не являетсястандарт.Вам нужно будет выяснить, как и как это можно сделать, в зависимости от реализации вашей Схемы.

1 голос
/ 08 августа 2011

см http://web.mit.edu/scheme_v9.0.1/doc/mit-scheme-user/Loading-Files.html

procedure: load filename [environment [syntax-table [purify?]]]

"Среда, если задана, - это среда для оценки файла; если не указано, используется текущая среда REPL."

это означает, что файл оценивается непосредственно в repl, а не в лямбда-замыкании.

EDIT см. этот вопрос на SO (загрузить "file.scm") в новой среде на схеме , как можно создать новую среду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...