
Evgeny
26.12.2017
10:41:04
или разбивают код на тучи маленьких функций?

Alexander
26.12.2017
10:48:51
Ребята, мы тут библиотечку опенсорснули, зацените: https://github.com/ExpressApp/struct
в hex пока не вылили, щас трэвис прикрутим и будет в hex'е

Dmitry
26.12.2017
10:52:49

Google

Dmitry
26.12.2017
10:53:21
Пока не понял, в чем фишки по сравнению с экто

Alexander
26.12.2017
10:53:39
это кажется, из экто там есть части по приведению типов, остальное с ней не связано =)

Dmitry
26.12.2017
10:54:49
А остальное это что? Валидация - как в экто, ошибки как в экто, кастомные типы как в экто
Я правда только ридми прочитал, может там какой фунуционал ещё есть

Marat
26.12.2017
10:56:52
А потом костыляют типы из говна и палок

Dmitry
26.12.2017
10:57:47

Alexander
26.12.2017
10:57:54
экто прибито к базе, ченжсетам и прочему гвоздями. Мы юзаем эту либку у себя внутри для валидации данных от юзеров и между сервисами + между контекстами. Очень помогает в тестировании и при написании поддерживаемого кода сложнее хелловорлд-блога :)
в сервисах где нет экто вообще, например

Dmitry
26.12.2017
10:58:54
Но я пока не замечал, чтобы экто был прибит гвоздями к базе
А чейнджсеты - это тоже что и ваш make
На выходе и список ошибок, и valid? функция

Google

Alexander
26.12.2017
11:00:33
на выходе либо ошибки, либо валидная структура
ну либо эксепшн, если с бангом

Dmitry
26.12.2017
11:01:03
Возможно это удобно, но я бы всё-таки учил одну либу, а не две. Хотя, надо попробовать будет
Как раз до нового года надо запилить бота в телегу ;)

Alexander
26.12.2017
11:02:31
мы еще парочку либ опенсорсим до конца года, например api_controller, он юзает Struct схемы в качестве валидаторов и кидает четкие ошибки в ответы

Dmitry
26.12.2017
11:03:05

Alexander
26.12.2017
11:04:18
зачем? у нас весь стэк Elixir-only и он вполне нас устраивает, сделано это не ради строгой типизации, а ради валидации данных и упрощения поддержки кодовой базы
по поводу контроллера - есть первая версия в опенсорсе, её переделали на struct немного, получилось такое:
defm :show, ShowChatRequest, fn(_conn, params) ->
case Repo.get(GroupChat, params.uuid) do
nil -> %Error{reason: "chat_not_found", code: 404}
chat -> %Ok{result: chat_data(chat)}
end
end
ShowChatRequest - структурка определенная с помощью Struct

Aldar
26.12.2017
11:08:23
в фениксе 1.3 удобная обработка ошибок через action_fallback

Alexander
26.12.2017
11:08:27
если валидация непрокатит, кинет ошибку api стандартизованную
ага

Dmitry
26.12.2017
11:25:36
У нас grapgql в стеке
И короч он все сам валидирует

Alexander
26.12.2017
11:27:57
ну, поздравляю, у нас каналы и классический рест + мобильные клиенты

Dmitry
26.12.2017
11:28:40
Ну да, в рест нужна валидация

Alexander
26.12.2017
11:29:46
пушнули в hex: https://hexdocs.pm/struct/readme.html

Evgeny
26.12.2017
11:52:08
Вопрос по кодстайлу. Так писать нормально или есть менее вырвиглазный вариант?
Map.merge(a, b, fn(_, d1, d2) ->
Map.merge(d1, d2, fn(_, p1, p2) ->
Map.merge(p1, p2)
end)
end)
эдакий глубокий мердж с глубиной 3
готовой подобной функции не нашел

Google

Анастасия
26.12.2017
11:54:22
есть put_in для одного элемента
либо так, можно много элементов %{map | existing_elem => new_value}

Evgeny
26.12.2017
11:54:50
у меня элементы могут и не существовать
и вопрос таки больше по стилю, а не функциональности
как вообще принято писать?
а так-то можно рекурсивную функцию наваять, в которую пихать две мапы и глубину мерджа.

Анастасия
26.12.2017
11:58:14
у меня подозрение что можно написать намного проще, общепринятного метода нет потому что нет необходимости
лучше конечно рекурсию

Evgeny
26.12.2017
11:58:32
я не про метод, а про оформление самого кода
господи, ну что за убожество?
нельзя писать |> fn(x) -> ... end
нужно писать |> (fn(x) -> ... end).()
чо за говно?

