SBCL 64bit, 1.1.7ошибка о дополнительных аргументах, для общего LISP
Если я хочу создать пакет и использовать немного символы из пакета: CL, я создам пакет, как этот:
(defpackage :foo
(:import-from :cl
:defun :defmacro :in-package
:null :car :cdr :cons :if
:eq))
Но, в этом пакете, если определить функцию с необязательными аргументами и назвал его без предоставления дополнительных аргументов, я всегда получаю ошибку:
(defun test (&optional a))
(test)
invalid number of arguments: 0
[Condition of type SB-INT:SIMPLE-PROGRAM-ERROR]
Restarts:
0: [RETRY] Retry SLIME interactive evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [REMOVE-FD-HANDLER] Remove #<SB-IMPL::HANDLER INPUT on descriptor 10: #<CLOSURE (COMMON-LISP:LABELS SWANK-BACKEND::RUN :IN SWANK-BACKEND:ADD-FD-HANDLER) {100490B95B}>>
3: [ABORT] Exit debugger, returning to top level.
определить макрос получить ту же ошибку, б ут с дополнительной информацией:
(defmacro test (&rest body))
(test)
error while parsing arguments to DEFMACRO TEST:
invalid number of elements in
()
to satisfy lambda list
(&REST BODY):
exactly 2 expected, but 0 found
[Condition of type SB-KERNEL::ARG-COUNT-ERROR]
Я думаю, может быть, это из-за отсутствия некоторых символов из: CL, так как решить эту проблему? Благодарю.
Это намеренный выбор. Большинство реализаций будут автоматически импортировать CL, если пакеты не указаны, но не делают этого, если указан хотя бы один другой пакет. Если список импортированных пакетов пуст, если пакет не указан, вы, как правило, получаете меньше ошибок в строке. – Vatine
@Vatine: добавление этой несовместимости кажется хуже. Я хочу иметь возможность набирать (defpackage «FOO») в REPL и получать полезный пакет. SBCL - не единственная реализация CL на планете. –
Это не несовместимость, это определенная степень реализации, явно разрешенная стандартом. Если вы хотите создать переносную программу, вам уже пришлось явно предоставить список использования. – Xach