На 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 ответ:
Можно указать тип для Аргументов 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