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

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

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

19
задан Emanuil Rusev 17 August 2010 в 04:50
поделиться

13 ответов

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

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

47
ответ дан 30 November 2019 в 01:44
поделиться

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

 function(a, b - c);

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

 function(a b - c);

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

56
ответ дан 30 November 2019 в 01:44
поделиться

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

6
ответ дан 30 November 2019 в 01:44
поделиться

Это неправда. В некоторых языках запятые не используются. Функции были математическими концепциями до программных конструкций, поэтому в некоторых языках сохраняются старые обозначения. Большинство новых разработок было вдохновлено C (Javascript, Java, C #, PHP тоже, они разделяют некоторые формальные правила, такие как запятая).

2
ответ дан 30 November 2019 в 01:44
поделиться

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

он в первую очередь помогает вам читать.

3
ответ дан 30 November 2019 в 01:44
поделиться

Это, наверное, традиция. Если они использовали пробел, они не могли передать выражение как параметр, например.

f(a-b c)

будет сильно отличаться от

f(a -b c)
0
ответ дан 30 November 2019 в 01:44
поделиться

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

12
ответ дан 30 November 2019 в 01:44
поделиться

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

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

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

Секунда будет 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), где нет проверки времени компиляции, где компилятор может предупредить вас, что способ разрешения неоднозначности, как указано выше, не соответствует сигнатуре вызова, который вы хотите сделать. У вас будет много странных ошибок во время выполнения и действительно тяжелая жизнь.

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

5
ответ дан 30 November 2019 в 01:44
поделиться

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

4
ответ дан 30 November 2019 в 01:44
поделиться

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

2
ответ дан 30 November 2019 в 01:44
поделиться

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

2
ответ дан 30 November 2019 в 01:44
поделиться

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

1
ответ дан 30 November 2019 в 01:44
поделиться

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

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

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

Рассмотрим:

someFunction( name, age, location ) 

vs.

someFunction (name | age | location)

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

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

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

2
ответ дан 30 November 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: