The Common Lisp Hyperspec page for print
упоминает об этом:Зачем печатать выходные данные Common Lisp перед новой строкой, а затем пробел?
печать так же, как prin1 за исключением того, что выводимое представление объекта предшествует символ новой строки и последующим пробелом.
Это первый раз, когда я видел такую функцию, и это меня выбросило с первого раза, когда я ее использовал, потому что я никогда не ожидал, что функция с таким общим именем может включать в себя необычную функцию.
Я ищу оригинальную причину. Я знаю, что это может быть просто потому, что это могло бы сделать другое, то есть общее lisp, и простой вариант просто принял его, но если это так, я ищу причину дизайна в этом другом lisp.
Я предполагаю, что это может быть связано с обеспечением того, чтобы выход всегда читался с read
прямо из print
. Хотя я бы предпочел новую строку для этого, я могу догадаться, что конечное пространство может быть таким, что в потоке read
может знать, что это конец объекта и немедленно вернуть его, не дожидаясь остальной части потока (следующие print
с). Тем не менее, я до сих пор не могу понять цель, лежащую в основе предшествующей новой строки.
Я просматривал HyperSpec, но я не могу найти причину упоминания.
EDIT:
Я посмотрел в предшественник Common-Lisp в частности, INTERLISP, Maclisp и предшественник Maclisp в Лиспе 1.5.
Interlisp (страница 145 в this pdf) и функция Lisp 1.5 (страница 140 в this pdf) print
функция распечатывает объект, за которым следует новая строка.
Кажется, что MacLisp представил эту разницу. Я не нашел причину в первоначальном справочном руководстве, и я только нашел следующие on this revised reference manual:
Как PRIN1, PRINT выводит объект в файл в форме, которая может быть понята READ. Тем не менее, объект выводится с символом новой строки, за которым следует пробел, так что повторные вызовы PRINT могут быть выполнены без завершения одного объекта в начале следующего.
Конечно, для этой цели хватило бы новой строки в исходном определении, поэтому эта причина кажется нецелесообразной.
EDIT 2:
Как показывает ответ Райнера Joswig, это кажется, что это изменение появилось в Лисп 1.6 перед тем Maclisp.
Я просто догадываюсь, но я бы сказал, что ведущая новая строка - это просто вариант на задней новой строке (один стандарт, возможно, так же хорош, как и другой); и что конечное пространство связано с тем, что, когда «print» был сначала написан, вам нужно переместить печатающую головку механического TTY в сторону, чтобы вы могли видеть, что было написано. – Dolda2000
@ Dolda2000 Изучив предшественники CL и обнаружив, что изначально 'print' _did_ просто выводит конечную новую строку в Lisp 1.5, это кажется маловероятным. – JoL