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

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

Ответы [ 4 ]

47 голосов
/ 23 февраля 2011

В Clojure это в основном означает, что "foo * похоже на foo, но как-то по-другому, и вы, вероятно, хотите foo". Другими словами, это означает, что автор этого кода не смог придумать лучшего названия для второй функции, поэтому они просто ударили звезду по ней.

15 голосов
/ 23 февраля 2011

Математики и Хаскелеры могут использовать свои апострофы для обозначения похожих объектов (значений или функций).Похоже, но не совсем так.Объекты, которые связаны друг с другом.Например, функция foo может быть вычислением одним способом, а foo' даст тот же результат, но с другим подходом.Возможно, это ненормальное именование, но оно имеет корни в математике.

Лисп обычно (без какой-либо предельной причины) отбрасывает апострофы в именах символов, а * напоминает апостроф.Clojure 1.3, наконец, исправит это, допустив апострофы в именах!

8 голосов
/ 23 февраля 2011

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

Другой вариант использования, который я видел для стиля foo*, предназначен для функций, которые вызывают вспомогательную функцию с дополнительным параметром. Например, функция fact может делегировать fact*, который принимает другой параметр, аккумулятор, если он записан рекурсивно. Вам не обязательно показывать в fact, что есть дополнительный аргумент, потому что вызов (fact 5 100) не будет вычислять для вас факториал 5 - выставление этого дополнительного параметра является ошибкой.

Я также видел такой же стиль для макросов. Макрос foo раскрывается в вызов функции до foo*.

0 голосов
/ 22 февраля 2011

нормальная привязка let (let ((...))) параллельно создает отдельные переменные

привязка let star (let* ((...))) создает переменные последовательно, так что они могут быть вычислены из любого другого, как

(let* ((x 10) (y (+ x 5)))

Я мог бы быть немного не в своей тарелке, но смотрите LET против LET * в Common Lisp для более подробной информации

РЕДАКТИРОВАТЬ: я не уверен, как это отражается в Clojure, я только начал читать программирование Clojure, поэтому я еще не знаю

...