Плохо быть указателем типа: число - PullRequest
3 голосов
/ 05 ноября 2019

number является спецификатором типа: CLtl2 4.1 Символы спецификатора типа

Однако я не могу использовать его с declaim:

(defparameter *foo* 0)
(declaim (type (number) *FOO*))

=>

bad thing to be a type specifier: (NUMBER)
   [Condition of type SIMPLE-ERROR]

(typep *FOO* 'number) - это T.

Так что я должен использовать (or integer float)?

Чего мне не хватает?

спасибо

SBCL1.4.5

Ответы [ 2 ]

6 голосов
/ 05 ноября 2019

CLtL2 не является полномочным для Common Lisp. CLtL2 описывает язык до стандартизации ANSI.

Используйте Common Lisp HyperSpec, который получен из стандарта ANSI CL: CLHS 4.2.3 Спецификаторы типа .

NUMBER - это спецификатор атомарного типа .

Спецификаторы типа, которые можно записать в виде списка с информацией вспомогательного типаназываются спецификатор составного типа , а некоторые спецификаторы только составного типа .

В глоссарии говорится:

атомарный спецификатор типа n. спецификатор типа, который является атомарным. Для каждого атомарного спецификатора типа x существует эквивалентный спецификатор составного типа без предоставленных аргументов (x).

Это будет означать, что (number) является допустимым спецификатором типа. Некоторые реализации принимают его: LispWorks, ABCL, GCL, ...

Поскольку глоссарий является частью стандарта, это может быть ошибкой и / или упущением в SBCL, CLISP, Clozure CL,...

Тогда использование спецификаторов типов допустимо:

(declaim (type number *FOO*))
(declaim (type (number) *FOO*))

(typep *FOO* 'number)
(typep *FOO* '(number))
3 голосов
/ 05 ноября 2019

Пока символ number равен спецификатор типа , список (number) равен не .

Пожалуйста, используйте

(declaim (type number *FOO*))

вместо.

PS1 . Я рекомендую вам использовать CLHS, а не CLtL2 в качестве ссылки. Первый основан на официальном стандарте ANSI CL, а второй устарел.

PS2 . Обратите внимание, что number является (or real complex), а не (or integer float).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...