«Ничего не происходит», потому что 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