
Aldar
04.08.2016
11:49:27
а в контроллерах сайд эффекты разрешены
по крайней мере это мне кажется логичным))
в целом ерланг и его последователь эликсир прагматичные языки
поэтому их не стали делать полностью чистыми как хаскель

Google

Aldar
04.08.2016
11:50:19
поэтому ожидаю и здесь прагматичного подхода

Dmitry
04.08.2016
11:51:23
Какой fsm!!!! Плаг обрабатывает http запрос и отдаёт http ответ
Plug - это функция. У неё нет состояния. Если ты хочешь сделать аналог серверного редукса в эдиксире - используй генсервера и сокеты

Aldar
04.08.2016
12:00:20

Dmitry
04.08.2016
12:02:03

Aldar
04.08.2016
12:02:35
хотя чем по сути замыкание отличается от еще одного аргумента функции?
если этот аргумент иммутабелен

Dmitry
04.08.2016
12:04:20
Можно сделать функцию, замыкающую функцию и генирирующую новую функцию. Таким Макаром можно менять внутренне состояние. Это очень по задростки и я так честно говоря не умею)

Aldar
04.08.2016
12:05:18
но если генерируемая функция тоже чиста, то и вся функция чиста
а если где то закрался запрос к бд, или чтение из файла, то конечно нет
поэтому замыкания не влияют на чистоту функции, если они сами чистые
a = "hello"
defmodule Ex do
def func(a) do
a = "omg"
IO.puts a
end
end
Ex.func(a)
IO.puts a
omg
hello

Google

Aldar
04.08.2016
12:32:29
получается переменная передается “по значению"

Dmitry
04.08.2016
12:33:39
Не понял к чему этот пример. У тебя же в функции перевязывается переменная
Пересвязывается*

Aldar
04.08.2016
12:34:59
Почему у меня код не подсвечивает, я ж его в тройной backquote обернул
a = "hello"
defmodule Ex do
def func(a) do
IO.puts a
end
end
a = "omg"
Ex.func(a)
IO.puts a
output:
omg
omg

Nick
04.08.2016
12:35:30
a = "hello"
defmodule Ex do
def func(a) do
IO.puts a
end
end
a = "omg"
Ex.func(a)
IO.puts a

Aldar
04.08.2016
12:38:19
a = "hello"
f = fn -> IO.puts a end
a = "omg"
f.()
IO.puts a
output:
hello
omg

Dmitry
04.08.2016
12:38:54
Вот теперь действительно замыкание)
Но это в принципе и так понятно

Dmitry ?
04.08.2016
12:42:15
a = "one"
fun = fn ->
IO.puts(a)
a = "two"
IO.puts(a)
end
fun.()
IO.puts(a)
Вот такое мне было в первый раз не очевидно
one
two
one
Наткнулся, когда только начал писать на Elixir, сделал функцию-обертку-бенчмарк

Konstantin
04.08.2016
12:43:19
а three откуда?
а, вижу, поменял уже )

Dmitry ?
04.08.2016
12:44:08
Да, сори)

Андрей
04.08.2016
12:44:15
А я сижу и голову ломаю откуда three, что за магия?

Dmitry ?
04.08.2016
12:44:27
?

Aldar
04.08.2016
12:44:54
в общем при замыкании сохраняется лексический контекст, который потом отвязан и существует сам по себе
var a = "one";
var f = function() {
console.log(a);
a = "two";
console.log(a);
}
f();
console.log(a);
“one”
“two”
“two”

Google

Konstantin
04.08.2016
12:48:09

Aldar
04.08.2016
12:48:55
var a = "one";
var f = function() {
console.log(a);
var a = "two";
console.log(a);
}
f();
console.log(a);
undefined
“two”
“one"

Константин
04.08.2016
12:49:22
Если запустить дебагер, то так и будет. Там именно новые переменные

