Управление слизью в Emacs, пользовательский ввод, мульти-оценка и печать - PullRequest
0 голосов
/ 19 октября 2019

Я нахожусь на Ubuntu 19. Использование emacs, slime и sbcl, чтобы попрактиковаться в некоторых словах.

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

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

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

(defvar *name* (read))

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

Почему?

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

1 Ответ

0 голосов
/ 22 октября 2019

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

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

...