Как стать автором
Обновить

Комментарии 17

То есть, фактически, программа сгенерировала предложение с двумя числами, потом распарсила его, чтобы вырезать эти два числа обратно, и ответила на вопрос, четная ли их сумма, выведя ответ строкой. Никоим образом, программа не определяет принадлежность этой строки к этому вопросу? Какая часть задач из области ИИ тут решается? Какая польза получилась от этой реализации? Что дают эти испытания?

Честно говоря мне тоже показалось, что статья не очень оправдывает свое название. Я постараюсь в следующий раз быть более избирательным при выборе статьи для перевода. Мне не приятно осознавать, что я потратил зря ваше время. Спасибо за критику.

Возможно, статья является частью какой-то более крупной работы и решаемая в ней конкретная задача имеет смысл. Если так, то может стоит добавить ремарку о смысле происходящего? Да, это перевод, но можно сделать вставку от автора, что будем программировать. А самое главное — для чего. В самом начале, не поняв для чего все это делается, я ждал, чем же все это закончится, пытаясь понять, что происходит из кода. Но понимание алгоритма может быть затруднительным, если читатель не знаком с фунциональным подходом.
При этом, как пример программирования Elixir, статья хорошая. Потому что на конкретном примере понять легче. Раскрыты многие темы: матчинг функций по параметрам, guards, циклы через рекурсию, агенты, pipeline. Вообще, конечно, вопросы есть по необходимости их применения. Но автор оригинального текста новичек. Так же хочу заметить, что, как мне кажется, автор ошибся с организацией приложения. Он сделал модуль, в котором все вместе, и который он запускает и в нем же все проверяет. А надо было сделать приложение, в нем модуль, который понимает строку такого вида и отвечает на эту строку. Проверку нужно было сделать через юнит тестирование.

Достаточно название выбрать более подходящее. Статья очень хорошая для тех, кто делает или планирует делать первые шаги в элексире.

Спасибо, заголовок изменен: "Техники в Elixir для начинающих: Метод проб и ошибок".

Сказочный перевод!
> код, который вы собираетесь увидеть, охватывает большинство основных возможностей языка Elixir

Мой хохот должно было быть хорошо слышно в Денвере, штат Колорадо.
Ладно, давайте заодно по существу пару слов напишу, для забредших.

1. Зачем тут `Agent`? «Джо Армстронг (создатель Erlang) говорит, что с Erlang и Elixir „Вам не нужна база данных!“»—Джо говорит не про агентов. В эрланге никаких агентов нет. Я лично спрашивал Вирдинга про них, и Вирдинг сказал: «Не понимаю, зачем Хосе придумал лишнюю сущность». В общем, в ответ на вопрос «когда лучше всего использовать агенты эликсира, правильный ответ — никогда. С этим тяжело смириться людям, пришедшим из руби, питонов и прочих перлов, но — нет. Бейте себя по рукам, если вдруг. Возвращаясь к Джо, он имел в виду [D]ETS.
Ну и на закуску: в такой архитектуре навернувшийся агент утянет за собой все приложение, но супервизоры — это слишком сложно для автора.

2. Регулярки принято оформлять фигурными скобками `~r{}`. Да, это гайдлайн, но все же.

3. `acc ^^^ Bitwise.band(n, 1)` — щито? ⇒ `acc ^^^ n &&& 1`.

4. `Regex.run` не всегда возвращает список.

Ну и так далее. Не нужно учиться новым языкам, глядя на код восторженных недотыкомок.

Спасибо, внес правки.


  1. Не могли бы вы указывать ссылку, например на Википедию, когда указываете чье-то мнение.


  2. В Getting started guide на странице Sigils в синтаксисе для регулярных выражений используется ~r// как и в статье. Поэтому оставил как есть.


  3. acc ^^^ Bitwise.band(n, 1) изменил на acc ^^^ (n &&& 1) — этого не было в оригинальной статье, добавил комментарий об этом.


  4. Regex.run заменил на Regex.scan + List.flatten. Честно говоря, так и было в оригинальной статье, я напрасно позволил себе что-то менять.
Знаете, в статье про эликсир, в комментарии про эрланг и Армстронга указывать ссылку на Вирдинга при упоминании его имени, это, ну, как в статье про Маркса давать ссылку на Энгельса. Или вам непонятно, кто такой José Valím?

Вся конструкция с извлечением чисел из строки нелепа и неуклюжа. Лучше уж тогда заматчить результат `Regex.scan` на `[[first, last]]`.

Про агенты — ну давайте все же будем снисходительны. Это далеко не худший способ написать простое хранилище стейта с синхронизированным доступом и несложной логикой.

Я сам пользуюсь агентами, чего греха таить :)

Но идеологически это неправильно. Вы вот можете навскидку — прямо сейчас — не заглядывая никуда —сказать: что произойдет, если агент под супервизором навернулся, рестартнуть не успел, а вы из него пытаетесь данные достать?

Либо предсказуемый эксепшн про несуществующий процесс, либо мне вернут nil прекрасные разработчики stdlib. Либо там наворотили что-то совсем невероятное, и тогда я сдаюсь.


Вообще, это выглядит вполне обычной проблемой — обычный gen_server поведет себя точно так же.

Заглянул. Ничего там особенного, обычный noproc вылетит, вполне предсказуемо.

Всегда давайте имена своим агентам!

Отлично, просто отлично. С учетом отсутствия в эрланге нормального встроенного регистратора это очень интересное предложение.


Вообще, знаете, я вот смотрю на переводные посты про Elixir, смотрю в /r/elixir, и это все какой-то ад. Полезных постов незначительно больше нуля.

А зачем вы смотрите на переводные посты, стесняюсь спросить?

Я бы, кстати, не поленился бы и перевести на русский описание своей библиотечки для работы с сильно вложенными сущностями https://github.com/am-kantox/elixir-iteraptor

Там и про макросы можно было бы поговорить, и про доступ по `Access.{key!, all}`, и вообще есть много для новичка интересного. Да вот, незадача — меня забанили за то, что я после пятого наезда на меня в холиварном треде задел тонкую ранимую душу одного из местных редакторов обсценным эпитетом.

В переводные посты, как и в весь хабр, я смотрю больше по привычке. Ну и в камментах иногда бывает интересно.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории