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

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

Скажите, а Elixir — это математический язык программирования, которым удобно решать задачи по комбинаторике?
Есть одна задача по перестановке. Хотелось бы найти элегантное решение. Но перебор «в лоб» получается чрезвычайно неэффективным. Можете посоветовать новичку где почитать?
Нет, для тяжёлых математических вычислений Elixir не самый подходящий ЯП. Посмотрите в сторону Julia, или в сторону математических пакетов Mathematica, Maxima, Maple, etc.
Для алгебраических вычислений была хорошая вещь — GAP, правда она чисто консольная почти. Для нее был хороший гуй ggap, но он свежии версии не поддерживает (
Нет. Elixir — это функциональный язык программирования. Построен поверх Erlang. Используя функциональный подход и синтаксический сахар, который дает Elixir, некоторые задачи решаются меньшим количеством кода.
НЛО прилетело и опубликовало эту надпись здесь
Это чтобы они отличались, хотя бы количеством параметров, ведь у них одинаковое имя. Где как удобнее.

Насчет синтаксического сахара,


|> Enum.map(fn(x)-> String.to_integer(x) end)

можно сократить до


|> Enum.map(&String.to_integer/1)
Мне как-то тоже стало интересно какие номера «счастливые» и захотелось попробовать сделать это на С++: https://github.com/Baldrs/Happy-tickets

Т.к. основной язык на котором я пишу, это PHP, подозреваю что код на С++ у меня вышел не очень «православный» :-)
Глаза же вытекают, натурально.

https://github.com/tallakt/comb ⇐ комбинаторика.

Ну и дальше вместо велосипедов с непонятными сигнатурами, давайте писать на Elixir’е, раз уж мы тут уже. AST же бесплатно все за вас сделает. По шагам:

Поглядим, как оно выглядит в AST:

iex> quote do 1 + 2 * 3
{:+, [context: Elixir, import: Kernel], [1, {:*, [context: Elixir, import: Kernel], [2, 3]}]}


осталось всего ничего: объявить макрос

iex> defmacro operation([var1, var2, var3], [op1, op2]) do
...>   {op1, [context: Elixir, import: Kernel], [var1, {:op2, [context: Elixir, import: Kernel], [var2, var3]}]}
...> end


и пройтись по всем пермутациям

iex> m = ~w|+ - * /|a
[:+, :-, :*, :/]
iex> Comb.cartesian_product(m, m) |> Enum.map(&operation([var1, var2, var3], &1))


Ну и сравнить еще надо будет, да. Мне лень дописывать пример до работающего, но вот есть прекрасный use-case, где торчащий наружу из языка AST — прямо в тысячу раз все упрощает, а вы настойчиво его обходите по кривым топким дорожкам.

iex> defmacro
У меня и к Вам и к автору статьи вопрос: зачем вы путаете новичков? Они ведь не знают, что def и defmacro работают только внутри defmodule. Аналогичный косяк и с `quote do 1 + 2 * 3` без end.
В каком месте я путаю? Там, где у меня def, я каждый раз пишу, что мы это добавляем в файл perm.ex. Все остальное в консоли.
iex(9)> def comb(0,_), do: [[]]
def comb(_,[]), do: []
def comb(n, [x|xs]) do
(for y < — comb(n — 1, xs), do: [x|y]) ++ comb(n, xs)
end
Верно! Это я недоглядел. Спасибо за подсказку, сейчас исправлю.
В `quote do: 1 + 2 * 3` я двоеточие куда-то подевал, а не `end` :)

Это же не SO, чтобы код проверять, как набралось, так и тиснул. В принципе, я только хотел сказать, что у Elixir’а есть одна просто killer-feature, и это макросы в чистом AST, так что вся эта статья — идеальный пример того, как ни в коем случае не нужно писать код на этом языке. Такой ярчайший антипаттерн, пример того, что на PHP можно программировать даже с использованием синтаксиса эликсира.

https://github.com/tallakt/comb ⇐ комбинаторика.
Вот за это, отдельная благодарность! Все мои проблемы решены в одном месте.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации