Ошибка в вызове функции

Я начал изучать Lisp по книге Питера Сайбеля, "Практическое использование Common Lisp", создавая по примеру базу данных я столкнулся с проблемой, такой код:

(defvar *db* nil)

(defun dump-db ()
  (format t "~a:~10t~a~%~%" *db*))

(dump-db)

Выдаёт ошибку:

*** - APPLY: слишком мало аргументов для #<COMPILED-FUNCTION DUMP-DB-1>

Прежде чем задать вопрос, я почитал о чём пишут на других ресурсах, но моей ситуации не нашёл.

P. S. Вместо Lisp in a Box, как в книге, я использую gnu clisp + vim


Ответы (2 шт):

Автор решения: Pak Uula

Какой версией clisp вы пользуетесь? У меня GNU CLISP 2.49.60+ выводит вполне понятное сообщение:

*** - There are not enough arguments left for this format directive.
      Current point in control string:
        "~a:~10t~a~%~%"
                |

Директива ~a печатает значение аргумента, ~10t выводит табуляцию до колонки 10, ~% печатает перевод строки. У вас в формате две директивы ~a и всего один аргумент. Попробуйте так:

(defun dump-db ()
  (format t "~a:~10t~a~%~%" "*DB*" *db*))
→ Ссылка
Автор решения: Hellseher

Макрос format читает список аргументов и заменяет ими поля в контрольной строке.

Для вашего случая подойдет ~1:* - вернутся на один шаг назад по списку аргументов и применить его снова.

(defvar *db* nil)

(defun dump-db ()
"Дублирует каждый аргумент дважды."
 (format t "~a:~t~1:*~%" *db*))
CL-USER> (dump-db)
NIL NIL

Ссылки

→ Ссылка