Обратите внимание, что я не говорю о ушных муфтах в именах символов, проблема, обсуждаемая в Соглашениях, стилях и использовании для Clojure Константы? и Как используется соглашение об именах` * var-name * `, используемое в clojure?. Я говорю строго о случаях, когда есть некоторая функция с именем foo, которая затем вызывает функцию foo *.
Каково соглашение об использовании звездочки в конце имени функции в Clojure и других диалектах Lisp?
Ответ 1
В Clojure это в основном означает, что "foo * похоже на foo, но как-то иначе, и вы, вероятно, хотите foo". Другими словами, это означает, что автор этого кода не смог найти лучшего имени для второй функции, поэтому они просто нанесли на него звезду.
Ответ 2
Математики и Haskellers могут использовать свои апострофы для обозначения похожих объектов (значений или функций). Аналогичное, но не совсем то же самое. Объекты, которые связаны друг с другом. Например, функция foo
может быть вычислением одним способом, а foo'
будет делать тот же результат, но с другим подходом. Возможно, это невообразимое именование, но оно имеет корни в математике.
Lisps вообще (без какой-либо конечной причины) отбрасывают апострофы в именах символов, а *
похож на апостроф. Clojure 1.3, наконец, исправит это, разрешив апострофы в именах!
Ответ 3
Если я правильно понимаю ваш вопрос, я видел примеры, в которых foo*
использовался, чтобы показать, что функция эквивалентна другой теоретически, но использует другую семантику. Возьмите, например, библиотеку lamina, которая определяет такие вещи, как map*
, filter*
, take*
для своих основных типов каналов. Каналы достаточно похожи на seqs, что имена этих функций имеют смысл, но они недостаточно совместимы, чтобы они были "равными" как таковые.
Другой вариант использования, который я видел для стиля foo*
, - это функции, которые вызывают вспомогательную функцию с дополнительным параметром. Например, функция fact
может делегировать fact*
, которая принимает другой параметр, аккумулятор, если он записан рекурсивно. Вы не обязательно должны показывать в fact
, что есть дополнительный аргумент, потому что вызов (fact 5 100)
не собирается вычислять для вас факториал 5 - выставляя этот дополнительный параметр как ошибку.
Я также видел тот же стиль для макросов. Макрос foo
расширяется на вызов функции foo*
.
Ответ 4
нормальная let binding (let ((...)))
создает отдельные переменные параллельно
a Пусть связывание звезд (let* ((...)))
создает переменные последовательно, так что их можно вычислить из eachother, так что
(let* ((x 10) (y (+ x 5)))
Я мог бы немного отступить, но см. LET по сравнению с LET * в Common Lisp для более подробной информации
EDIT: я не уверен, как это отражается в Clojure, я только начал читать Программирование Clojure, поэтому пока не знаю