Я хочу анализировать и улучшать ваш код, одновременно отвечая на ваши вопросы.
Стандартный отступ - два пробела.
(defun print-to-lines (slist)
(cond
((null slist) slist)
(t (let ((empty (write-line (car slist)))) (print-to-lines (cdr slist))))))
Вам разрешено создавать новые строки между любыми двумя токенами.
(defun print-to-lines (slist)
(cond
((null slist) slist)
(t (let ((empty (write-line (car slist))))
(print-to-lines (cdr slist))))))
Вещество после условия в cond
форме оценивается в
неявный progn
. Вам не нужно называть значение, которое выбрасывается
все равно прочь.
(defun print-to-lines (slist)
(cond
((null slist) slist)
(t (write-line (car slist))
(print-to-lines (cdr slist)))))
Чтобы ничего не возвращать, используйте values
. Обратите внимание, что это обычно
необязательно, так как возвращаемое значение не является частью вывода; это
просто отображается с помощью REPL (в среде подсветки синтаксиса,
программный вывод и вывод REPL обычно имеют разные цвета). Заметка
кроме того, values
также может использоваться для возврата нескольких значений.
(defun print-to-lines (slist)
(cond
((null slist) (values))
(t (write-line (car slist))
(print-to-lines (cdr slist)))))
Обратите внимание, что явная рекурсия здесь не нужна. Некоторые другие, более краткие идеи:
(defun print-to-lines (slist)
(dolist (string slist)
(write-line string)))
(defun print-to-lines (slist)
(mapcar #'write-line slist))
(defun print-to-lines (slist)
(format t "~{~a~%~}" slist))