Плохая ли практика? в имени метода Racket?

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

Итак, мой вопрос: это действительно плохая практика или нет? и если это плохая практика, зачем рэкет использовать ее?


person Bruno Leanza    schedule 01.03.2021    source источник
comment
Заявление о том, что что-то является плохой практикой, без предоставления обоснования, на самом деле не является действительным аргументом. Спросите своего профессора, почему это плохая практика.   -  person Robert Harvey    schedule 01.03.2021
comment
Не могли бы вы объяснить, что делают ваши методы? Как упоминалось ad absurdum, они не могут быть предикатами.   -  person Cecil Cox    schedule 01.03.2021


Ответы (2)


В соответствии с собственным Руководством по стилю предикатов и функций с логическими значениями в кодовой базе Racket должно заканчиваться в 1_. belongs? и has-fever?, кажется, соответствуют этим требованиям, поэтому я подозреваю, что это во вкусе вашего профессора.

person Cecil Cox    schedule 01.03.2021

Как в 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
comment
Вы правы, я не упомянул возвращаемое значение. И я использую только ? когда метод возвращает логическое значение, т. е. #t или #f. Спасибо за ваше наблюдение. - person Bruno Leanza; 02.03.2021