На Lisp SBCL объявить аргумент функции должен быть список определенного типа для проверки типа


Мне трудно понять, как сказать компилятору SBC, что &rest args для функции должен быть список типов.

В принципе, я хочу превратить что-то вроде этого:

    (defun g (f1 &rest fn)
      (declare (function f1) (list fn)) ... )

К чему-то вроде этого:

    (defun g (f1 &rest fn)
      (declare (function f1) (list-of-fixnums-type? fn)) ... )

Я решил, что смогу это сделать:

    (defun g (f1 fn)
      (declare (function f1) (type (vector function) fn) ... )
Но мне придется использовать вектор вместо списка. Я знаю, что могу использовать предикаты но тогда он не будет делать этого во время компиляции, и мне придется выдавать ошибку вручную.

Это то, что я пытаюсь сделать. возможно?

Я использую SBC 1.3.15

1 2

1 ответ:

Можно указать тип для Аргументов rest при объявлении ftype функции.

(declaim (ftype (function (function &rest fixnum) t)
                foo))
(defun foo (f &rest nums)
  (funcall f nums))

(defun bar ()
  (foo #'princ 345 -432 23 "45" 54)) ; warning: Constant "45" conflicts with its asserted type FIXNUM