Что позволяет некоторым языкам делать это, а другим - нет? Почему бы не сохранить единую систему добавления точки с запятой в конец?
Роберт дал хороший ответ относительно Swift, я постараюсь добавить немного больше о синтаксическом анализе в целом и о том, зачем использовать точки с запятой или нет.
Когда вы компилируете программу, есть несколько шагов, прежде чем ваш исходный файл превратится в исполняемый код, одним из первых из которых будет чтение и анализ . Во время синтаксического анализа ваш код преобразуется из последовательности символов в структурированное представление в соответствии с грамматикой языка. Для этого необходимо, чтобы элементы, составляющие ваш код (переменные, константы, объявления и т. Д.) Были как-то идентифицированы и разделены. Когда вы делаете заявление, как:
int someNumber = 0;
Это просто последовательность символов, которую нужно как-то превратить в концепцию «создать« вещь », называемую someNumber
типом, int
и присвоить 0
ей» .
Это требует определения, где именно утверждение начинается и заканчивается. Представьте, если бы у вас было это:
int someNumber = 0;
int otherNumber = 1;
Вы должны знать, что это две разные декларации. Для этого ;
используется язык C-like, поэтому синтаксический анализатор читает символы до тех пор, пока не найдет их, и пытается понять то, что было только что прочитано, как одно утверждение. Это позволяет, как сказал Роберт, иметь несколько операторов в одной строке, например:
int someNumber = 0; int otherNumber = 1;
Который имеет тот же эффект, что и запись их в две строки.
На других языках, таких как Python , вы должны помещать каждое утверждение в отдельную строку.
x = 3
if x < 10:
print 'x smaller than 10'
else:
print 'x is bigger than 10 or equal'
Поэтому нет необходимости добавлять ;
, потому что сам язык не позволяет вам добавлять операторы в одной строке!
Тем не менее, другие языки, такие как LISP или Scheme , имеют совсем другой способ группировки утверждений (хорошо, они на самом деле не являются утверждениями, но давайте пока проигнорируем это). Таким образом, у вас есть только круглые скобки для всего:
(define (do-stuff x)
(begin
(display (format "value: ~a" x))
x))
Опять же, вам не нужно ;
только потому, что вы используете те же символы ( )
, (
) для вещей, которые в других языках {
,}
, :
и т.д. Кто - то , кто знает синтаксис Lisp может спросить: Зачем вам ;
в конце вашего заявления ?
Просто чтобы добавить пример с незнакомцем: OCaml точка с запятой не только в конце операторов, но и с двумя!
let rec fact x =
if x <= 1 then 1 else x * fact (x - 1);;
Почему? Я не знаю. :)
Разные языки предназначены для разных целей и разных философий. Если бы все языки имели одинаковый синтаксис и соглашения, они, вероятно, позволили бы вам делать одни и те же вещи одинаково.