web-dev-qa-db-ja.com

Swiftがセミコロンを必要としないのはなぜですか?

私は通常、c#またはObjective-Cのいずれかでコーディングし、最近、Appleの新しいプログラミング言語であるSwiftを学ぶようになりました。

最初に気づいたのは、Swiftで行を終了するためにセミコロンを追加する必要がないことですが、少なくとも私がテストしたことから行う場合は、コンパイラ。

私が書くとき:

int someNumber = 0;

objective-Cでは、セミコロンは行が終了し、次の行に移動しないことをプログラムに伝えます。

Swiftで、変数を次のように宣言できます

var someNumber:Int = 5

セミコロンを追加しないと、システムはこれが行の終わりであることを認識します。

一部の言語でこれを実行し、他の言語でこれを許可しないのは何ですか?最後にセミコロンを追加する統一されたシステムを維持しないのはなぜですか?

20
Memj

一部の言語でこれを実行し、他の言語でこれを許可しないのは何ですか?最後にセミコロンを追加する統一されたシステムを維持しないのはなぜですか?

RobertはSwiftに関して良い答えを出しました。一般的な解析と、セミコロンを使用するかどうかについて、もう少し詳しく説明します。

プログラムをコンパイルするとき、ソースファイルが実行可能コードに変換されるまでにいくつかのステップがあります。最初の1つは読み取り、そして 解析 です。解析中に、コードは一連の文字から言語の grammar に従って構造化表現に変換されます。そのためには、コードを構成する要素(変数、定数、宣言など)を何らかの方法で識別して分離する必要があります。次のような宣言をすると:

int someNumber = 0;

それは、どういうわけかコンセプトに変える必要がある文字のシーケンスです "someNumberと呼ばれるタイプintの「もの」を作成し、それに0を割り当てます「

これには、ステートメントが正確に開始および終了する場所を特定する必要があります。あなたがこれを持っていると想像してください:

int someNumber = 0;
int otherNumber = 1;

これらは2つの異なる宣言であることを知っておく必要があります。 Cライク言語の;がそのために使用されるため、パーサーは文字を見つけるまで文字を読み取り、読み取られたものを単一のステートメントとして理解しようとします。これにより、ロバートが言ったように、次のように同じ行にいくつかのステートメントを含めることができます。

int someNumber = 0; int otherNumber = 1;

これは、2行で記述するのとまったく同じ効果があります。

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 ステートメントの終わりにセミコロンがあるだけでなく... 2つあります!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

どうして?知りません。 :)

異なる言語は異なる目的と異なる哲学で設計されています。すべての言語が同じ構文と規則を共有している場合、おそらく同じ方法で同じことを行うことしかできません。

18
Sebastian

ステートメントの終わりを区切るために、セミコロンの代わりに改行が使用されます。

言語ガイド:基本 には次のように書かれています:

他の多くの言語とは異なり、Swiftでは、必要に応じてコードの各ステートメントの後にセミコロン(;)を記述する必要はありません。ただし、セミコロンは必須です。 1行に複数の個別のステートメントを記述したい。

どうして?それは言語デザイナーがそうしたかったからです。

上記の2番目の文は、セミコロンが不要な理由を示しています。ほとんどのステートメントは1行です。このバブルソートの例を確認してください。単一行ステートメントとセミコロンなしの組み合わせにより、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")
11
Robert Harvey