Управление слизью в Emacs, ввод данных пользователем, многократная оценка и печать

Я использую ubuntu 19. Использую emacs, slime и sbcl, чтобы попрактиковаться в шепелявости.

В настоящее время у меня есть один буфер в режиме слайма в одном окне и описание слайма в другом окне.

Когда я хочу выполнить строку, я записываю ее в буфер и нажимаю C-c C-p.

Но когда я пытаюсь сделать то же самое для линии

(defvar *name* (read))

чтобы установить переменную name с пользовательским вводом, ничего не происходит.

Почему ?

Также я хотел бы выполнять весь сценарий, а не по одной строке за раз, как мне это сделать?


person Robert Reynolds    schedule 19.10.2019    source источник
comment
Учебное пособие: youtube.com/watch?v=_B_4vhsmRRI   -  person Rainer Joswig    schedule 19.10.2019


Ответы (1)


«Ничего не происходит», потому что read ждет, чтобы вы что-то напечатали в REPL. Если вы посмотрите на REPL, вы будете сбиты с толку, потому что форма, которую вы оцениваете, не отображается, поэтому все, что вы видите, это ... ничего, но вам нужно что-то напечатать в ней. Кроме того, из вашего описания не ясно, какие буферы вы отображали, но я подозреваю, что REPL не является одним из них, что только ухудшит ситуацию.

Я не знаю, как другие люди используют SLIME, но я должен иметь хотя бы REPL (то, что вы получаете, набрав M-x-slime в одном окне, и файл, над которым я работаю в другом. Затем вы можете взаимодействовать с REPL, просто набрав его, и отправьте код в работающий lisp из файла с помощью C-M-x или любой другой команды (в частности, таких как C-c C-k, который компилирует и загружает файл.

Однако вы почти никогда не хотите, чтобы файл, который вы компилируете или загружаете, включал что-либо, вызывающее read во время компиляции или загрузки: результаты будут, мягко говоря, загадочными: система просто остановитесь без подсказки, ожидая, что вы что-то напечатаете. Гораздо больше смысла делать это в REPL:

CL-USER> (defvar *name* (read))
(here is the data I am typing in)
*NAME*

В самом деле, даже когда вы делаете все возможное, чтобы сделать вызовы read не таинственно в загружаемых файлах, вам придется пойти еще дальше, чтобы сделать их безопасными. Рассмотрим этот файл toxin.lisp:

(defvar *my-thing*
  (progn
    (format *query-io* "~&thing? ")
    (finish-output *query-io*)
    (read *query-io*)))

Теперь:

$ lisp
[...]
(load "toxin" :verbose t)
;Loading #P"toxin"...
thing? #.(quit)

Конечно, я мог бы сказать гораздо хуже, чем это Лиспу.

person Community    schedule 22.10.2019