Параметризованные модули в Эрланге - PullRequest
6 голосов
/ 17 марта 2011

Я просматривал исходный код mochiweb и увидел то, что никогда раньше не использовал. Объявление модуля, особенно в модулях mochiweb_request и mochiweb_response, найденных в библиотеке http mochiweb. Вот как начинается модуль:

-module(mochiweb_request,[Socket, Method, RawPath, Version, Headers]).
-author(...).

Тогда в модуле вы видите get(socket) -> Socket;get(method)-> Method; ....
Это смутило меня. Когда я попытался получить информацию о модуле одного из таких модулей, компилятор добавил что-то: {abstract,true} в ответ на:
mochiweb_request:module_info().. Infact, их документация ссылается на эти модули как abstract modules.

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

Эти модули не могут быть вызваны напрямую, но вызываются сами по себе. Это заставляет модули вести себя так, как будто они были забавными. Я пришел к выводу, что это неофициальная функция в системе времени выполнения. Меня смущает то, что ребята из mochiweb используют это хорошо! В модуле mochiweb вы найдете себя пишущим:

loop(Req,_DocRoot)->
    "/" ++ Path = Req:get_path(),
    Body = Req:recv_body(),
    Method = Req:get(method),
    ...,
    ....,
    Response = Req:ok({"text.html;charset=utf-8",[],chunked}),
    Response:write_chunk("Some text here....."),
    ...

Попытка io:format("\n\t Req = ~p~n",[Req]) выявляет сложную структуру данных (кортеж), чья element(1,Req) == mochiweb_request. Это интересно!? !!!?

Вопрос 1: На данный момент это стабильно для использования в производстве, или я могу подождать, пока оно не станет официальным?

Вопрос 2: Как ребята из mochiweb обрели уверенность в использовании этого, если оно еще не официально?

Вопрос 3: Почему это еще не официально? (потому что для меня это приносит некоторые объектно-ориентированные функции)

Вопрос 4: есть ли кто-нибудь, кто использовал это также? В каких случаях он / она использовал эти параметризованные модули? Зачем? Можете ли вы указать нам, чтобы увидеть или опубликовать ссылку на некоторый исходный код, чтобы мы могли узнать больше об этой функции?

Последний вопрос: нигде в документах Erlang я не нашел эту функцию, о которой говорили. Нет учебника, нет даже дома . Так как же те, кто его использовал, уже узнали, как и зачем его использовать? Она уже включена в коммерческую версию системы времени исполнения Erlang, найдена здесь ?

Ответы [ 2 ]

4 голосов
/ 06 июня 2013

Вопрос 1: На данный момент это стабильно для использования в производстве или я могу подождать, пока оно не станет официальным?

Он был удален в R16B.С README :

OTP-10616 Экспериментальная функция «параметризованные модули» (также называемая «абстрактными модулями») была удалена.Для приложений, которые зависят от параметризованных модулей, существует преобразование синтаксического анализа, которое можно использовать для использования параметризованных модулей.Преобразование синтаксического анализа можно найти по адресу: http://github.com/erlang/pmod_transform

Вопрос 2: Как парни из mochiweb обрели уверенность в его использовании, если он еще не официальный?

Использованиепараметризованные модули были удалены из Mochiweb , начиная с версии 2.4.0, хотя вызовы ранее параметризованных модулей по-прежнему выглядят одинаково, , поскольку механизм реализации параметризованных модулей (кортежных модулей) сохраняется дляобратная совместимость. даже при том, что поддержка вызовов кортежей была удалена из компилятора в Erlang / OTP 21.0 :

OTP-14497 Приложение (я): компилятор, erts

* ПОТЕНЦИАЛЬНАЯ НЕСОВМЕСТИМОСТЬ *

Поддержка "вызовов кортежей" удалена из системы времени выполнения.Вызовы кортежей были недокументированной и неподдерживаемой функцией, которая позволяла аргументу модуля для операции apply быть кортежем: Var = dict:new(), Var:size().Эта «функция» часто вызывала путаницу, особенно когда такой вызов не удался.Трассировка стека будет указывать на функции, которых нет в исходном коде.

Для устаревшего кода, для которого необходимо использовать параметризованные модули или вызовы кортежей по какой-то другой причине, существует новая опция компилятора под названием tuple_calls.Когда эта опция задана, компилятор сгенерирует дополнительный код, который имитирует старое поведение для вызовов, где модуль является переменной.

Mochiweb теперь использует параметр компилятора tuple_calls чтобы этот тип кода продолжал работать.

Вопрос 3: Почему он еще не является официальным?(потому что для меня это приносит некоторые объектно-ориентированные функции)

Из решения Технического совета, объявляющего об окончании параметризованных модулей :

Плата подтверждаетчто многие программы используют эту функцию, хотя она всегда была экспериментальной.Текущая форма реализации неприемлема, и параметризованные модули как таковые никогда не были приняты в качестве функции в языке.Эта функция также не совместима, например, с модулем fun, и не полностью интегрирована с остальными инструментами OTP.

3 голосов
/ 17 марта 2011

Вопрос 1: На данный момент он стабилен в производстве или я могу подождать, пока он не станет официальным?

Он очень стабилен для производственного использования и существует уже некоторое время. Это не является частью официального стандарта.

Вопрос 2: Как ребята из mochiweb обрели уверенность в использовании этого, если оно еще не официально?

Тебе придется попросить парней из моти-паутины. Возможно, они считают, что могут быстро изменить его, если его вытащить.

Вопрос 3: Почему это еще не официально? (потому что для меня это приносит некоторые объектно-ориентированные функции)

Потому что он полон противоречий. Непонятно, какую пользу это приносит языку и как это облегчает работу, поэтому у P. Modules есть свои сторонники и противники. Следовательно, текущая точка зрения заключается в том, что она является частью реализации, поэтому люди могут поиграть с ней и посмотреть, чувствуют ли они, что их код легче читать и писать. Неофициальность означает, что его можно потянуть без принижения, и кажется, что парни из Эрланга оставляют за собой это право.

личная предвзятость: Мне это нравится, но я никогда не буду использовать его для передачи ООП-функций в Erlang. ООП - уродливое чудовище с полным дерьмом, которому нет места в программировании. Это просто страдание, которое будет преследовать ваши программы, пока они не прогнили до глубины души, ходят как зомби и злятся. Единственное решение на данный момент - дробовик. Скорее, я хотел бы использовать его в качестве функторов в стиле ML - который более статичен, и мне кажется, что он лучше соответствует идиомам Эрланга.

Последний вопрос: Нет, где в Документах Эрланга я нашел эту функцию, о которой говорили. Нет учебника, даже дома. Так как же те, кто его использовал, уже узнали, как и зачем его использовать? Она уже включена в коммерческую версию системы времени выполнения Erlang, найденную здесь?

Автор представил эту вещь на конференции в Эрланге несколько лет назад. С тех пор это была комбинация из уст в уста и так далее.

...