Как мне программно записать в * стандартный ввод * для оценки в реплее? - PullRequest
0 голосов
/ 04 мая 2020

Я набираю следующее в repl (clozure common lisp)

(defparameter test 1)

Ответ отвечает с test

Теперь я ввожу:

(format *standard-input* "(defparameter test 2)")

Repl выводит (defparameter test 2), затем следует nil.

Но значение теста остается неизменным на уровне 1.

Почему это так? Разве запись в переменную *standard-input* - это не то же самое, что ввод текста в репле?

Как мне достичь желаемой оценки?


Некоторый контекст:

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

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

1 Ответ

2 голосов
/ 04 мая 2020

*standard-input* - это поток input , как следует из его названия. Это поток, из которого вы читаете, а не тот, в который вы пишете. Это также может быть выходной поток, но если он затем записывает в него, он не будет вставлять строки в REPL.

Я бы посоветовал посмотреть SLIME или SLY , если вы хотите понять, как использовать REPL и отладчики, которые взаимодействуют с вещами в потоке. В частности, SWANK , вероятно, является интересным понятием, или эквивалентом для SLY, который представляет собой SLYNK (или slynk, не уверенный в заглавных буквах). Реализации этих протоколов в различных Лиспах не совсем тривиальны, но реализации уже существуют : вам не нужно их писать. Скрининг интерфейса, созданного для взаимодействия с людьми, почти всегда является ужасным подходом: он оправдан только тогда, когда нет лучшего способа, и в этом случае есть лучший способ, на самом деле их как минимум два.

Я не ожидаю, что этот ответ убедит спрашивающего в чем-либо (см. Комментарии), но я оставлю его здесь на случай, если он может пригодиться кому-то в будущем.

...