Aldar
04.08.2016
12:49:44
var a = "one";
var f = function() {
console.log(a);
let a = "two";
console.log(a);
}
f();
console.log(a);
"ReferenceError: a is not defined
at f (rudikamoce.js:3:40)
at rudikamoce.js:7:1
at https://static.jsbin.com/js/prod/runner-3.38.29.min.js:1:13926
at https://static.jsbin.com/js/prod/runner-3.38.29.min.js:1:10855"

Konstantin
04.08.2016
12:49:45
В книге "Programming Elixir: Functional |> Concurrent |> Pragmatic |> Fun" по крайней мере так и написано примерно
Что фактически каждая операция присваивания создает новую "переменную". Я, правда, не понимаю зачем они называются переменными тогда )

Aldar
04.08.2016
12:50:14
js как всегда навысоте))

Константин
04.08.2016
12:50:17
У нас переменная w, а в дебагере w@1 вроде

Aldar
04.08.2016
12:50:40
нужно было ее сначала разбиндить
а потом опять забиндить

Dmitry ?
04.08.2016
12:52:27
> Я, правда, не понимаю зачем они называются переменными тогда
Ну для тебя как разработчика это выглядит как переменная, в большинстве случаев

Dmitry
04.08.2016
12:53:46

Aldar
04.08.2016
12:54:09
поэтому ссылается на глобальную переменную

Dmitry ?
04.08.2016
12:54:21
Смотря на чем быстрее начал писать, на JS или Elixir

Dmitry
04.08.2016
12:54:45
Ну , я даже js всегда на кофе писал
Поэтому для меня что == что ===

Aldar
04.08.2016
12:55:00
кофе делает вар для тебя)

Konstantin
04.08.2016
12:55:18
кофе делает js не таким омерзительным )

Google

Konstantin
04.08.2016
12:55:20
на мой взгляд
хотя ES6 впечатляет, конечно
даже pattern matching'и всякие запилили

Dmitry ?
04.08.2016
12:55:54
В ES6?

Konstantin
04.08.2016
12:55:57
да
я как-то не следил особо за ним, но недавно обратил внимание

Dmitry ?
04.08.2016
12:56:12
Ты про деструктуризацию?

Aldar
04.08.2016
12:56:25
не, там паттерн матчинга нет, только деструктуризация

Dmitry ?
04.08.2016
12:56:50
А хотелось бы, конечно

Konstantin
04.08.2016
12:57:06
ну там array matching, object matching и т.д., да
вот эти штуки все и все, что ниже: http://es6-features.org/#ArrayMatching

Dmitry ?
04.08.2016
12:58:20
Да с этим удобнее стало, но не pattern matching совсем

Konstantin
04.08.2016
12:59:45
не один в один, но похоже ведь ) для js прорыв по крайней мере

Dmitry
04.08.2016
13:00:45
Es 6 ништяк

Maxim
04.08.2016
13:17:17
defmacro unless(expression, do: block) do
quote do
if !unquote(expression), do: unquote(block)
end
do: block только в макросах можно добавлять?
Во, я про этот блок и спрашивал в прошлый раз
как он правильно называется?
спс
Я вот сейчас тестирую и у меня блок первый выводится

Google

Maxim
04.08.2016
13:29:26
defmodule Main do
def print(a, do: block) do
IO.puts a
block
end
end
Main.print "Hello", do: IO.puts "block"
block
Hello

Vadim
04.08.2016
13:31:27
Потому что это не макрос

Dmitry ?
04.08.2016
13:31:29
Да уж

Vadim
04.08.2016
13:31:32
Функция исполняется сразу
do это обычный атом, не более. А вот форма do/end - синтаксический сахар

Maxim
04.08.2016
13:33:10
Получается тогда неважно куда ставить блок он всеравно первым выполнится?

Vadim
04.08.2016
13:34:01
Нету никакого блока, ты просто в аргументы передаешь строку, атом :do и результат выполнения IO.puts

Dmitry ?
04.08.2016
13:34:42
1. Выполнится io.puts
2. В переменной block окажется результат io.puts

Aldar
04.08.2016
13:34:45
это список из туплов
[{:do, smth}]