Можно ли программировать без REPL на Лиспе?

Так что я только что получил Land of Lisp и начал делать первую программу. У меня есть пара вопросов.

Есть ли способ просто написать код и запустить его через компилятор или интерпретатор, а не использовать REPL? Мне это не очень нравится. Кажется, я не могу вернуться, если я напортачил. Это просто как бы говорит: «Ха, ты облажался, перепечатай всю эту функцию».

Я также хотел бы знать, в чем смысл REPL.


person Qwe Asd    schedule 29.03.2013    source источник
comment
Проверьте функции compile-file и load Документацию: см. lispworks.com/documentation/HyperSpec/ Front/Contents.htm   -  person Terje D.    schedule 29.03.2013


Ответы (1)


Рабочий процесс без REPL

  1. Отредактируйте файл
  2. Скомпилируйте файл, используя compile-file; исправить ошибки и предупреждения; повторение.
  3. Загрузите файл, используя load; оценить желаемую форму; повторение

Пример

$ cat > f.lisp <<EOF
(defun f (x) (if (zerop x) 1 (* (f (1- x)) x)))
EOF
$ clisp -q -norc -c f.lisp
;; Compiling file /home/sds/f.lisp ...
;; Wrote file /home/sds/f.fas
0 errors, 0 warnings
$ clisp -q -norc -i f.fas -x '(f 10)'
;; Loading file f.fas ...
;; Loaded file f.fas
3628800
$ 

Правильный путь

Используйте IDE, например Emacs со SLIME.

Таким образом, вы редактируете код в редакторе, который поддерживает автоматический отступ и показывает справку для каждого стандартного символа.

Вы компилируете и тестируете функции, как только пишете их, что дает вам очень короткий цикл разработки. Под капотом это достигается за счет взаимодействия IDE с REPL (это ответ на ваш последний вопрос).

Что такое РЕПЛ?

Цикл Read-Eval-Print — это более быстрая и универсальная версия цикла Edit-Compile-Run.

Вместо того, чтобы работать с целыми программами (которые могут быть медленными для компиляции и чье выполнение может быть утомительным, чтобы перейти к конкретному тестируемому месту), вы работаете с точки зрения конкретной функции, над которой вы работаете.

Например, в gdb вы можете выполнить функцию с print my_func(123), но если вы измените my_func, вам придется перекомпилировать файл и перелинковать весь исполняемый файл, а затем перезагрузить его в gdb, а затем перезапустить процесс.

С REPL в стиле Lisp все, что вам нужно сделать, это повторно eval (defun my-func ...), и вы можете сделать (my-func 123) по подсказке.

person sds    schedule 29.03.2013