Возможно ли сбросить пользовательскую среду в Scheme REPL? - PullRequest
6 голосов
/ 16 августа 2011

Схема вопроса новичка-

Есть ли способ для меня сбросить текущую среду REPL (то есть пользовательскую среду по умолчанию) без выхода и перезапуска моего REPL? По сути, я бы хотел уничтожить мою текущую среду, чтобы ни одно из моих предыдущих определений не вступило в силу. Это использует схему GNU / MIT.

Если это невозможно, какова лучшая практика, когда просто возиться с кодом в REPL? Я слышал, что люди говорят о создании и удалении пакетов, но большинство примеров, похоже, касается Common Lisp, который немного отличается.

Я нашел информацию о том, как это сделать, в REPL Clojure, но были предупреждения, и похоже, что это специфично для Clojure: Можно ли очистить реплику?

Спасибо!

Редактировать: я могу функционально выполнить то же самое, выйдя и перезапустив сам процесс REPL. Я нашел способ сделать это, но сохранить соединение с моим редактором (vim) живым, используя vim-screen. Это приемлемое решение, если нет способа сделать это из REPL. Однако я буду держать вопрос открытым дольше, чтобы увидеть, есть ли способ сделать это на языке, так как я думаю, что это будет поучительно.

1 Ответ

11 голосов
/ 16 августа 2011

Я думаю, что это зависит от реализации, но в MIT Scheme вы можете очистить среду REPL с помощью:

1 ]=> (ge (make-top-level-environment))

Функция (ge [environment]) «Изменяет текущую среду цикла REP на [environment]».и функция make-top-level-environment «возвращает вновь выделенную среду верхнего уровня».

Схема MIT имеет набор функций управления средой, которые вы можете просмотреть здесь

Я протестировал это в Mac OS X (10.6.7) с MIT Scheme 9.0.1, установленной через предварительно собранный двоичный файл с сайта GNU, со следующим сеансом REPL:

1 ]=> (define foo 1)

;Value: foo

1 ]=> foo

;Value: 1

1 ]=> (ge (make-top-level-environment))

;Value 13: #[environment 13]

1 ]=> foo

;Unbound variable: foo
;To continue, call RESTART with an option number:
; (RESTART 3) => Specify a value to use instead of foo.
; (RESTART 2) => Define foo to a given value.
; (RESTART 1) => Return to read-eval-print level 1.

2 error> 

Я думаю, что разные реализацииу меня разные соглашения, но я не думаю, что есть что-то похожее на пакеты Common Lisp.Если вы не знакомы с MIT Scheme, вам следует проверить Racket и Dr Racket, которые являются хорошей IDE, которая может быть более мощной, чем обычный REPL в командной строке, и я думаю, что она имеет какую-то модульную систему.Ракетка - это собственный диалект схемы, поэтому в зависимости от того, что вы делаете, это может быть неуместно.(языковой модуль по умолчанию в Racket не совпадает со схемой MIT)

Я боролся со всем этим недавно (в последние несколько месяцев), когда искал Схему, которая могла бы запускать код из Lisp в SmallКусочки, в которых есть куча странных макросов.Гамбит оказался лучшей ставкой.Если у вас нет такой необходимости, посмотрите Ракетки.

...