Вопрос по – Скрытые возможности Erlang [закрыто]

17

В духе:

Hidden Features of C# Hidden Features of Java Hidden Features of ASP.NET Hidden Features of Python Hidden Features of HTML and other Hidden Features questions

О каких скрытых особенностях Erlang должен знать каждый разработчик Erlang?

Одна скрытая функция в ответе, пожалуйста.

@ Олафур как? Помогите! @ Авиху готово. спасибо за предложение! :) pageman
Я предлагаю добавить к этому тег скрытых функций и сделать ссылки на эти вопросы в примечаниях к скрытым функциям других языков. Avihu Turzion
Пожалуйста, сообщество вики это. Ólafur Waage

Ваш Ответ

17   ответов
19

руководствоНо больше всего я использую:

f() - forget all variables f(X) - forget X v(42) - recall result from line 42 v(-1) - recall result from previous line e(-1) - reexecute expression on previous line rr(foo) - read record definitions from module foo rr("*/*") - read record definitions from every module in every subdirectory rp(expression) - print full expression with record formating
И используя rp (выражение (...)), чтобы распечатать результат без красивой печати слишком глубоко вложенных структур, вместо этого он печатает его полностью
1+ за рп, спасибо
5

Type}, чтобы помочь в декодировании ряда протоколов. ФункцияЭрланга: decode_packet / 3 имеет хорошее описание того, что могут быть различные значения типа и что они делают.

Вместе с настройкой {active, once} или {active, true} каждое значение в рамке будет доставлено как одно сообщение.

Примеры: режим http пакета интенсивно используется дляя подаю и режим fcgi пакета дляifastcgi, Я могу представить, что многие другие http-серверы также используют пакетный http.

10

beam_lib: чанки могут получить исходный код от луча, который был скомпилирован с отладкой, что может быть действительно полезным

{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
  io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
14

Параметризованные модули! Отhttp://www.lshift.net/blog/2008/05/18/late-binding-with-erlang а такжеhttp://www.erlang.se/euc/07/papers/1700Carlsson.pdf

-module(myclass, [Instvar1, Instvar2]).
-export([getInstvar1/0, getInstvar2/0]).
getInstvar1() -> Instvar1.
getInstvar2() -> Instvar2.

А также

Eshell V5.6  (abort with ^G)
1> Handle = myclass:new(123, 234).
{myclass,123,234}
2> Handle:getInstvar1().
123
3> Handle:getInstvar2().
234
Это довольно интересно! Я также видел это впервые в mochiweb. Объединение этого с наследованием может создать некоторые интересные возможности ...
Я заметил это, когда пытался найти источник mochiweb. Потребовалось некоторое время, чтобы погуглить, что, черт возьми, он на самом деле делал, так как синтаксис полностью отличался от того, что я видел ранее на Erlang.
В случае, если вы задаетесь вопросом о снижении голосов, это был несчастный случай, пожалуйста, проверьтеthis meta topic, Я отредактирую ваш вопрос, чтобы его можно было удалить.
7

.erlang_hosts дает хороший способ обмениваться именами между компьютерами

8

fun2ms (...), где используется синтаксис Erlang fun и преобразован в спецификацию соответствия с преобразованием синтаксического анализа.

1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]

Так что никакой забавной ценности никогда не создается, выражение заменяется на match-spec во время компиляции. Веселье может делать только то, что может делать выражение соответствия.

Кроме того, ets: fun2ms доступен для использования в оболочке, поэтому выражения-выражения можно легко протестировать.

12

лочки, имея скомпилированный user_default.beam на своем пути, который может быть довольно изящным

25

Наследование!http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

родитель

-module(parent).
-export([foo/0, bar/0]).

foo() ->
    io:format("parent:foo/0 ~n", []).

bar() ->
    io:format("parent:bar/0 ~n", []).

ребенок

-module(child).
-extends(parent).
-export([foo/0]).

foo() ->
    io:format("child:foo/0 ~n", []).

