[Закрываются] скрытые функции Erlang

У меня есть несколько ... есть исключения для всего, поэтому они не являются сложными и быстрыми, но в большинстве случаев они применимы.

Никого не волнует, проверяет ли ваш веб-сайт строгость XHTML, стандарты или соответствует значку W3C.

Это может принести вам несколько пятерок от других веб-разработчиков, но остальные люди, просматривающие ваш сайт, могут дать дерьмо, проверяли ли вы свой код или нет. Подавляющее большинство веб-пользователей используют IE или Firefox, и, поскольку оба этих браузера простят нестандартный, не строгий, недействительный HTML-код, вам не нужно об этом беспокоиться. Если вы создали сайт для автодилера, механика, радиостанции, церкви или местного малого бизнеса, как вы думаете, сколько людей в целевой аудитории этих компаний заботится о правильном HTML? Я рискнул бы предположить, что это довольно близко к 0.

Большинство программ с открытым исходным кодом - бесполезная, слишком сложная чушь.

Позвольте мне установить этот замечательный фрагмент OSS, который я нашел. Похоже, он должен делать именно то, что я хочу! Ой, подождите, сначала я должен установить этот другой оконный менеджер. ХОРОШО. Затем мне нужно получить этот инструмент командной строки и добавить его в мой путь. Теперь мне нужны последние версии для X, Y и Z. Теперь мне нужно убедиться, что у меня запущены эти процессы. ок, отлично ... все настроено. Теперь позвольте мне изучить новый набор команд для его использования. О, круто, кто-то создал графический интерфейс для этого. Я думаю, мне не нужно изучать эти команды. Подождите, мне нужна эта библиотека, чтобы заставить работать графический интерфейс. Должен скачать это сейчас. хорошо, теперь это работает ... дерьмо, я не могу понять этот ужасный интерфейс.

звучит знакомо? OSS полон осложнений ради сложности, сложные установки, которые вам нужны, чтобы быть экспертом, и инструменты, которые большинство людей не знают, что делать в любом случае. Так много проектов отходит на второй план, другие настолько ниши, что их используют лишь немногие, а некоторые из приличных (FlowPlayer, OSCommerce и т. Д.) Имеют настолько нелепо чрезмерно сложный и раздутый исходный код, что он лишает возможности быть способным отредактируйте источник. Вы можете редактировать исходный код ... если вы можете выяснить, какой из 400 файлов содержит код, который необходимо изменить. Вы действительно попали в беду, когда узнаете, что их всего 400.

17
задан 5 revs, 2 users 65% 14 December 2009 в 21:11
поделиться

15 ответов

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

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

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

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

Версии относятся к «новой» и «старой» версии. Процесс не перейдет в новую версию до тех пор, пока он не сделает внешний вызов своего модуля.

1
ответ дан 30 November 2019 в 09:56
поделиться

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

4
ответ дан 30 November 2019 в 09:56
поделиться

.erlang_hosts дает удобный способ обмена именами между машинами

7
ответ дан 30 November 2019 в 09:56
поделиться

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

{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
  io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
10
ответ дан 30 November 2019 в 09:56
поделиться

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

12
ответ дан 30 November 2019 в 09:56
поделиться

Параметризованные модули! С http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang и http://www.erlang.se/euc/07/ paper / 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
14
ответ дан 30 November 2019 в 09:56
поделиться

Наследование! 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
25
ответ дан 30 November 2019 в 09:56
поделиться

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

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

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

5
ответ дан 30 November 2019 в 09:56
поделиться

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

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

2
ответ дан 30 November 2019 в 09:56
поделиться

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

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

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

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

8
ответ дан 30 November 2019 в 09:56
поделиться

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

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

9
ответ дан 30 November 2019 в 09:56
поделиться

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

  • Возможность расширенной трассировки на действующих узлах (в процессе эксплуатации) и одна из лучших возможностей отладки!
2
ответ дан 30 November 2019 в 09:56
поделиться

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

erl -sname foo -hidden

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

2
ответ дан 30 November 2019 в 09:56
поделиться

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

-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"
6
ответ дан 30 November 2019 в 09:56
поделиться