Каково значение '?'в Ракетке? - PullRequest
1 голос
/ 07 марта 2019

Пример :

(number? v) → boolean?

  v : any/c

Я понимаю '?'за «числом», но за вторым «?», за «логическим» меня раздражает.Означает ли это, что может возвращает логическое значение, а может и нет?

Изменить для ясности

Я пришел из Python, для меня это читаеткак: is_number::function returns is_boolean::function, а не is_number::function returns bool::bool.

Решение

Как пояснил Жером, оно выглядит так:

is_number(v) returns b where is_boolean(b) == True

1 Ответ

4 голосов
/ 07 марта 2019

boolean? является предикатом.Это функция, которая (по соглашению) имеет в конце вопросительный знак, чтобы показать, что ее можно использовать для проверки типа значения и возврата логического значения, например:

> (boolean? #f)
#t
> (boolean? "hello")
#f

По умолчанию Racket isдинамически типизированный, поэтому для отображения информации о типе в документации предикаты используются в качестве аннотации типа .

Таким образом, (number? v) → boolean? в основном означает «Функция number? возвращает»значение, которое при передаче предикату boolean? возвращает true ".

Это становится полезным, когда у вас есть более сложные предикаты:

(pick-random-stuff bag?) → (listof (or/c toy? food? paperclip? aligator?))

Эта функция возвращает список, содержащий любое количествоиз этих различных объектов в любом порядке.

Примечания

Рекомендуется всегда называть свои предикаты символом ? в конце.

Возможно, у вас естьхотя заметил, что в моих примерах listof и or/c не имеют вопросительных знаков.Это потому, что они не являются предикатами сами по себе, а являются функциями, которые создают предикаты.

В большинстве языков lisp, таких как Scheme, Racket, Clojure или Common Lisp, многие символы, имеющие определенные значения в других языках, просто допустимыидентификаторы.?, =, -, ->, + разрешены внутри имен переменных и функций.

...