Подтвердить что ты не робот

Скрытые особенности Эрланг

В духе:

  • Скрытые функции С#
  • Скрытые возможности Java
  • Скрытые возможности ASP.NET
  • Скрытые возможности Python
  • Скрытые особенности HTML
  • и другие вопросы с скрытыми функциями

Каковы скрытые функции Erlang, о которых должен знать каждый разработчик Erlang?

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

4b9b3361

Ответ 1

Волшебные команды в оболочке. Полный список находится в руководстве, но те, которые я использую больше всего:

  • f() - забудьте все переменные
  • f (X) - забудьте X
  • v (42) - вывести результат из строки 42
  • v (-1) - вызов результата из предыдущей строки
  • e (-1) - повторное выражение в предыдущей строке
  • rr (foo) - читать определения записи из модуля foo
  • rr ( "*/*" ) - читать определения записей из каждого модуля в каждом подкаталоге
  • rp (выражение) - печать полного выражения с формированием записи

Ответ 2

Наследование! 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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Порты, внешние или связанные, принимают что-то, называемое io-lists, для отправки им данных. 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.

Лучше всего, так как файлы и сокеты реализованы как порты, вы можете отправлять им iolists. Не нужно сглаживать или добавлять.

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

-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"

Ответ 10

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

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

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

Ответ 11

.erlang может предварительно загружать библиотеки и запускать команды при запуске shells, вы также можете выполнять определенные команды для определенных узлов, делая оператор case в node name.

Ответ 12

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

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

Ответ 13

Можно использовать собственный итератор для QLC. Например, результирующий набор из SQL-запроса может быть внесен в таблицу QLC и, таким образом, воспользоваться функциями QLC-запросов.

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

Ответ 14

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

  • Возможность расширенной трассировки на живых узлах (в процессе эксплуатации) и одна из лучших в отладке!

Ответ 15

Вы можете скрыть Erlang node, запустив его с помощью

erl -sname foo -hidden

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

Ответ 16

Соответствие с оператором append:

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

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

Ответ 17

Загрузка горячего кода. Из wiki.

Код загружается и управляется как единицы модуля, модуль является единицей компиляции. Система может одновременно хранить две версии модуля в памяти, а процессы могут одновременно запускать код из каждого.

Версии относятся к "новой" и "старой" версии. Процесс не будет перемещаться в новую версию, пока не сделает внешний вызов его модуля.