Связаны ли переменные *,+ и / с недавним вводом в SLIME или Clozure CL?

Я возился со SLIME (подключил Clozure REPL), когда обнаружил это:

Похоже, что все переменные +, * и / связаны с некоторым изменением последнего ввода, + — это сам ввод, * — результат оценки этого ввода, а / — результат, содержащийся в списке.

Это правильно? Кто за это отвечает, SLIME или Clozure? В руководстве по SLIME ничего не нашел.

Спасибо!

; SLIME 2010-05-13
CL-USER> +
NIL
CL-USER> *
NIL
CL-USER> /
(NIL)
CL-USER> -
-
CL-USER> +
-
CL-USER> (list 1 2)
(1 2)
CL-USER> +
(LIST 1 2)
CL-USER> /
((LIST 1 2))
CL-USER> (+ 1 2)
3
CL-USER> /
(3)
CL-USER> *
(3)
CL-USER> (* 1 2)
2
CL-USER> *
2
CL-USER> 

person michiakig    schedule 09.09.2010    source источник


Ответы (2)


Все это и многое другое указано в стандарте Common Lisp. Найдите в словаре среды значение 'Variable'.

person Ramarren    schedule 09.09.2010

+
++
+++

Пока форма оценивается циклом верхнего уровня, переменная + привязывается к предыдущей форме, считанной циклом. Переменная ++ содержит предыдущее значение + (то есть форма, оцененная два взаимодействия назад), а +++ содержит предыдущее значение ++.

-

Пока форма оценивается циклом верхнего уровня, переменная - привязывается к самой форме; то есть это значение, которое будет присвоено + после того, как это взаимодействие будет выполнено.

*
**
***

Пока форма оценивается циклом верхнего уровня, переменная * привязывается к результату, напечатанному в конце последнего прохода цикла; то есть это значение, полученное путем оценки формы в +. Если было получено несколько значений, * содержит только первое значение; * содержит ноль, если были созданы нулевые значения. Переменная ** содержит предыдущее значение * (то есть результат, напечатанный два взаимодействия назад), а * содержит предыдущее значение **.

/
//
///

Пока форма оценивается циклом верхнего уровня, переменная / привязывается к списку результатов, напечатанных в конце последнего прохода цикла; то есть это список всех значений, полученных в результате оценки формы в +. Значение * всегда должно совпадать с автомобилем значения /. Переменная // содержит предыдущее значение / (то есть результаты, напечатанные два взаимодействия назад), а /// содержит предыдущее значение //. Поэтому значение ** всегда должно быть таким же, как car //, и аналогично для * и ///.

Из Common Lisp the Language, 2nd Edition 20.2

person Juanito Fatas    schedule 15.02.2012