Chciałbym zdefiniować specyfikator typu, który opisuje listę rzeczy tego samego typu. Więc chciałbym mieć (list-of integer)
podobny do (array integer)
(który jest wbudowany). Jestem w stanie stworzyć go dla konkretnego typu, tak:W Common Lisp, jak zdefiniować rodzajowy specyfikator typu danych (jak lista liczb całkowitych)?
(defun elements-are-integer (seq)
(every #'(lambda (x) (typep x 'integer)) seq))
(deftype list-of-integer()
'(and list (satisfies elements-are-integer)))
Oznacza to jednak, muszę to zrobić dla każdego możliwego typu. Jak mogę zmienić ten kod tak, aby typ przyjmował inny typ jako argument i konstruować predykat satisfies
w locie? Problem polega na tym, że satisfies
wymaga globalnego symbolu i nie wiem, jak zdefiniować funkcję predykatu we właściwym kontekście (domyślam się, że muszę jakoś to zrobić, ale jak?). Rozwiązanie powinno również działać, aby typ mógł zostać utworzony w innym pakiecie.
Dzięki. Jest to zdecydowanie przydatne, mimo że nie jest to dokładnie to, czego chciałem. –