Приставка

23> parent:foo().
parent:foo/0 
ok
24> parent:bar().
parent:bar/0 
ok
25> child:foo().
child:foo/0 
ok
26> child:bar().
parent:bar/0 
ok
Этот комментарий относится к «Параметризованным модулям» ответ...
Ага. Интересно! Хотя я не видел этого ни в одной из библиотек, которые я использовал до настоящего времени ...
Не знаю, очень полезно, спасибо!
Однако не рекомендуется использовать параметризованные модули: они добавляют переменные в функции, и это не очень хорошо, когда дело доходит до их отладки. Они нарушают функциональную парадигму, добавляя уровень сложности, вносимый переменными, которые вы должны отслеживать (например, глобальные переменные в императивных языках), они неизменны, но разрушают прозрачность. Были мысли, что они (параметризованные модули) все еще существуют в языкеonly из-за продуктов, использующих их, mochiweb является примером. Подумайте только, почему появившиеся в 2003 году они официально еще не документированы?
2

Вы можетеhide an Erlang node начав с:

erl -sname foo -hidden

Вы все еще можете подключиться к узлу, но он не появится в списке, возвращаемомnodes/0.

2

имер, набор результатов из запроса SQL может быть преобразован в таблицу QLC и, таким образом, использовать преимущества запросов QLC.

Помимо таблиц mnesia, у dets и ets есть функции table / 1,2, которые возвращают такой «дескриптор запроса». для них.

4

.ри запуске оболочки, вы также можете выполнять определенные команды для определенных узлов, выполняя инструкцию case для имени узла.

2

но один из самых важных аспектов при выборе Erlang в качестве платформы для разработки:

Possibility of enhanced tracing on live nodes (in-service) and being one of the best in debugging!
2

"pajamas:" ++ Color = "pajamas:blue"

Цвет теперь имеет значение «синий». Помните, что у этого трюка есть свои ограничения - насколько я знаю, он работает только с одной переменной и одной константой в указанном выше порядке.

9

внешние или связанные, принимают то, что называется io-списками, для отправки им данных. Io-list - это двоичный или (возможно, глубокий) список двоичных файлов или целых чисел в диапазоне 0..255.

Это означает, что вместо объединения двух списков перед их отправкой в порт можно просто отправить их как два элемента в списке. Так что вместо

"foo" ++ "bar"

один делать

["foo", "bar"]

В этом примере это, конечно, незначительная разница. Но сам по себе iolist обеспечивает удобное программирование при создании выходных данных. Например, io_lib: format / 2,3 возвращает список io.

Функция erlang: list_to_binary / 1 принимает списки io, но теперь у нас есть erlang: iolist_to_binary / 1, который лучше передает намерение. Существует также erlang: iolist_size / 1.

Best of allТак как файлы и сокеты реализованы в виде портов, вы можете отправлять в них iolist. Нет необходимости выравнивать или добавлять.

1

Горячая загрузка кода. Из вики.

Code is loaded and managed as "module" units, the module is a compilation unit. The system can keep two versions of a module in memory at the same time, and processes can concurrently run code from each.

The versions are referred to the "new" and the "old" version. A process will not move into the new version until it makes an external call to its module.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
6

но я не вижу этого часто. Анонимные функции могут иметь несколько предложений, как и функции модуля, т.е.

-module(foo).
-compile(export_all).

foo(0) -> "zero";
foo(1) -> "one";
foo(_) -> "many".

anon() ->
    fun(0) ->
            "zero";
       (1) ->
            "one";
       (_) ->
            "many"
    end.


1> foo:foo(0).
"zero"
2> foo:foo(1).
"one"
3> foo:foo(2).
"many"

4> (foo:anon())(0).
"zero"
5> (foo:anon())(1).
"one"
6> (foo:anon())(2).
"many"
3

Если вы хотите выполнить более одного выражения в понимании списка, вы можете использовать блок. Например:

> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]

Похожие вопросы