Кажется, что все языки программирования используют запятые (,) для разделения параметров функции.
Почему не вместо них используются только пробелы?
Прежде всего, ваша предпосылка ложна. Есть языков, которые используют пробел в качестве разделителя (lisp, ML, haskell, возможно, другие).
Причина, по которой большинство языков этого не делает, вероятно, состоит в том, что а) f (x, y)
- это обозначение, к которому большинство людей привыкло из математики, и б) использование пробелов приводит к множеству вложенных круглых скобок ( также называемый «эффектом шепелявости»).
Абсолютно нет. А как насчет этого вызова функции:
function(a, b - c);
Как это будет выглядеть с пробелом вместо запятой?
function(a b - c);
Означает ли это function (a, b - c);
или function (a, б, -с);
? Использование запятой предположительно пришло из математики, где запятые веками использовались для разделения параметров функций.
Tcl использует пробел в качестве разделителя между словами, передаваемыми командам. Если в нем есть составной аргумент, его следует заключить в квадратные скобки или иным образом процитировать. Имейте в виду, даже здесь вы найдете использование запятых в качестве разделителей - только в синтаксисе выражений - но это потому, что нотация широко используется вне программирования. Математики уже очень давно писали n -арные приложения-функции таким образом; вычисления (особенно Фортран) просто заимствованы.
Это неправда. В некоторых языках запятые не используются. Функции были математическими концепциями до программных конструкций, поэтому в некоторых языках сохраняются старые обозначения. Большинство новых разработок было вдохновлено C (Javascript, Java, C #, PHP тоже, они разделяют некоторые формальные правила, такие как запятая).
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
он в первую очередь помогает вам читать.
Это, наверное, традиция. Если они использовали пробел, они не могли передать выражение как параметр, например.
f(a-b c)
будет сильно отличаться от
f(a -b c)
Lisp-подобные языки используют: (f arg1 arg2 arg3)
, что по сути является тем, что вы просите.
ML-подобные языки используют конкатенацию для применения каррированных аргументов, поэтому вы должны написать f arg1 arg2 arg3
.
Уже указывалось несколько исторических причин.
Кроме того, это потому, что в большинстве языков, где ,
служат в качестве разделителя, последовательности пробелов в значительной степени игнорируются, или, если быть более точным, хотя они могут разделять токены , они не действуют как токены. Более того, это верно для всех языков, у которых синтаксис основан на 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), где нет проверки времени компиляции, где компилятор может предупредить вас, что способ разрешения неоднозначности, как указано выше, не соответствует сигнатуре вызова, который вы хотите сделать. У вас будет много странных ошибок во время выполнения и действительно тяжелая жизнь.
Есть языки, которые позволяют это, но есть ряд причин, почему они это делают. Во-первых, потому что группа очень умных людей села и потратила некоторое время на разработку языка, а затем обнаружила, что его синтаксис делает ,
большую часть времени устаревшим, и поэтому приняли решение исключить Это.
Вам не нужно заглядывать дальше большинства наших естественных языков, чтобы увидеть, что запятая используется для разделения элементов в списках. Таким образом, использование чего-либо, кроме запятой для перечисления параметров, было бы неожиданным для любого, кто впервые изучает язык программирования.
Это может показаться немного мудрым , но я понимаю по той же причине, по которой он используется в большинстве языков Земли и планет (английский, французский и несколько других ;-) Также , это интуитивно понятно для большинства.
Хотя некоторые языки используют пробелы, использование запятой позволяет избежать двусмысленных ситуаций без необходимости использования круглых скобок. Более интересным может быть вопрос, почему в языке C в качестве разделителя используется тот же символ, что и в операторе "a then b"; последний вопрос в некотором смысле более интересен, учитывая, что в наборе символов языка C есть еще три символа, которые не встречаются ни в каком контексте (знак доллара, commercial-at и grave, и я знаю, что по крайней мере один из них (знак доллара) восходит к 40-символьному набору перфокарт.
Я программировал на нескольких языках, и хотя запятая не имеет решающего значения, она определенно находится впереди. Запятая хороша тем, что это видимый символ, поэтому сценарий можно сжать, удалив пробелы, не нарушая при этом ничего. Если у вас есть место, тогда у вас могут быть вкладки, и это может быть проблемой ... Есть проблемы с новыми строками и пробелами в конце строки. Поставьте мне запятую в любой день, вы можете увидеть это и вы знаете, что он делает. Пробелы предназначены для удобства чтения (как правило), а запятые являются частью синтаксиса. Имейте в виду, что существует множество исключений, когда пространство требуется или является обязательным. Еще мне нравятся фигурные скобки.
Похоже, что все языки программирования используют запятые (,) для разделения параметров функций.
В естественных языках, в сценариях которых есть запятая, этот символ используется для разделения вещей. Например, если вы будете нумеровать фрукты, вы должны написать: «лимон, апельсин, клубника, виноград»
То есть через запятую.
Следовательно, использование запятой для разделения параметров в функции более естественно, чем использование другого символа (например, |)
Рассмотрим:
someFunction( name, age, location )
vs.
someFunction (name | age | location)
Почему вместо этого не используются просто пробелы?
Это возможно. Лисп это делает.
Основная причина в том, что пространство уже используется для разделения токенов, и проще не назначать дополнительную функциональность.