This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-03-21
Channels
- # beginners (38)
- # boot (88)
- # cljs-dev (142)
- # cljsrn (2)
- # clojars (1)
- # clojure (107)
- # clojure-berlin (2)
- # clojure-italy (8)
- # clojure-russia (76)
- # clojure-spec (325)
- # clojure-taiwan (3)
- # clojure-uk (28)
- # clojurescript (80)
- # clojurewest (2)
- # core-async (36)
- # core-logic (1)
- # cursive (21)
- # datomic (16)
- # dirac (18)
- # docs (2)
- # emacs (1)
- # euroclojure (3)
- # garden (3)
- # gsoc (2)
- # hoplon (3)
- # immutant (4)
- # jobs-discuss (16)
- # lein-figwheel (5)
- # liberator (17)
- # lumo (19)
- # off-topic (2)
- # om (20)
- # onyx (28)
- # pedestal (50)
- # planck (4)
- # re-frame (5)
- # reagent (3)
- # ring-swagger (13)
- # spacemacs (1)
- # specter (43)
- # testing (3)
- # timbre (3)
- # uncomplicate (1)
- # vim (2)
- # yada (4)
@maxp например так
(defmacro log [level message]
`(do
(def msg ~message)
(let [m# (select-keys (meta #'msg) [:file :line :column])
source# (str (:file m#) ":" (:line m#) ":" (:column m#))]
(clojure.tools.logging/log ~level (str source# " " msg)))))
(log :info "some string")
грязно, но работает
тут вот иначе сделано - https://github.com/ptaoussanis/timbre/blob/master/src/taoensso/timbre.cljx#L534
как раз из-за def и считаю что это грязновато) но meta работает только для var ( так что так и не смог найти более элегантного решения
file сам по себе норм, но не дает ни строки ни столбца откуда вызов происходит
это nil всегда же
первый раз такую штуку вижу, не очень понятно что это такое
действительно работает, крутяк
то есть, как я понимаю тут просто надо так написать?
(defmacro log [level message]
`(do
(let [m# (select-keys (meta &form) [:file :line :column])
source# (str (:file m#) ":" (:line m#) ":" (:column m#))]
(clojure.tools.logging/log ~level (str source# " " msg)))))
(log :info "some string")
(defn- fsource [and-form]
(let [m (meta and-form)]
(str *file* ":"
(:line m) ":"
(:column m))))
(defmacro log [level message]
`(clojure.tools.logging/log ~level (str ~(fsource &form) " " ~message)))
вот так получилось
забавно, но у &form нет в метадате :file, поэтому нужно использовать *file*
переменную
а это в CLJS работает?
скорей всего да
я что-то похожее делал для переводов a-la gettext
но надо проверить
нашел немного про &form http://blog.jayfields.com/2011/02/clojure-and.html
где угодно, но разумно полоджить там же где макрос определен
а не, конечно же нет, она выполниться когда будет развернут макрос
там же ~(fsource &form)
если ее не будет в том неймспейсе где определен макрос, то да
ее не обязательно реквайрить в тех неймспейсах где ты этот макрос будешь использовать
там что-то с настройками надо сделать что бы было как раньше)
;;;;;; log macro ;;;;;;
;; <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %level %logger{16} %msg%n</pattern>
(defn- source-line [frm]
(:line (meta frm)))
;
(defmacro log-debug [message & args]
`(clojure.tools.logging/logp :debug
(str ~(source-line &form) ": " ~message)
~@args))
;
(defmacro log-info [message & args]
`(clojure.tools.logging/logp :info
(str ~(source-line &form) ": " ~message)
~@args))
;
(defmacro log-warn [message & args]
`(clojure.tools.logging/logp :warn
(str ~(source-line &form) ": " ~message)
~@args))
;
(comment
(log-debug "!debug!" 1 2 3)
(log-info "!info!" 1 2 3)
(log-warn "!warn!" 1 2 3))
;
это по умолчанию
а можно ли ротировать это для разных случаев?
разобрался - это просто от мажорного мода зависит
Привет всем. А что есть хорошего почитать по низкоуровневой стороне функциональных ЯП. Туда, в сторону железа и stack-based архитектуры cpu этой ленивости и higher order functions.. по сути о компиляции(интерпретации) в машиночитаемый код. хорошо бы без привязки к конкретной имплементации (яп).
а то есть литература о компиляторах (си и вниз), есть о фп (вверх) а мостик чета не налаживается
Тут Тим Балдридж в соседней ветке интересные мысли выдает. У него спросили как было бы здорово если бы clojure комплилась в статичный код или хотя бы выполнялась на Go рантайме.
Even if you could compile Clojure to Go, I doubt it will be fast. There's a lot of stuff required by a functional language that Go just simply doesn't have.
I could imagine something like that really stressing Go's virtual dispatch and GC past the limits for which it was designed. (Tim Baldridge)
Hence my favorite saying: "You say X is faster than the JVM? Is it parallel, GC'd, dynamically JIT'd, dynamically typed, capable of handling tens of GB of data? If not...it's apples to oranges..."
просто понравились, довольно емкие цитаты
@andmed Вот бумажка: https://www.dcc.fc.up.pt/~pbv/aulas/linguagens/peytonjones92implementing.pdf а вот книжка: https://www.microsoft.com/en-us/research/publication/the-implementation-of-functional-programming-languages/
о фега се, книжка от Simon Peyton Jones, одного из авторов хаскеля, ня
@mike1452 начитался тут умных мыслей что де в динамически типизированном языке нельзя поиметь GC. Но там неглупые люди тоже, решат. Что за ветка?
@dottedmag спасибо большое, посмотрю
Я бы и про обычно совершенно почитал. Aho дает примеры компиляции статического кода, до higher order functions не добирается