Каково соглашение о рассмотрении функции с побочными эффектами в Racket/Scheme?
Очевидно, что в Racket/Scheme принято добавлять восклицательный знак к именам функций, которые выполняют мутацию. Например, в Racket, set!
, box-set!
, vector-set!
и т.д. Некоторые функции имеют побочные эффекты, такие как print
Но поскольку эти побочные эффекты "безвредны", я понимаю, почему они обычно не сопровождаются восклицательными знаками.
Однако это соглашение произвольно нарушается. Например, async-channel-get
а также async-channel-put
четко выполнять мутации, но к их именам не добавляется "маркер мутации". Это может быть несколько оправдано, если указать, что это каналы, явно основанные на мутациях, поэтому "!" было бы лишним.
Это не является оправданием для всего, хотя. Библиотека Racket WebSockets предоставляет ws-send!
а также ws-close!
функции, как с очевидными маркерами, но ws-recv
не! Это просто единичное нарушение конвенции или есть какое-то правило?
Я спрашиваю это главным образом, чтобы быть уверенным в том, как я должен называть функции в своем собственном коде. Когда я должен использовать восклицательный знак, когда я не должен? Я признаю, что это просто соглашение, а не правило, и оно, вероятно, будет несколько непоследовательным, но я все же хотел бы знать, каковы лучшие практики.
1 ответ
Я не думаю, что #! Racket имеет собственное соглашение об именах, но в соответствии с этой страницей R5RS вы можете прочитать:
Названия процедур и синтаксических форм, вызывающих побочные эффекты, заканчиваются восклицательным знаком (!). К ним относятся множество! и векторный набор! Процедуры, которые выполняют ввод или вывод, технически вызывают побочные эффекты, но их имена являются исключениями из этого правила.
В соглашении по именованию переменных в вики Scheme говорится: procedure!
для "значительных побочных эффектов". ИМО, что означает, что побочные эффекты является героем процедуры, как в set-car!
а также set!
в то время как read
возвращает значение, которое, возможно, является основной функцией чтения?