
Dmitry ?
04.08.2016
13:35:56
Здесь block это аргумент

Aldar
04.08.2016
13:36:03
keyword list это и есть список из туплов

Maxim
04.08.2016
13:36:14

Vadim
04.08.2016
13:36:26
Ой, я всегда думал, что это просто [:a b :c d]

Google

Dmitry ?
04.08.2016
13:36:27
Io.puts вывел

Aldar
04.08.2016
13:36:28
[a: 1, b:2] == [{:a, 1}, {:b, 2}]

Vadim
04.08.2016
13:36:50
Теперь такое поведение кажется логичным?

Maxim
04.08.2016
13:37:03

Dmitry ?
04.08.2016
13:37:27
Т.к. ты вызвал IO.puts("block")

Aldar
04.08.2016
13:37:43
IO.puts возвращает :ok
и сайд эффектом выводит строку

Dmitry ?
04.08.2016
13:38:02
А внутри себя сайд эффект в консоль

Maxim
04.08.2016
13:40:36
Блок без макросов используют?

Dmitry ?
04.08.2016
13:41:03
Блин :)

Maxim
04.08.2016
13:41:22
ахахах

Dmitry ?
04.08.2016
13:42:13
defmodule Main do
def print(a, azaza: ololo) do
IO.puts a
ololo
end
end
Main.print "Hello", azaza: IO.puts("world")

Google

Dmitry ?
04.08.2016
13:42:23
То же самое с другими именами
defmodule Main do
def print(a, [azaza: ololo]) do
IO.puts(a)
ololo
end
end
Main.print("Hello", [azaza: IO.puts("world")])
То же самое

Maxim
04.08.2016
13:43:51
Для меня логичный вывод такой
Hello
world
вот это я могу понять

Dmitry ?
04.08.2016
13:44:23
А так
defmodule Main do
def print(a, [azaza: ololo]) do
IO.puts(a)
ololo
end
end
ololo = IO.puts("world")
Main.print("Hello", [azaza: ololo])
То же самое
defmodule Main do
def print(a, [azaza: ololo]) do
IO.puts(a)
ololo
end
end
IO.puts("world")
ololo = :ok
Main.print("Hello", [azaza: ololo])

Maxim
04.08.2016
13:45:36
во во
тепеь что-то проясняется
в блок передается ок

Aldar
04.08.2016
13:47:19
эликсир энергичный язык, поэтому перед тем как выполнять функцию происходит вычисление значений аргументов
f = fn a->
IO.puts "World"
a
end
f.(IO.puts "Hello “)
Hello
World
f = fn a->
IO.puts "World"
a
end
b = f.(IO.puts "Hello ")
IO.puts b == :ok
Hello
World
true

Dmitry ?
04.08.2016
14:02:19
В хозяйстве все пригодится

Aldar
04.08.2016
14:02:31
Интересно, наверное порядок вычисления аргументов функции в Эликсире слева направо, а то в С++ он неопределен))
f = fn a, b->
IO.puts "World"
{a, b}
end
b = f.((IO.puts "Hello "), (IO.puts "Bitch"))
IO.puts {:ok, :ok } == b
Hello
Bitch
World
true
эликсир учу потихоньку
ну так я пару дней и учу

Maxim
04.08.2016
14:14:11
Макрос вычесления аргументов позволяет избежать?
Это как?

Google

Maxim
04.08.2016
14:16:47
У Руби похожий синтаксис с блоком
и там он вызывается именно в том месте где стоит

Aldar
04.08.2016
14:17:14
Макрос? Макрос просто одну строку на другую заменяет

Maxim
04.08.2016
14:17:14
если я не ошибаюсь

Aldar
04.08.2016
14:19:32
в руби блок вызывается через yield

Maxim
04.08.2016
14:19:37
да

Aldar
04.08.2016
14:20:00
то есть в том месте где yield написан)

Maxim
04.08.2016
14:20:07
точно
а тут block прописывается

Aldar
04.08.2016
14:21:15
тут блок это просто дополнительный аргумент к функции, который дописывается в конец списка аргументов как keyword list
как я понял
if true do
blabla
else
blabla2
end
это все равно что
if true, [do: blabla, else: blabla2]
что в свою очередь все равно что
if true, [{:do, blabla}, {:else, blabla2}]

Can
04.08.2016
14:30:17
Если в макрос передать код
то он передается как AST
abstract syntax tree
т.е. сразу не выполняется
и ты внутри макроса можешь выполнять его как хочешь
и дерево это перестраивать как хочешь
Поэтому да, макрос предотвращает вычисление аргументов

Google

Can
04.08.2016
14:31:13
насколько я понял

Aldar
04.08.2016
14:32:55
Пока до макросов не дошел, думал что макрос просто строку в другую преобразует
как в СИ

Maxim
04.08.2016
14:33:13
Это компилятор лишний код выкидывает перед исполнением или сложнее
а ну да он же дерево стоит
абстрактное
прерпроцессор типо
это я так просто рассуждают
вслух
Например возьмем консольную утилиту куда будем передавать аргументы. Утилита уже скомпилирована с разными вариантами аргументов. Но можно проанализировать аргументы и сгенирировать код под переданные аргументы и потом скпомпилировать утилиту. Мы облегчим скпомпилированный код и память. Это и есть метапрограммирование?

Aldar
04.08.2016
14:51:29
метапрограммирование это генерация кода по ходу работы программы
в рельсах например ActiveRecord генерит методы налету, просто читая из базы атрибуты таблицы

Maxim
04.08.2016
14:53:21
руби скриптовый язык
да и методы можно генерить
точно

Dmitry
04.08.2016
14:54:22
В этом смысле в эдиксире нету метапрограммирования
Потому что все макроса раскрываютстя на этапе компиляции

Maxim
04.08.2016
14:56:40
If else можно самому такие макросы делать на любой язык
просто генеришь код и все
самому

Google

Maxim
04.08.2016
14:57:48
только зачем
вот методы как в руби это круто

Konstantin
04.08.2016
15:24:13
только зачем
ну ты сравни синтаксис эликсира и эрланга и вот тебе ответ зачем

Dmitry
04.08.2016
15:25:07
Некоторые считают, что не очень..
вот методы как в руби это круто

Konstantin
04.08.2016
15:28:26