В схеме мы просто определили для всего определения, почему Clojure и Lisp используют разные ключевые слова для разных объявлений?В чем смысл использования def и defn вместо определения?
ответ
Они определяют различные типы объектов (функции, специальные переменные, макросы, структуры, классы, общие функции, методы, пакеты). В Common Lisp они также находятся в разных пространствах имен. Различные формы определения также имеют различный синтаксис (схема-х define
сочетает переменное и функцию определения. Но можно определить класс?)
defn
, defmacro
, defstruct
и такие просто макросы для определения их соответствующей структуры, что делает ненужным писать шаблонный код. Например, defn
облегчает писать функции, так как вам больше не придется беспокоиться о вводе в термине лямбды (который вы можете сделать в схеме просто брекет аргументов сразу после того, как имя определяется):
Схема:
(define hello
(lambda (name)
(display (string-append "hello, " name))))
(define (hello name)
(display (string-append "hello, " name)))
Clojure:
(def hello
(fn [name]
(println (str "hello, " name))))
(defn hello [name]
(println (str "hello, " name)))
Вы можете посмотреть на defn
как mnemomic устройство для def
+ fn
. Такие ярлыки делают меньше кодировки и делают код более простым для чтения в целом. Я преподаю кому-то, как программировать Scheme на данный момент, и я заставляю их использовать длинные формы, чтобы они всегда имели в виду, что делает этот язык (и по достоинству оценят макрос сохранения работы, когда они наконец начнут используя их).
Формы define
или def
дают название следующему выражению. Форма или fn
дает имя набора привязок при использовании в выражении define
или def
. В этом случае вещи начинают усложняться, а использование макросов помогает вам здравомыслящим и защищает вас от печатания скуки.
Ваша схема там неправильная - имя функции и аргумент должны быть заключены в скобки. Кроме того, ваше объяснение - лишь малая часть всей картины.«Сахарная» версия определений Scheme - это «не *», чтобы избежать кода шаблона - его проще использовать (особенно для новичков), так как вещь, которая определена *, выглядит как * ее использование. Другими словами, вы определяете что-то, что похоже на символический шаблон для последующего использования функции. –
Вы правы. Пытается держать слишком много разных пятен в голове сразу. Схема - это нечетное выделение на этом конкретном кусочке сахарирования, и поскольку я не очень много использовал Схему и избегаю сахарообразной формы, когда я это делаю, я взорвал ее. Исправленный. – Pinochle
Я не заметил, что маленький когнитивный «примитивный трюк» играет сахаристская форма, которая предвосхищает будущее использование функции в s-выражении, аккуратно. Я этого не заметил, по крайней мере, не сознательно. Что-то всегда беспокоило меня об этой форме, и теперь я знаю, что это такое. Исходный трюк зависит от того, как мозг понимает, что синтаксис 'define' не имеет никакого отношения к s-выражению, а не дает значение имени (атому). Наверное, это то, что подсознательно отметил «семантическая неточность», вызвало у меня беспокойство. – Pinochle
def
в Clojure - специальная форма, и приятно хранить специальные формы как можно более простые и примитивные. defn
- это макрос, который добавляет сахар для легкой установки docstrings и метаданных, и (как говорили другие) устраняет необходимость в посторонних парнах. defn
также автоматически настраивает некоторые метаданные самой функции (показывая арбитров и т. Д.), Что не имеет смысла для общего def
.
Функции, безусловно, являются наиболее распространенной вещью, которую вы собираетесь определять для верхнего уровня в Clojure. Изменчивые переменные Toplevel обескуражены. Поэтому имеет смысл иметь простой и быстрый способ определения функции верхнего уровня. Использование def
для всего, что приведет к большому количеству шаблонов. Если бы не было defn
, мы бы все изобрели его сами, чтобы не досаждать до смерти.
«defn - это макрос, который добавляет сахар для удобства установление docstrings и метаданных »: Но даже такие переменные могли бы извлечь выгоду из таких функций. Этот аргумент был бы прав только в том случае, если аргумент состоял в том, что defn должен вести себя как def.« def для всего приведет к большому количеству шаблонов ». Не могли бы вы рассказать на его это следует? Схема кода, как сказал Эли, использовать определение для обозначения переменных, функций и классов ... без каких-либо шаблонов. – kanak
- 1. В чем смысл "@" выше "def"?
- 2. В чем смысл следующего определения функции?
- 3. Clojure def vs defn для функции без аргументов
- 4. В чем смысл def some_method (param: int) синтаксис?
- 5. В чем смысл использования -start и -end директив в angularjs?
- 6. В чем смысл использования 0x1 в #define?
- 7. В чем смысл использования LinearLayoutManger в RecyclerView?
- 8. В чем смысл использования значков W3C?
- 9. В чем смысл использования названного выражения функции?
- 10. В чем смысл использования $ _SERVER ['document_root']?
- 11. В чем смысл использования фреймворка регистрации?
- 12. В чем смысл `!! empty?`?
- 13. Python - в чем смысл использования True :?
- 14. В чем смысл использования «rm -P»?
- 15. В чем смысл использования классов именования Qt?
- 16. В чем смысл использования «while (true) {...}»?
- 17. В чем смысл использования git-псевдонима?
- 18. В чем смысл использования Java-дженериков?
- 19. В чем смысл использования объекта без ошибок?
- 20. FOSUserBundle: в чем смысл?
- 21. В чем смысл использования директив #ifdef и #endif в iPhone?
- 22. Определение функции встроенных модулей Clojure: def vs defn
- 23. В чем смысл * и * * в селекторах CSS
- 24. Использование делегата вместо создания ассоциации в Rails. В чем смысл?
- 25. В чем преимущество использования epoll_create1() вместо epoll_create()
- 26. JSTL: В чем смысл?
- 27. В чем смысл this.foo()?
- 28. В чем смысл ## в коде определения в C++
- 29. В чем смысл использования * обоих * Возврат каретки и линейные каналы?
- 30. В чем смысл использования пустой строки и NULL по-разному?
У схемы нет классов. И «define» действительно определяет переменные - «lambda» определяет функции. (define (a b c) ...) эквивалентно (define a (lambda (b c) ...)) –
В схеме 'lambda' does * not * определяет функцию, она только создает ее. 'define' используется для * all * определений. И да, у «Схемы» нет классов, но практически во всех системах классов Scheme (и почти во всех реализациях есть какая-то система OO) 'define' также используется для определения классов, просто случается, что выражение, которое используется в определение оценивается классом. –