Изучаешь Эрланг? спидбамп нить, частые, небольшие проблемы - PullRequest
10 голосов
/ 10 января 2009

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

Например, вот первые спидбампы, которые у меня были:

  1. Используйте control_process (Socket, Pid), если вы порождаетесь в нескольких потоках. Правильный пакет к правильному потоку.
  2. Ты собираешься начать разговор с другим сервером? Не забудьте net_adm: ping ('car @ bsd-server'). в оболочке. Иначе никакое общение не пройдет.
  3. Таймер: сон (10), если вы не хотите ничего делать. Всегда полезно при отладке.

Ответы [ 7 ]

5 голосов
/ 26 февраля 2009
  • Учимся просматривать стандартную документацию

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

    Также простой просмотр документации для приложений часто весьма полезен - я обнаружил множество действительно полезного кода таким образом - sys, dbg, toolbar и т. Д.

  • Разница между оболочкой erlang и модулем erlang

    Shell erlang - это немного другой диалект, чем модуль erlang. Вы не можете определить функции модуля (только приколы), вам нужно загрузить определения записей для работы с записями (rr/1) и так далее. Научиться писать erlang-код в терминах анонимных функций довольно сложно, но важно для работы в производственных системах с удаленной оболочкой.

    Изучение взаимодействия между оболочкой и процессами {start, spawn} _link ed - когда вы запускаете некоторый код оболочки, который аварийно завершает работу (вызывает исключение), процесс оболочки завершается и передает сигналы выхода на все, с чем вы связаны. Это, в свою очередь, отключит тот новый gen_server, над которым вы работаете. ( «Почему мой серверный процесс продолжает исчезать?» )

  • Разница между выражениями erlang и защитными выражениями

    Защитные выражения (когда выражения) не являются выражениями Эрланга. Они могут выглядеть похожими, но они совершенно разные. Защитники не могут вызывать произвольные функции erlang, только функции защиты (length/1, тесты типов, element/2 и некоторые другие, указанные в документации OTP). Охранники преуспевают или терпят неудачу и не имеют побочных эффектов. С другой стороны, выражения Erlang могут делать то, что им нравится.

  • Загрузка кода

    Определение того, когда и как работают обновления кода, - заклинание заставить gen_server обновиться до последней версии модуля обратного вызова (code:load(Mod), sys:suspend(Pid), sys:change_code(Pid, Mod, undefined, undefined), sys:resume(Pid).).

    Путь к серверу кода (code:get_path/0) - я не могу сосчитать, сколько раз я сталкивался с неопределенными ошибками функций, которые, как оказалось, были забыты мной при добавлении каталога ebin в путь поиска кода.

  • Код здания erlang

    Разработка полезной комбинации emake (make:all/0 и erl -make) и gnu make заняла довольно много времени (около трех лет:).

    Мои текущие любимые make-файлы можно увидеть на http://github.com/archaelus/esmtp/tree/master

  • Распределение Эрланга

    Получение имен узлов, днс, куки и всего остального в порядке, чтобы иметь возможность net_adm:ping/1 другого узла. Это требует практики.

  • Сложности ввода-вывода удаленной оболочки

    Не забывая передавать group_leader() на io:format вызовы, выполняемые на удаленном узле, так что вывод появляется в вашей оболочке, а не таинственно исчезает ( Я думаю, что в браузере отчетов SASL rb все еще есть проблема с отправкой часть его вывода на неправильный узел при использовании через соединение с удаленной оболочкой )

2 голосов
/ 27 февраля 2009
  • Отладка сложная. Все, что я знаю, это вставлять вызовы "error_logger: info_msg" в мой код.
  • Документы были пятнистыми - они правильные, но очень краткие.
  • Это моя собственная ошибка, но: я начал писать код до того, как понял eunit, поэтому тестирование большей части моего кода сложнее, чем должно быть.
2 голосов
/ 25 февраля 2009

Интегрируя его в msvc 6, чтобы я мог использовать редактор и видеть результаты в окне вывода.

Я создал инструмент, с

команда - путь к erlc

аргументы - + debug_info $ (FileName) $ (FileExt)

Исходный каталог - $ (fileDir)

Проверено Использовать окно вывода .

1 голос
/ 11 января 2009

net_adm: пинг ()

Ты собираешься начать разговор с другим сервером? Не забудьте net_adm: ping ('car @ bsd-server'). в оболочке. Иначе никакое общение не пройдет.

1 голос
/ 11 января 2009

controlling_process ()

Используйте control_process (Socket, Pid), если вы порождаетесь в нескольких потоках. Правильный пакет к правильному потоку.

0 голосов
/ 24 февраля 2009

То, что мне потребовалось больше всего времени, чтобы прийти в голову, это просто идея структурировать мой код полностью вокруг вызовов функций и передачи сообщений. Остальное либо просто выпало оттуда (нерест, удаленные узлы), либо выглядело как обычные вещи, которые вы должны выучить на любом новом языке (синтаксис, stdlib).

0 голосов
/ 11 января 2009

Таймер: сон ()

Пауза для X мс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...