«Ничего не происходит», потому что 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)
Конечно, я мог бы сказать гораздо хуже, чем это Лиспу.