clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
rustam.gilaztdinov 2017-11-14T09:29:22.000455Z

Всем привет! Некоторое время назад наткнулся на канал Timothy Baldridge на ютубе с туториалами https://www.youtube.com/channel/UC6yONKYeoE2P3bsahDtsimg/videos Заинтересовался, но стоит денег 💸 Решил потратиться, купил, посмотрел, про core.logic понравилось, и про transduce Но ситуация с тем, что и эти видео платные, плюс, например, lambdaisland тоже работает по подписке — меня очень печалит. И так в кложу неофиты не приходят, так тут еще и туториалы платные, ужс какой-то. В тредике ссылка на Я.Диск, со всеми видео с канала, кому интересно, пользуйтесь!

😐 1
rustam.gilaztdinov 2017-11-14T09:29:38.000505Z

https://yadi.sk/d/FLtrKRdy3PgM9P

kuzmin_m 2017-11-14T10:14:49.000373Z

на youtube есть 2 недели триала, или вроде того ну и как бы человек старался - можно поддержать

rustam.gilaztdinov 2017-11-14T10:21:11.000266Z

Ну кто хочет, пусть поддерживает. А кто не хочет -- пожалуйста, смотрите.

dima 2017-11-14T10:41:45.000227Z

В тему видео курсов, есть еще такой ресурс: https://purelyfunctional.tv/courses/understanding-re-frame/

akond 2017-11-14T11:25:20.000034Z

сколько там гигов?

igrishaev 2017-11-14T13:15:25.000136Z

Вот я не пойму, зачем распространять. Ты же нарушаешь соглашение. Тебя же никто не просил об этом. И деньги ты все равно не вернешь.

dottedmag 2017-11-14T13:20:34.000147Z

Из ложно понимаемого альтруизма.

igrishaev 2017-11-14T13:23:42.000128Z

боже, там 3.99 в месяц.

dottedmag 2017-11-14T13:29:06.000246Z

Странно, когда за курсы берут деньги в месяц. Дополнительные поборы тугодумов и занятых? 🙂

igrishaev 2017-11-14T13:30:08.000564Z

Нынче везде подписка, и в общем-то это правильно.

akond 2017-11-14T13:44:34.000215Z

В налоговую когда приходишь к инспектору, он тебе тоже делает подписку на их газету.

akond 2017-11-14T13:50:27.000492Z

Но там rent явление частое, поэтому для них это нормально.

kuzmin_m 2017-11-14T14:03:04.000338Z

а есть какой-нибудь приличный способ делать что-то вроде такого?

(with-conn 
  (fn [conn]
    (foo conn))
может быть как-то так?
(with with-conn conn
  (foo conn))
Названия тут страшненькие, но не суть. Понятно, что решается простым макросом, может быть есть что-то общепринятое?

akond 2017-11-14T14:04:33.000297Z

это как способ прокидывания зависимостей?

kuzmin_m 2017-11-14T14:04:52.000716Z

не совсем

kuzmin_m 2017-11-14T14:07:06.000046Z

изначально я хочу делать после тестов rollback и в clojure.jdbc не получается сделать декоратор над datasource по этому пробрасывается функция with-conn

igrishaev 2017-11-14T14:07:21.000255Z

а, вот что тебе нужно

kuzmin_m 2017-11-14T14:07:40.000088Z

ну и бывает желание сделать что-то вроде руби блоков но тут уже руби головного мозга)

igrishaev 2017-11-14T14:07:56.000307Z

