Если я правильно понимаю ваш вопрос, я видел случаи, когда foo*
использовался, чтобы показать, что функция эквивалентна другой в теории, но использует другую семантику. Возьмите, например, библиотеку lamina , которая определяет такие вещи, как map*
, filter*
, take*
для своего основного типа, каналы. Каналы достаточно похожи на seqs, так что имена этих функций имеют смысл, но они не достаточно совместимы, чтобы они были «равны» как таковые.
Другой вариант использования, который я видел для стиля foo*
, предназначен для функций, которые вызывают вспомогательную функцию с дополнительным параметром. Например, функция fact
может делегировать fact*
, который принимает другой параметр, аккумулятор, если он записан рекурсивно. Вам не обязательно показывать в fact
, что есть дополнительный аргумент, потому что вызов (fact 5 100)
не будет вычислять для вас факториал 5 - выставление этого дополнительного параметра является ошибкой.
Я также видел такой же стиль для макросов. Макрос foo
раскрывается в вызов функции до foo*
.