All streams
Search
Write a publication
Pull to refresh
4
0
Alex Bubnov @nwalker

Пользователь

Send message

Автор говорил, что сначала релиз 3.0, а потом уже лигатуры.

Кстати, а сейчас есть какие-то тулзы, позволяющие избавиться от полных путей к репозиториям в импортах?

Ну, в нем есть не столько косяки, сколько некоторая неконсистентность. Например, вот взять дурацкий синтаксис вызова анонимных функций fun_variable.(:a, :b, :c).


Или вот эти приколы с proplist syntax:


Interactive Elixir (1.4.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> [1, 2, 3, a: 4, b: 5]
[1, 2, 3, {:a, 4}, {:b, 5}]
iex(2)> [1, 2, 3, a: 4, b: 5, 6]
** (SyntaxError) iex:2: syntax error before: 6

iex(2)> a = [1, 2, 3, a: 4, b: 5]
[1, 2, 3, {:a, 4}, {:b, 5}]
iex(3)> [c: 6 | a]
** (CompileError) iex:3: undefined function |/2
    (stdlib) lists.erl:1353: :lists.mapfoldl/3
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
iex(3)>

или вот такие истории с мапами


iex(4)> b = %{:a => 5}
%{a: 5}
iex(5)> %{b | :a => 5}  
%{a: 5}
iex(6)> %{b | :a => 6}
%{a: 6}
iex(7)> %{b | :a => 6, b => 7}
** (KeyError) key %{a: 5} not found in: %{a: 6}
    (stdlib) :maps.update(%{a: 5}, 7, %{a: 6})
    (stdlib) erl_eval.erl:255: anonymous fn/2 in :erl_eval.expr/5
    (stdlib) lists.erl:1262: :lists.foldl/3
iex(7)> %{:a => 6, b => 7 | b}
** (CompileError) iex:7: undefined function |/2
    (stdlib) lists.erl:1353: :lists.mapfoldl/3
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
    (stdlib) lists.erl:1353: :lists.mapfoldl/3

или proplist syntax который работает только для ключей-атомов


iex(7)> ["c": 6]                 
[c: 6]
iex(8)> ["c": 6][:c]
6

Если идти от языка к стандартной библиотеке, есть вот такое


iex(9)> ["c": 6]["a"]
** (ArgumentError) the Access calls for keywords expect the key to be an atom, got: "a"
    (elixir) lib/access.ex:255: Access.fetch/2
    (elixir) lib/access.ex:269: Access.get/3

Причем, это поведение изменить никак нельзя. because fuck you, that's why
Были еще какие-то шероховатости, уже не помню.


А вот если идти дальше, вот мы видим Plug и Phoenix, и вот они — редкостное говно во целому ряду причин.

Ну погуглите Erlang killer features. Изоляция данных и ошибок, например. Вообще механика каскадирования ошибок. Per-actor GC. Крутой preemptive планировщик c work stealing. Очень крутые возможности интроспекции, когда ты можешь своими руками потрогать изнутри работающую систему.
Еще есть hot code replacement, которым, впрочем, мало кто пользуется, потому что это мало кому реально нужно.
Порты как метод FFI весьма приятны.
Distribution с его сетевой прозрачностью, к которому я отношусь довольно двояко, но который все же есть и работает из коробки до поры до времени. Рано или поздно приходится начинать думать, но это везде так.

Все то же самое, только по-другому. Местами получше, местами похуже. Язык богаче, косяки есть, но не ужасают. Тулсет неплох.
Рантайм — BEAM — сложно сравнить, просто принципиально другой и обладает рядом killer features, которых нет вообще ни у кого.

Этот фрагмент меня поражает поразительной незамутненностью интервьюируемого.


Насколько же нужно не смотреть вообще по сторонам и не интересоваться ничем кроме своей песочницы, чтобы открыть для себя "блокирующий стиль поверх грин-тредов" с SMP-планировщиком в Go в 2012? Я не удивлюсь, если Дал лет через пять откроет для себя, скажем, Elixir.

Мы в итоге сделали прокси в АТОЛ и Orange Data, свои транзакции гоним в OD. АТОЛ мы отложили в сторонку, вдруг кому-нибудь из наших клиентов пригодится.

Упомянутые вами Erlang или F# синтаксически похожи на CoffeeScript.
Не, это совсем мимо. CoffeeScript сам по себе очень искусственный гибрид.
Erlang — говорят, синтаксически Prolog.
F# — довольно типичный ML(SML, OCaml, множество их).

АТОЛ и для "опта" выдвигает такие условия, что сразу понимаешь, чем плоха монополия.

За человека говорят эмоции, поэтому он редко может себя контролировать, обижается и сыпет возражениями.
Чтобы вырулить такую ситуацию в конструктив и никого не обидеть, нужно действовать по следующему алгоритму.
...

А самому продвинуть такого человека в очереди на замену.

Лучше бы наоборот. Конечно, за исключением win32k.sys, или где там сейчас GUI спрятан.

Действительно, "декомпилировать beam-файлы и посмотреть, что же в итоге получилось", зачастую является лучшим способом понять, что же делает компилятор Эликсира.

Ну вообще, по сравнению с С-подобными языками код Erlang ОЧЕНЬ выразительный в смысле "количества смысла" на символ кода. Pattern matching, даже обычный, не binary, решает.

после первой же сборки вражеская закладка

причем тут враги? может у авторов кодстайл такой альтернативный.
и вообще, важно не столько что будет сделано, а с чем — вот тут с помощью препроцессора точно можно отлично разгуляться.


разобраться в С просто. а вот в коде на С — посложнее будет

Из этого кода, если хоть чуть-чуть вчитаться, очевидно, что он что-то рисует в stdout.

Меня смутило то, что во внутреннем цикле вызывается


P("| " + BIT_SET(*u, 2));
P("_" + BIT_SET(*u, 3));
u++;

Вроде бы конструкции однотипные, но без пробела логика получается подозрительно разная.


Так вот, смутило это меня в достаточной степени, чтобы найти


оригинальный код

Это один из победителей IOCCC 1985, shapiro.c by Carl Shapiro, код рисует лабиринт в stdout. И да, там есть этот самый пробел. =)


В процессе поиска нашелся еще и занятный пост про обфускацию C и лабиринты.

Вы потеряли пробел в строке "_ ", что не лучшим образом сказывается на понимании, что вообще происходит.

Вот это что-то новенькое. Первый раз такое вижу.

А какой там оригинальный вариант, ваш с магическими декораторами? Нет, знаете, этому варианту лучше отказать. Магические декораторы не нужны. Это примерно как написать на scala с имплиситами, выглядит неплохо, а как работает — непонятно.


В "шараде" бОльшая часть наблюдаемой сложности появилась из-за танцев вокруг типов, но при этом там определенно меньше магии.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity