Подтвердить что ты не робот

Каково соглашение об использовании звездочки в конце имени функции в Clojure и других диалектах Lisp?

Обратите внимание, что я не говорю о ушных муфтах в именах символов, проблема, обсуждаемая в Соглашениях, стилях и использовании для Clojure Константы? и Как используется соглашение об именах` * var-name * `, используемое в clojure?. Я говорю строго о случаях, когда есть некоторая функция с именем foo, которая затем вызывает функцию foo *.

4b9b3361

Ответ 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, поэтому пока не знаю