Size: a a a

Clojure — русскоговорящее сообщество

2020 February 09

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
И сама используется в compile-time макроса.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Vyacheslav Mikushev
Использует cljs.analyzer.
но это же апи компилятора, а не рантайм
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Думаешь, что cljs.core не получится использовать?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Vyacheslav Mikushev
Думаешь, что cljs.core не получится использовать?
ну вот человек хочет «простой» макрос

(defmacro deftest
 [sym value]
 (let [value (cljs.core/clj->js value)]
   `(def ~sym ~value)))

дай ему работающее решение, и никому ни о чём больше думать не надо будет :-)
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
если я что-то понимаю, то макросы выполняются в java, а не в js, и никакого вызова js быть не может на этапе компиляции
но, возможно, я тупой, поэтому на заданный вопрос предпочёл промолчать
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
если я что-то понимаю, то макросы выполняются в java, а не в js, и никакого вызова js быть не может на этапе компиляции
но, возможно, я тупой, поэтому на заданный вопрос предпочёл промолчать
учитывая, что то же самое топикстартер не смог сделать макросом в рамках clojure...
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
(defmacro deffoo
 [sym value]
 #?(:clj `(do
            (println "foo clj")
            (def ~sym (cljs.core/clj->js "foo cljs")))
    :cljs (let [value (cljs.core/clj->js value)]
            `(do
               (println "bar cljs")
               (def ~sym "bar cljs")))))
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Только что проверил вот этот макрос. Генерится варка, которая возвращает "bar cljs", следовательно во время макроэкспанешена отрабатывает второй вариант.
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Vyacheslav Mikushev
Только что проверил вот этот макрос. Генерится варка, которая возвращает "bar cljs", следовательно во время макроэкспанешена отрабатывает второй вариант.
а при выполнении программы что отрабатывает?
источник

VM

Vyacheslav Mikushev in Clojure — русскоговорящее сообщество
Я не прав. В обычном clojurescript так не получится сделать.

Macros are written in *.clj or *.cljc files and are compiled either as Clojure when using regular ClojureScript or as ClojureScript when using bootstrapped / self-host ClojureScript. One point of note is that the code generated by Clojure-based ClojureScript macros must target the capabilities in ClojureScript.

Нужен self-hosted clojurescript. Когда я пытался написать макрос в cljs файле, у меня ругнулся на этапе компиляции, что не может найти clj или cljc. Хотя, в документации написано, что
ClojureScript’s macros must be defined in a different compilation stage than the one from where they are consumed. One way to achieve this is to define them in one namespace and use them from another.
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
спасибо все за ответы. в целом я понял, что лучше подумать о другом интрфейса чем что-то пытаться выдумать в этом случае
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Yurii Khmelevskii
спасибо все за ответы. в целом я понял, что лучше подумать о другом интрфейса чем что-то пытаться выдумать в этом случае
ты можешь рассказать о проблеме, которую ты пытаешься решить, может кто чего посоветует
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
и новый вопрос с макросами в cljs 🙂 Я стараюсь как можно больше перенести в компайл тайм, поэтому вопросы и возникают. Подскажите, могу ли я каким-то образом конвертировать js объект в clojure структуры данных. То есть, можно ли как-то сделать это cljs.core/js->clj в clojure
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
и всё равно непонятно, какую задачу ты этим хочешь решить
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
Sergey Trofimov
ты можешь рассказать о проблеме, которую ты пытаешься решить, может кто чего посоветует
спасибо. основная проблема, которую я пытаюсь решить, это вынести как-можно больше простых трансформаций в компайл тайм в cljs. Но макросы для cljs под капотом собираются в clojure от сюда и все проблемы
источник

YK

Yurii Khmelevskii in Clojure — русскоговорящее сообщество
Sergey Trofimov
и всё равно непонятно, какую задачу ты этим хочешь решить
оптимизация. я не хочу делать не нужные трансформации в рантайме
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Yurii Khmelevskii
спасибо. основная проблема, которую я пытаюсь решить, это вынести как-можно больше простых трансформаций в компайл тайм в cljs. Но макросы для cljs под капотом собираются в clojure от сюда и все проблемы
пример «простых трансформаций»?
у тебя нет никаких js объектов на этапе компиляции
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
Yurii Khmelevskii
оптимизация. я не хочу делать не нужные трансформации в рантайме
а не преждевременно ли это?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Yurii Khmelevskii
оптимизация. я не хочу делать не нужные трансформации в рантайме
у тебя js объекты статичные, известные до запуска программы?
источник

DL

Dmytro Lispyvnyi '(🌲 🍺) in Clojure — русскоговорящее сообщество
есть мнение, что макросы нужно использовать лишь тогда, когда нельзя что-то реализовать функцией
источник