Действительно ли Erlang или Elixir разрешаются по имени таким образом, что требуется изменение имени?

Решает ли понятие «арность» эту проблему?

Я бегло просмотрел http://www.erlang.org/doc/man/global.html, но в основном это связано с регистрацией узлов, а не с разрешением по имени для функций или атомов.

Использует ли CosNaming (http://www.erlang.org/doc/man/CosNaming_NamingContext.html) разобраться с этим?


person Nathan Basanese    schedule 11.11.2015    source источник
comment
Что вы имеете в виду под коверканием имен? В любом случае Erlang и Elixir разрешают функции явно по имени + арности — здесь нет перегрузки функций, как в C, и функции с переменным числом переменных не могут быть определены (хотя в зависимости от того, зачем вам нужны аргументы списка функций с переменным числом аргументов, как правило, очень хорошо покрывают это и могут быть гораздо точнее семантически). Я немного обсуждал это в ответе здесь об импорте функций Elixir и разрешении имен: function-on-elixir/26654128#26654128" title="укажите арность, используя только или исключая при импорте функции в elixir"> stackoverflow.com/questions/26644258/   -  person zxq9    schedule 11.11.2015
comment
// , Изменение имени — довольно хорошо обсуждаемый термин. Я имею в виду это здесь как общее решение проблемы перегруженных идентификаторов в языках программирования. (Идентификатор перегружается, если одно и то же имя используется более чем в одном контексте или имеет более одного значения.)   -  person Nathan Basanese    schedule 15.11.2015
comment
В контексте конкретных языков/сред выполнения он хорошо определен, но каждый из них имеет разное значение, поэтому я и спросил (рассмотрите, например, искажение имен в C, Python и Java). В любом случае, в Erlang VM name/arity является конкретным, явным идентификатором, и его нельзя обойти. Как и в таких языках, как Python, в которых, кажется, отсутствует функция X или Y, упущение здесь является признаком преднамеренного проектирования, а не импульсивного выбора, и является центральным в том, как программисты думают о языке. Вот почему я думаю, что это хороший вопрос - возможно, если перефразировать, это будет отличный вопрос.   -  person zxq9    schedule 15.11.2015
comment
Одно предостережение, о котором я забыл упомянуть (я действительно должен указать все это в ответе, но мне уже пора спать... может быть, завтра), имена функций - это атомы, а это означает, что вы действительно можете ссылаться на функция N-арности по имени, если вы передаете общий идентификатор как атом. Допустим, у вас есть Args1 = [1,2,3] и Args2 = [1,2] и две функции foo/2 и foo/3. Вы можете сделать apply(Fun, Args1) или apply(Fun, Args2), и будет выбрано подходящее, что оставляет дверь широко открытой для эффективного вариативного или каррированного каскада функций defs. Просто наблюдайте за своими типами и делайте диализ.   -  person zxq9    schedule 15.11.2015
comment
// , Как бы вы перефразировали вопрос о его судьбе величия, @zxq9? Кроме того, zxq9, похоже, что этот первый комментарий может означать предложение отредактировать мой вопрос о том, что означает изменение имени в Erlang.   -  person Nathan Basanese    schedule 30.11.2015


Ответы (1)


Если под «искажением имен» вы подразумеваете концепцию из С++, то нет, я не думаю, что они это делают.

В Erlang или Elixir нет перегрузки функций. (Я пытался найти источник, чтобы указать вам, но поверьте мне — его там просто нет.) Функции выбираются только по арности, и одно и то же имя функции с двумя разными арностями — это две разные функции. f/0 отличается от f/1, который отличается от f/2. Как указал @zxq9 в комментариях, из-за этого свойства в Erlang или Elixir также нет переменной арности, хотя это можно смоделировать, передав списки в качестве параметров.

В этой части документации по Erlang обсуждается, как Erlang определяет, к какой функции обращаться. В то время как механизм ниже тот же самый для Эликсира, синтаксис отличается.

person Onorio Catenacci    schedule 11.11.2015
comment
Эта обработка функций, имен и атрибутов встроена в виртуальную машину, поэтому ее невозможно обойти. Вы можете подделать это, поместив аргументы в списки, как вы упомянули (я сделал это), но вы не можете обойти это. - person rvirding; 12.11.2015