Vladimir
26.12.2017
12:18:39
ну то что в Эрланге писалось Var() в Эликсире пишут var.()
Настолько сильно хотелось переменные с маленькими буквами, что ввели такую уродскую кострукцию, чтобы вызов функции из переменной можно было отличить от вызова по имени.

Taras ?
26.12.2017
12:19:16
в эрланге еще встречается V()().

Evgeny
26.12.2017
12:22:56
у меня анонимная лямбда, почему я не могу ее передавать как параметр?

Evgeny
26.12.2017
12:23:47
мало того, что синтаксис лямбд кривой, так еще и нелогичные вещи нужно делать

Taras ?
26.12.2017
12:24:21
почему это нельзя передать как параметр?

Evgeny
26.12.2017
12:25:05
А, пайп же требует вызов приросовать
а точка из-за того, что функция анонимная

Taras ?
26.12.2017
12:26:52
это отличщно что в эрланге нетуй пайпа))

Evgeny
26.12.2017
12:27:17
ну а что вложенные функции лучше?

Taras ?
26.12.2017
12:27:31
с пайпом можно строить вермишель не только вниз, как в js, но и во все стороны ))
больше нечитаемого кода богу нечитаемого кода! )))

Google

Evgeny
26.12.2017
12:27:49
в хаскеле хоть каррирование есть

Andrey
26.12.2017
12:28:30

Taras ?
26.12.2017
12:28:42
термин, которого я не слышал до того как первый раз услышал о хаскеле,
термин, которого я все еще не понял
видимо это все потому что я все еще глупенький

Andrey
26.12.2017
12:28:45
такое дизайнерское решение и нужно с этим жить

Evgeny
26.12.2017
12:29:08
мде
придется
главное логику уловить
хороши лямбды в D:
foo(10, 20, (a, b) => a + b)

Taras ?
26.12.2017
13:05:12
уггу

Admin
ERROR: S client not available

Evgeny
26.12.2017
13:09:48
как правильно разбить на строки длинный список генераторов? Вот так не работает
for
a <- b,
c <- d,
e <- f
do
...
end

Alexey
26.12.2017
13:22:43
не надо просто юзать анонимные ф-ции в пайпах, это ухудшает читаемость. Лучше написать рядом, дать ей имя и спокойно передать

Vladimir
26.12.2017
13:24:02
так даже удобнее (ц)

Evgeny
26.12.2017
13:25:03
писать рядом элементарные функции как-то не очень
ладно, а что с генераторами? я до конца не врубаюсь как эликсир трактует переводы строк
по императивному делать вложенные for?

Анастасия
26.12.2017
13:29:38

Andrey
26.12.2017
13:29:46
что именно ты хочешь сделать?

Alexey
26.12.2017
13:30:46
do должен быть на той же строке

Google

Alexey
26.12.2017
13:30:46
как правильно разбить на строки длинный список генераторов? Вот так не работает
for
a <- b,
c <- d,
e <- f
do
...
end
что и последнее выражение

Evgeny
26.12.2017
13:30:59

Alexey
26.12.2017
13:31:42
for a <- b,
c <- d,
e <- f do
...
end

Evgeny
26.12.2017
13:32:35
ага я уже нашел
for в той же строке, что и первое выражение, а do в той же что и последнее
какой изврат, бозе мой
среди разработчиков эликсира определенно не хватает сильных теоретиков языков программирования

Alexey
26.12.2017
13:36:45
ты просто не понимаешь как это используется
for a <- 1..10,
b <- 1..10,
do: IO.puts("#{a} -> #{b}")

Vladimir
26.12.2017
13:36:52
Дык. Хотели запилить быструю замену рубям, но получилось так как получилось.
А ведь даже если бы просто сохранить классическое эрланговское именование функций и переменных, то скольких грабель можно было бы избежать! Ан нет, решили и тут отличиться.

Alexey
26.12.2017
13:36:54
вполне красиво

Evgeny
26.12.2017
13:37:15
возможно, я же сказал, что не врубаюсь как эликсир трактует переводы строк и прочие whitespace

Alexey
26.12.2017
13:37:16
просто не надо делать for с большим кол-вом генератором и потом вложенной логики внутрь
это усложнит дальнешее чтение

Taras ?
26.12.2017
13:37:44

Alexey
26.12.2017
13:38:05
выносишь логику в отдельный метод, через for комбинируешь

Evgeny
26.12.2017
13:38:31

Alexey
26.12.2017
13:38:51
да) В дальнейшем тебе будет проще это развивать
добавишь матчинг в ф-ции
и на каждом этапе будет нужная логика

Evgeny
26.12.2017
13:39:16
да ну? Я может нуль в эликсире, но в программировании далеко не нуль
потом носится по файлу, чтобы увидеть что-то вроде
def sum(a,b), do: a + b