Рассмотрим следующий макрос:разница между пусть и пусть * в Clojure
(defmacro somemacro []
(list 'let ['somevar "Value"] 'somevar))
Расширяя это дает следующий результат:
(macroexpand '(somemacro))
Результат:
(let* [somevar "Value"] somevar)
У меня есть два вопроса около let * (со звездой):
- Что это значит? (В частности: где-то это документировано?)
- Почему макрос не расширен с помощью «нормального» let? (I.e., пусть без звездочки.) Оба дают тот же результат (в моих экспериментах). Есть ли встречный пример?
К сожалению, я не могу найти официальную документацию о let *, поэтому я прошу здесь.
Источники я уже рассматривал:
(doc let*) ; --> nil
(source let*) ; --> source not found
- https://clojuredocs.org/clojure.core -> я не знаю, пусть * здесь (хотя есть, например, список *)
- https://clojuredocs.org/clojure.core/let -> упоминается только один раз в комментарий, который не совсем ясен для меня:
Nota Bene: let Clojure - это как пусть * в схеме - каждый init-expr имеет доступ к th предшествующие формы связывания. (Существует также пусть *, но это более или менее пусть без деструктуризации, а на самом деле является основной реализацией.)
- LET versus LET* in Common Lisp -> этот вопрос о Common Lisp, но, возможно, это то же самое в Clojure?
- Ответ: https://stackoverflow.com/a/5084339/3398271
В Clojure это в основном означает "Foo *, как Foo, но почему-то разные, и вы, вероятно, хотите Foo". Другими словами, это означает, что автор этого кода не смог найти лучшего имени для второй функции, поэтому они просто набросали на него звезду.
-> Является ли это в случае пусть и пусть *? Но если это так, остается вопрос, какая разница?
- What is the difference between let and let* in Scheme? -> Это то же самое в Clojure?
Существует, по-видимому, пара 'if' и' if * '. Как и с 'let', документация найти нелегко. Я не знаю, что «если» разрушает, поэтому что-то еще должно продолжаться. –
@ Reb.Cabin, Интересно. Если 'if *' не документируется, он, вероятно, является внутренним и не предназначен для потребления. Я посмотрел источник Clojure на GitHub, но поиск GitHub разделил «*». Есть много случаев 'if'. Я полагаю, что ответ заключается в том, чтобы загрузить источник локально и запустить 'grep' локально. –