Почему языки программирования используют запятые для разделения параметров функции? - PullRequest
19 голосов
/ 15 августа 2010

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

Почему вместо них не используются только пробелы?

Ответы [ 14 ]

56 голосов
/ 15 августа 2010

Абсолютно нет. Как насчет вызова этой функции:

 function(a, b - c);

Как это будет выглядеть с пробелом вместо запятой?

 function(a b - c);

Означает ли это function(a, b - c); или function(a, b, -c);? Использование запятой предположительно происходит из математики, где запятые использовались для разделения параметров функции на протяжении веков.

47 голосов
/ 15 августа 2010

Прежде всего, ваша предпосылка ложна. - это языки, которые используют пробел в качестве разделителя (lisp, ML, haskell, возможно, другие).

Причина, по которой большинство языков этого не делают, заключается в том, что а) f(x,y) являетсяобозначения, к которым большинство людей привыкли к математике, и б) использование пробелов приводит к множеству вложенных скобок (также называемых «эффектом шумихи»).

12 голосов
/ 15 августа 2010

Lisp-подобные языки используют: (f arg1 arg2 arg3), что по сути то, что вы просите. ML-подобные языки используют конкатенацию для применения аргументов карри, поэтому вы должны написать f arg1 arg2 arg3.

6 голосов
/ 15 августа 2010

Tcl использует пробел в качестве разделителя между словами, передаваемыми командам.Там, где он имеет сложный аргумент, его следует заключить в скобки или иным образом привести в кавычки.Напоминаем, что даже там вы найдете использование запятых в качестве разделителей - только в синтаксисе выражений - но это потому, что нотация широко используется вне программирования.Математика написала n -приложения функций таким образом в течение очень долгого времени;вычисления (особенно Fortran) только что позаимствованы.

5 голосов
/ 15 августа 2010

На это уже указывалось несколько исторических причин.

Кроме того, это связано с тем, что в большинстве языков, где , служит разделителем, последовательности пробелов в значительной степени игнорируются или, если быть более точными, хотя они могутотдельные токены , они сами не действуют как токены.Это более верно для всех языков, у которых их синтаксис получен из C. Последовательность пробелов во многом похожа на пустое слово, а наличие пустого слова delimit что-нибудь, вероятно, не лучшая идея.

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

Секунда будет f(a (b + c)).Теперь это f(a(b+c)) или f(a, b+c)?

У создателей JavaScript была очень полезная идея, похожая на вашу, которая приводит к тем же проблемам.Идея заключалась в том, что ENTER мог бы также служить ;, если утверждение было завершено.Заметьте:

function a() {
    return "some really long string or expression or whatsoever";
}

function b() {
    return 
          "some really long string or expression or whatsoever";
}
alert(a());//"some really long string or expression or whatsoever"
alert(b());//"undefined" or "null" or whatever, because 'return;' is a valid statement

На самом деле, я иногда склоняюсь использовать последнее обозначение в языках, которые не имеют этой «особенности».JavaScript заставляет меня отформатировать мой код, потому что у кого-то была классная идея - использовать ENTER вместо ;.

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

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

4 голосов
/ 15 августа 2010

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

3 голосов
/ 16 августа 2010

Haskell не использует запятые.

Пример

multList :: [Int] -> Int -> [Int]
multList (x : xs) y = (x * y) : (multList xs y) 
multList [] _ = []

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

Попробуйте прочитать эти

void foo(void * ptr point & * big list<pointers<point> > * t)

запятые полезны, как пробелы.На латыни ничего не было написано с пробелами, точками или строчными буквами.

Попробуйте прочитать это

IAMTHEVERYMODELOFAWHATDOYOUWANTNOTHATSMYBUCKET

Это в первую очередь поможет вам прочитать вещи.

2 голосов
/ 16 августа 2010

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

В естественных языках, которые включают в свой скрипт запятую, этот символиспользуется для разделения вещей.Например, если вы хотите перечислить фрукты, вы должны написать: "lemon, orange, strawberry, grape" То есть, используя запятую.

Следовательно, использование запятой для разделения параметров в функции более естественно, чем использование другого символа (| например)

Рассмотрим:

someFunction( name, age, location ) 

против.

someFunction (name | age | location)

Почему вместо них не используются только пробелы?

Это возможно,Лисп делает это.

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

2 голосов
/ 15 августа 2010

В то время как в некоторых языках используются пробелы, использование запятой позволяет избежать неоднозначных ситуаций без использования скобок. Более интересным вопросом может быть то, почему C использует тот же символ в качестве разделителя, что и для оператора «a then b»; последний вопрос в некотором смысле более интересен, учитывая, что набор символов C содержит три других символа, которые не появляются ни в каком контексте (знак доллара, реклама и могила, и я знаю, по крайней мере, один из них (знак доллара) ) восходит к 40-символьному набору перфокарт.

2 голосов
/ 15 августа 2010

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

...