@proelixir

Страница 51 из 1045
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 - это функция. У неё нет состояния. Если ты хочешь сделать аналог серверного редукса в эдиксире - используй генсервера и сокеты

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
> Я, правда, не понимаю зачем они называются переменными тогда Ну для тебя как разработчика это выглядит как переменная, в большинстве случаев

Aldar
04.08.2016
12:54:09
А вот это не очевидно....
очевидно, внутри функции a без var

поэтому ссылается на глобальную переменную

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}]

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