Size: a a a

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

2021 January 28

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
а ещё лучше
(defn make-thread
 [body]
 (doto (new Thread body)
   (.start)))

😊
я не знаю, рабочий ли это пример, я просто переписал
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
Sergey Trofimov
я не знаю, рабочий ли это пример, я просто переписал
если body это (fn [] …) то рабочий)
источник

A

Andrey in Clojure — русскоговорящее сообщество
Timur Latypoff
Ну в конкретном примере, вместо

(defmacro with-thread
 [& body]
 `(let [thread# (new Thread (fn [] ~@body))]
    (.start thread#)
    thread#))

(def t (with-thread (println 42)))

(.join t)


Лучше писать:

(defn make-thread
 [body]
 (let [t (new Thread body)]
    (.start t)
    t))

(def t (make-thread #(println 42)))

(.join t)


Вместо сложно тестируемого, неочевидного макроса мы получаем простую, композируемую, тестируемую функцию со стектрейсом.
Автор пытается сэкономить одну решёточку печатания, и вместо этого делает спагетти-код.

Поэтому новичкам лучше не писать макросы. А то им дай молоток в руки — они будут им пользоваться постоянно.
(defn make-thread [body]
 (doto (Thread. body)
   (.start)))

Можно не писать макросы, но использовать всё же стоит)
источник

TL

Timur Latypoff in Clojure — русскоговорящее сообщество
Kirill Chernyshov
вот этот
Как по мне — это остроумно, если работает. Но возможны недопонимания с будущим читателем кода (с коллегой или с собой же через три месяца), поэтому лучше учитывать, что код должен быть удобен для чтения и понимания, а не для написания.
источник

TL

Timur Latypoff in Clojure — русскоговорящее сообщество
Andrey
(defn make-thread [body]
 (doto (Thread. body)
   (.start)))

Можно не писать макросы, но использовать всё же стоит)
Использовать написанные умными дядьками — 100% стоит. Половина clojure.core на макросах :)
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
Timur Latypoff
Как по мне — это остроумно, если работает. Но возможны недопонимания с будущим читателем кода (с коллегой или с собой же через три месяца), поэтому лучше учитывать, что код должен быть удобен для чтения и понимания, а не для написания.
ну мне этот кусок коллега показал года два назад, все еще читаемо)
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
и он работает)
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
мальчики, и возможно, девочки - всем спасибо! с тредом понятно, с макросами тоже (пока на них не глядел), с core.async  буду въезжать на досуге. В общем, пока правоверные треды буду запускать и  в future заворачивать посылку в сокет. Пойду бороду подрежу, лысину залижу и соски помою :-)
источник

KC

Kirill Chernyshov in Clojure — русскоговорящее сообщество
фу )
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
а с макросами разберемся, чай не M4  с сендмейлом
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Alexey Cheremisin
а с макросами разберемся, чай не M4  с сендмейлом
ну ты вспомнил…
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Timur Latypoff
Использовать написанные умными дядьками — 100% стоит. Половина clojure.core на макросах :)
да, но писать свои не надо почти никогда, только если альтернативы ну вот ваще нет
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
ну ты вспомнил…
бороду подстриг (и по списку), вот и навеяло :-)
источник

DL

Dmytro Lispyvnyi '(🌲... in Clojure — русскоговорящее сообщество
Alexey Cheremisin
бороду подстриг (и по списку), вот и навеяло :-)
я как вспомню - так вздрогну, хотя уже лет 12 не трогал этот ужос
источник

AC

Alexey Cheremisin in Clojure — русскоговорящее сообщество
Dmytro Lispyvnyi '(🌲 🍺)
я как вспомню - так вздрогну, хотя уже лет 12 не трогал этот ужос
почти 20 не трогаю.... но икается до сих пор! UUCP тогда "наше все" было
источник

DF

Damir Farazetdinov in Clojure — русскоговорящее сообщество
Хочу функу (условно readable-or-nil), которая первым или последним парамтером хавает путь к файлу (или java.io.File) и возвращает либо то же, что схавала, если файл canRead, либо nil.

Чтобы потом использовать в таком скрипте:
(some->
 filepath
 readable-or-nil
 slurp
 clojure.edn/read-string)

Кто-то знает такую функу в std-lib?
Или может кто-то вспомнит, может у slurp'а опция есть не бросать исключение если FileNotFound, а вернуть nil.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(defn wrap-safe [func]
 (fn [& args]
   (try
     (apply func args)
     (catch Exception e))))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(some-> "aaa" ((wrap-safe slurp)))
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
(some-> "project.clj" ((wrap-safe slurp))) 
;; (defproject...
источник

Г

Григорий in Clojure — русскоговорящее сообщество
Как этот проэкт забилдить?
https://github.com/Gonzih/cljs-http-reagent-learning-template
источник