(defmacro with-trx-test [& body]
  "Like with-trx, but rolls back the top-level transaction."
  `(conman/with-transaction [*db*]
     (jdbc/db-set-rollback-only! *db*)
     ~@body))

igrishaev 2017-11-14T14:08:33.000271Z

этот макрос откатит транзакцию по выходу, неважно был эксепшен или нет

kuzmin_m 2017-11-14T14:08:50.000489Z

пойду почитаю про db-set-rollback-only!

igrishaev 2017-11-14T14:09:11.000305Z

только замени conman/with-transaction на jdbc/with-db-transaction

kuzmin_m 2017-11-14T14:09:13.000064Z

https://github.com/funcool/clojure.jdbc/blob/master/src/jdbc/core.clj тут нет его

igrishaev 2017-11-14T14:09:50.000312Z

а тут есть https://clojure.github.io/java.jdbc/#clojure.java.jdbc/db-set-rollback-only!

kuzmin_m 2017-11-14T14:10:04.000316Z

понятно

kuzmin_m 2017-11-14T14:10:10.000062Z

как откатывать - не суть

igrishaev 2017-11-14T14:10:17.000242Z

(воскл. знак на конце — часть ссылки)

kuzmin_m 2017-11-14T14:11:16.000019Z

делают ли что-то вроде такого?

foo do |x|
  bar x
end
foo( x => {
  bar(x)
});

kuzmin_m 2017-11-14T14:11:31.000318Z

просто беда с выравниванием

kuzmin_m 2017-11-14T14:11:43.000299Z

(with-conn 
  (fn [conn]
    (foo conn))

igrishaev 2017-11-14T14:12:59.000205Z

конечно, ты можешь написать макрос, который делает (let) для какого-то символа, и тогда все тело внутри может на него ссылаться

kuzmin_m 2017-11-14T14:13:26.000052Z

это все понятно, что могу может что-то принятое есть?

kuzmin_m 2017-11-14T14:14:02.000122Z

что-то вроде with-open

kuzmin_m 2017-11-14T14:14:10.000361Z

но он тут не подходит

igrishaev 2017-11-14T14:15:17.000054Z

я не до конца пойму, что тебе нужно, но макросы вида (with-something <variable>) очень распространены

igrishaev 2017-11-14T14:16:22.000254Z

например, извлечь какие-то данные, забиндить их к переменной и выполнить код перед выходом из макроса

kuzmin_m 2017-11-14T14:18:37.000263Z

foo( x => {
  bar(x)
});
пример из js6, как такое-же сделать на clojure, с нормальными отступами?

kuzmin_m 2017-11-14T14:19:24.000629Z

(foo (fn [x]
  (bar x))

igrishaev 2017-11-14T14:19:25.000226Z

а что делает этот код вообще?

kuzmin_m 2017-11-14T14:19:34.000733Z

да просто конструкция

kuzmin_m 2017-11-14T14:20:04.000345Z

var assert = require('assert');
describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

kuzmin_m 2017-11-14T14:20:29.000099Z

просто в js принято так делать, и отступы нормально выглядят

kuzmin_m 2017-11-14T14:20:39.000389Z

а в clojure так не принятно

kuzmin_m 2017-11-14T14:20:55.000263Z

и пример

(foo (fn [x]
  (bar x))
выглядит инородно

igrishaev 2017-11-14T14:21:37.000544Z

то есть все, что мы обсуждали — суть холивар из-за скобок?

kuzmin_m 2017-11-14T14:21:38.000200Z

как передать анонимную функию последним аргументом?

kuzmin_m 2017-11-14T14:21:49.000175Z

причем тут холивар?

kuzmin_m 2017-11-14T14:21:54.000208Z

из-за отступов

ponimas 2017-11-14T14:26:24.000359Z

эм (foo (fn [x] (bar x)) и никаких проблем с отступами

kuzmin_m 2017-11-14T14:26:52.000198Z

да, а теперь там не один bar, а десяток

kuzmin_m 2017-11-14T14:27:24.000009Z

(foo (fn [x]
       (bar1 x)
       (bar2 x)
       (bar3 x)
       (bar4 x)))

kuzmin_m 2017-11-14T14:27:55.000257Z

(foo
 (fn [x]
   (bar1 x)
   (bar2 x)
   (bar3 x)
   (bar4 x)))

kuzmin_m 2017-11-14T14:28:26.000188Z

и теперь

foo(x => {
  bar1(x)
  bar2(x)
});

kuzmin_m 2017-11-14T14:29:08.000228Z

первые 2 ИМХО выглядят как-то не очень

ponimas 2017-11-14T14:29:34.000176Z

(defn xx [x] ...)
(foo xx)

kuzmin_m 2017-11-14T14:30:14.000029Z

ну да)

kuzmin_m 2017-11-14T14:30:45.000099Z

я больше вариантнов не занаю по этому и спаришваю, может еще что-то есть

ponimas 2017-11-14T14:31:20.000470Z

не пытаться заставить кложу выглядить как js|ruby?

kuzmin_m 2017-11-14T14:31:42.000393Z

согласен

kuzmin_m 2017-11-14T14:32:01.000039Z

но какая есть удобная альтернатива?

ponimas 2017-11-14T14:32:49.000426Z

альтернатива чему?

kuzmin_m 2017-11-14T14:33:02.000218Z

(foo (fn [x]
       (bar1 x)
       (bar2 x)
       (bar3 x)
       (bar4 x)))

ponimas 2017-11-14T14:33:22.000703Z

чем не нравится?

kuzmin_m 2017-11-14T14:33:36.000444Z

разбивает логику

ponimas 2017-11-14T14:33:51.000192Z

хз

kuzmin_m 2017-11-14T14:34:57.000205Z

ну условно

(let [body (fn [conn]
                    (foo1 conn)
                    (foo2 conn))]
   (transaction conn body))

ponimas 2017-11-14T14:35:53.000700Z

и что не так?

ponimas 2017-11-14T14:36:10.000274Z

у меня такого кода куча

kuzmin_m 2017-11-14T14:36:31.000619Z

понятно

dima 2017-11-14T14:39:27.000214Z

(transaction conn #(do (foo1 %) (foo2 %)))

dima 2017-11-14T14:40:27.000237Z

@kuzmin_m так лучше отформатировано ?

kuzmin_m 2017-11-14T14:44:52.000576Z

оно в длину растет

kuzmin_m 2017-11-14T14:45:11.000273Z

представь что их 10

dima 2017-11-14T14:51:18.000655Z

(transaction conn #(do (foo1 %)
                       (foo2 %)
                       (foo3 %)
                       (foo4 %)
                       (foo5 %)
                       (foo6 %)))
а чем так не устраивает? и как бы такой код выглядил в JS например?

kuzmin_m 2017-11-14T14:55:58.000581Z

отступы большие

kuzmin_m 2017-11-14T14:56:58.000761Z

т.е. не принято делать вот так

(transaction conn #(do 
  (foo1 %)
  (foo2 %)
  (foo3 %)
  ...
  (foo6 %)))

kuzmin_m 2017-11-14T14:57:49.000025Z

можно сделать макрос что бы было вот так

(with transaction conn
  (foo conn)
  ....
  (foo10 conn))

kuzmin_m 2017-11-14T14:58:58.000653Z

было

(transaction conn #(do (foo1 %)
                       (foo2 %)
                       (foo3 %)
                       (foo4 %)
                       (foo5 %)
                       (foo6 %)))
стало
(with transaction conn
  (foo conn)
  ....
  (foo10 conn))
принято ли так делать?

kuzmin_m 2017-11-14T15:00:12.000052Z

может уже есть такой макрос в какой-нибудь извесной либе, только называвается по другому и работает более clojure-way

kuzmin_m 2017-11-14T15:00:39.000389Z

есть же куча fn->, fn+>, ~>, +> и подобные штуки, которые похожи на ->

akond 2017-11-14T15:15:02.000448Z

juxt?

kuzmin_m 2017-11-14T15:18:09.000681Z

(transaction conn (fn [tx]
                    (let [a (foo1 tx)
                          b (foo2 tx 123 "foo")
                          c (+ a b)
                          ...]
                      (foo10 tx c))))

kuzmin_m 2017-11-14T15:18:36.000390Z

тут идея в том, что тело может быть каким угодно

kuzmin_m 2017-11-14T15:18:53.000123Z

скорее всего тут или смириться или найти/написать макрос

kuzmin_m 2017-11-14T15:19:09.000783Z

вопрос в том, как обычно это делают

akond 2017-11-14T15:22:40.000112Z

когда было много вызовов я ещё понимал что ты хочешь, а по этому нет

kuzmin_m 2017-11-14T15:23:24.000650Z

есть фунция transaction

kuzmin_m 2017-11-14T15:23:30.000485Z

она принимает коннект

kuzmin_m 2017-11-14T15:23:40.000211Z

и принимает коллбэк

kuzmin_m 2017-11-14T15:23:49.000448Z

в коллбэк передает транзакцию

kuzmin_m 2017-11-14T15:24:02.000614Z

после вызова коллбэка коммитит транзакцию

kuzmin_m 2017-11-14T15:24:07.000407Z

пример условный

kuzmin_m 2017-11-14T15:24:15.000255Z

может быть что угодно

kuzmin_m 2017-11-14T15:24:42.000646Z

а в коллбэке может быть все что угодно

kuzmin_m 2017-11-14T15:24:57.000569Z

@akond яснее?

kuzmin_m 2017-11-14T15:25:02.000588Z

или нет?

akond 2017-11-14T15:25:23.000257Z

то есть для тебя главное закрыть транзакцию после отработки всех кишков?

kuzmin_m 2017-11-14T15:25:50.000809Z

давай абстракно

kuzmin_m 2017-11-14T15:25:58.000459Z

есть нечно, что принимает коллбэк

kuzmin_m 2017-11-14T15:26:09.000536Z

и это нечно что-то делает до и после вызова коллбека

kuzmin_m 2017-11-14T15:26:18.000309Z

в коллбэк передается какое-то занчение

kuzmin_m 2017-11-14T15:26:20.000377Z

одно

akond 2017-11-14T15:26:53.000084Z

что-то типа обёртки?

kuzmin_m 2017-11-14T15:27:43.000407Z

(def wrapper [callback]
  (do1)
  (callback value)
  (do2))

(wrapper (fn [value]
           (do-something value)))
                                  

kuzmin_m 2017-11-14T15:28:15.000121Z

wrapper может еще какие-то аргументы принимать, до коллбэка

kuzmin_m 2017-11-14T15:28:25.000333Z

(wrapper 1 2 3 (fn ....))

kuzmin_m 2017-11-14T15:28:45.000575Z

т.е. в js|ruby это элементарно

kuzmin_m 2017-11-14T15:28:53.000059Z

в clojure выглядит страшно

kuzmin_m 2017-11-14T15:29:05.000082Z

может это как-то иначе делается?

akond 2017-11-14T15:36:46.000052Z

вроде не страшно. как по мне.

igrishaev 2017-11-14T16:01:07.000563Z

doto

kuzmin_m 2017-11-14T16:02:49.000638Z

(def wrapper [callback]
  (do1)
  (callback value)
  (do2))

(wrapper (fn [value]
           (do-something value)))
может быть так будет понятнее

kuzmin_m 2017-11-14T16:03:27.000676Z

и это do-something может быть из многих вызовов, с let и прочими конструкциями

kuzmin_m 2017-11-14T16:03:41.000734Z

вернее вместо do-something

ilevd 2017-11-14T16:48:29.000789Z

Самое короткое, наверное, будет так

(transaction (db/req1) (db/req2))
и макросом проходить по телу и вставлять после вызова db/reqN conn, если, конечно, есть возможность отличать по названию функции что ей нужен conn.

akond 2017-11-14T17:18:19.000579Z

да, жаль, что мы так и не дождались стрима из #attendify

2017-11-14T17:41:51.000339Z

стрима нет, на кложе проще писать, чем настроить стрим 🙂

misha 2017-11-14T19:47:39.000679Z

А сегодня ивент был, да? :opieop:

2017-11-14T19:53:59.000556Z

угу, еще идет, до сих пор

2017-11-14T19:54:03.000345Z

должна быть запись

2017-11-14T19:54:43.000375Z

Вот слайды https://speakerdeck.com/kachayev/clojure-at-attendify-2nd-ed