Используется для синтаксиса переменных аргументов, когда доступны сокращенные списки и переопределение подписи метода - PullRequest
4 голосов
/ 14 ноября 2011

Для языка, который имеет простой сокращенный синтаксис для списков, например

x = [1,2,3];

И возможность перегрузки функций с разными сигнатурами ...

Есть ли какие-либо применения для переменнойСинтаксис аргумента для функций, которые не были бы так же четко сделаны через списки?Например, обычное использование varargs для оператора типа printf:

printf("This is %s while this is a number %d\n", "a string", 10);

Однако вы можете так же легко и просто сделать вышеуказанное с помощью:

printf("This is %s while this is a number %d\n", ["a string", 10]);

Единственная вещьДо сих пор мне удавалось придумать реализацию структур потоков управления, таких как if/elseif/else, где вы захотите передавать переменное число блоков elseif/else.Однако этого можно избежать, разбив elseif на else с if в качестве единой команды.

Итак, есть ли типы вещей, которые нельзя сделать (чисто / ясно) без специальногоСинтаксис varargs?

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Аргументы переменных следует включать, даже если сокращенные списки могут служить одной и той же цели, поскольку они повышают интуитивность и уменьшают количество ошибок.

[Предполагается, что вы согласны с тем, что приемлемым «использованием» языковой функции является интуитивность и уменьшение ошибок.]

Я основываю это на чисто анекдотическом опыте использования обеих этих функций на проприетарном языке сценариев игры и наблюдаемой кривой обучения и общих ошибках, допущенных пользователями. [Пользователи варьировались от новичков до ветеранов индустрии в нескольких многолетних проектах в течение полутора десятилетий в различных игровых компаниях - самая большая с 160 членами команды (20 основных пользователей сценариев + около 50 сценариев в реальном времени ») онлайн-пользователи). Некоторые были чистыми сценаристами, которые знали только этот язык сценариев или пару других, а некоторые были также опытными программистами на C ++ - обе группы, похоже, имели одинаковые результаты по этому вопросу.]

[Если это уместно - язык, на котором я это основываю, также имел типизированные переменные аргументы, и у всех типов есть общий базовый класс.]

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

В «диком» я обнаружил механизм, использующий сокращенный список с двумя дополнительными символами для включения, означавший, что есть только еще два символа, которые можно забыть. Я основываю это на том, сколько раз меня вызывали, чтобы «помочь» пользователям, у которых были проблемы с версиями методов, основанными на списках, в отличие от методов с переменным аргументом.

Что касается интуитивности, я провел несколько профилирований / подсчетов для методов, и количество случаев использования методов переменной длины значительно перевешивало методы списка. Также, когда их спрашивали, люди, казалось, эстетически предпочитали переменные версии arg.

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

Я большой сторонник только добавления функций, которые необходимы, чтобы уменьшить количество, которое конкретный программист должен держать в голове в любой момент, хотя на протяжении многих лет я обнаружил, что допустимым исключением из этого правила является иногда гарантируется, если функция проще в использовании или вызывает меньше ошибок. [Более ранний язык сценариев, который я написал, был очень оптимизированным - и, на мой взгляд, элегантным - хотя я усвоил трудный способ, которым людям это нравилось больше, и у него было меньше проблем с ним, когда я развил его, чтобы получить немного больше "избыточности" во имя интуитивности и уменьшения ошибок.]

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

[Кроме того]

Другая потенциальная конкретная разница между переменными аргументами и сокращенными списками зависит от того, может ли язык указать разницу между тем, как аргументы передаются в аспект переменной arg интерфейса метода / функции и аргументов / операторов, используемых в качестве элементы в сокращенном списке.

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

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

0 голосов
/ 16 ноября 2011

Для проблемы if / elseif / else существует решение, которое существует около 50 лет на языках, подобных LISP, - ищите COND.

(COND
    (condition1 value1)
    (condition2 value2)
    (condition3 value3)
    (T default))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...