Как в Scheme, так и в Racket процедуры predicate заканчиваются на ?
идиоматично. Поскольку существуют определенные ожидания из-за истории и соглашений, связанных с такими процедурами, отклонение от этого соглашения считается плохой практикой. В стандартах Схемы даже есть язык, формализующий эту практику (Соглашения об именах R6RS 6.7):
По соглашению имена предикатов — процедур, которые всегда возвращают логическое значение — заканчиваются на «?» когда имя содержит любые буквы; в противном случае имя предиката не заканчивается знаком вопроса.
Теперь и в Scheme, и в Racket предикат — это процедура, которая всегда возвращает логическое значение, то есть #t
или #f
. Если критикуемые процедуры не всегда возвращали #t
или #f
, то они не соответствовали модели соглашений об именах для предикатов. Если это не так, то трудно понять, как они могли потерпеть неудачу, не видя фактических определений.
member
— это пример процедуры Racket, которая может использоваться как предикат, но на самом деле не является предикатом по соглашению или по языку спецификации. Эта процедура возвращает #f
, если искомое значение не является членом списка, но возвращает конец списка, начинающийся с искомого значения, если он является членом списка (этот хвост списка является истинным значением, но не логическим #t
). Обратите внимание, что member
не заканчивается знаком вопроса. Если OP belongs?
ведет себя так же, как member
, то профессор определенно был прав, когда классифицировал это наименование как плохую практику.
Обратите внимание, что в других lisp'ах используются другие соглашения относительно предикатов. Например, в Common Lisp не принято (и не считается хорошей практикой) использовать ?
в имени предиката.
person
ad absurdum
schedule
01.03.2021