Чому Swift не вимагає крапки з комою? [зачинено]


20

Я зазвичай кодую або c # або Objective-C, і нещодавно взяв на себе, щоб вивчити нову мову програмування Apple - Swift.

Перше, що я помітив, це те, що вам не потрібно додавати крапки з комою, щоб закінчити рядок у Swift, але якщо ви зробите - принаймні з того, що я тестував - це не заважає компілятору.

Коли я пишу:

int someNumber = 0;

у Objective-C крапка з комою вказує програмі, що рядок закінчився і не переходить на наступний рядок.

За допомогою Swift я можу оголосити змінну за допомогою

var someNumber:Int = 5

і не додавати крапку з комою, і система знає, що це кінець рядка.

Що дозволяє деяким мовам робити це, а іншим - ні? Чому б не зберегти єдину систему додавання крапки з комою до кінця?


Не всі походять з інших мов, то як би вони навіть знали, що вони не однакові? Чи не буде Apple залучати більше нових програмістів із Swift, позбавляючись частин Objective-C, які не люблять багато людей?
JeffO

2
Багато ветеринарів Obj-C незадоволені Swift і набагато віддають перевагу Obj-C. Це можна побачити на форумах Apple. Swift з'явився лише в 2014 році, і якщо ПОЛІ помилок і змін робиться кожні кілька місяців на мові, а Swift2.0 вийде цієї осені. Swift заснований на Obj-C, але спрямований на полегшення вивчення кодування за допомогою більш простої англійської мови.
Мемж

Старі реалізатори компілятора були просто ледачими та / або мали бути ефективнішими за допомогою більш простого розбору. У цьому більше немає потреби. Це так само, як локальний тип виводу, у вас його немає, лише якщо ваш автор компілятора лінивий і не піклується про досвід розробника.
Ebuall

Відповіді:


18

Що дозволяє деяким мовам робити це, а іншим - ні? Чому б не зберегти єдину систему додавання крапки з комою до кінця?

Роберт дав хорошу відповідь щодо Swift, я спробую додати трохи більше про розбір в цілому і чому використовувати чи ні крапки з комою.

Коли ви компілюєте програму, перед тим, як ваш вихідний файл перетвориться на виконуваний код, слід виконати кілька кроків, одним з перших є читання та аналіз . Під час розбору ваш код перетворюється з послідовності символів у структуроване подання відповідно до граматики мови. Для цього необхідно, щоб елементи, що складають ваш код (змінні, константи, декларації тощо), були якось ідентифіковані та відокремлені. Коли ви робите декларацію, як:

int someNumber = 0;

Це просто послідовність символів, яку якимось чином потрібно звернути до поняття "створити" річ ", що називається someNumberтипу, intі призначити 0їй" .

Для цього потрібно визначити, де саме починається і закінчується твердження. Уявіть, якби у вас це було:

int someNumber = 0;
int otherNumber = 1;

Вам потрібно знати, що це дві різні декларації. ;У C-подібних мовах використовується для цього, так що синтаксичний аналізатор зчитує символи до тих пір, поки не знайде, і спроби зрозуміти , що було просто читати як одне твердження. Це дозволяє, як сказав Роберт, мати кілька тверджень в одному рядку, наприклад:

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);;

Чому? Не знаю. :)

Різні мови розроблені з різною метою та різною філософією. Якби всі мови поділили один і той же синтаксис та умовні умови, вони, ймовірно, дозволять вам робити те саме, що однаково.


4
Гарне заключне речення.
Томас Едінг

Приємні приклади, але ви не відповіли на запитання.
Robo Robok

Додатковий пункт даних: Деякі мови застосовують певний зворотний підхід до сімейства стилів C: Наприклад, HyperTalk використовує розриви рядків як жорсткий кінець рядка (замість крапки з комою) і вимагає уникнути розривів рядків, якщо ви хочете продовжити оператор через кілька рядків. Як не дивно, власне препроцесор C також працює таким чином.
uliwitness

11

Розмежування рядків використовуються замість крапки з комою для розмежування кінця оператора.

У мовному посібнику: Основи, про які йдеться:

На відміну від багатьох інших мов, Swift не вимагає, щоб ви писали крапку з комою (;) після кожного твердження у своєму коді, хоча ви можете це зробити, якщо хочете. Однак крапки з комою потрібні, якщо ви хочете написати кілька окремих заяв в одному рядку.

Чому? Тому що саме так хотіли це зробити мовні дизайнери.

Друге вище речення натякає на те, чому вам не потрібні крапки з комою; більшість висловлювань є однорядковими. Дотримуйтесь цього прикладу сортування бульбашок; комбінація однорядкових висловлювань і відсутність крапки з комою робить дуже чистим синтаксис, схожий на VB, але менш багатослівний:

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

Оскільки висловлювання у Swift зазвичай закінчуються на розриві рядка, потреба в крапках з комою для позначення кінця висловлювання зменшується. Інші мови, які використовують крапки з комою, не працюють таким чином; Ви можете вільно писати багаторядкові висловлювання, але єдиний спосіб, коли компілятор знає, що оператор закінчився, це коли ви розміщуєте крапку з комою в кінці.

Коли оператори не закінчуються на розриві рядка, ви повинні поставити розрив рядка на місце, яке компілятор Swift може визнати продовженням попереднього рядка:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")

2
Останнє твердження помилкове, немає конкретного місця для розміщення розривів рядків. Для покращення читабельності добре зберігати рядки коду з відступом та вирівнюванням.
Енеко Алонсо

Факт забави: це впливає на повідомлення про помилки. Багато компіляторів C (clang особливо хороший у цьому) використовують крапки з комою, щоб знайти кінець оператора з синтаксичною помилкою, і можуть використовувати цю інформацію, наприклад, повідомляти про відсутні дужки, що закриваються, ближче до місця, де вони фактично відсутні. Не вистачаючи крапки з комою, помилка в Swift часто може призвести до того, що наступний рядок буде укладений у попереднього попередника, що містить помилки, і призведе до дійсно дивних повідомлень про помилки.
uliwitness
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.