@proelixir

Страница 52 из 1045
Dmitry ?
04.08.2016
13:35:56
Здесь block это аргумент

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

Maxim
04.08.2016
13:36:14
1. Выполнится io.puts 2. В переменной block окажется результат io.puts
Я так и думал, но выводиться почему-то блок первым, а в коде стоит первое вывод Hello

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
Io.puts вывел
Почему блок первый вывелся?

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
Некоторые считают, что не очень..
так конечно, всем не угодишь :)

Страница 52 из 1045