Skip to content

変数宣言

本章では YaoXiang における変数宣言の中核的な構文について説明します。他のプログラミング言語の経験がある場合、YaoXiang の変数システムは得非常シンプルなことがわかります——すべての宣言が同一の構文モデルを共有しています。

統一された構文モデル

YaoXiang の設計哲学は「すべてが統一されている」です。整数の宣言、関数の定義、型の作成に関わらず、同じ構文体系を使用します:

name: type = value

これは YaoXiang の最も核となる設計理念です。いくつかの例を見ると、この統一性の一貫性を体感できます:

yaoxiang
// 変数宣言
x: Int = 42
name: String = "YaoXiang"

// 関数定義
add: (a: Int, b: Int) -> Int = a + b

// 型定義
Point: Type = { x: Float, y: Float }

構文仕様における変数宣言の形式的な定義は:

('mut')? Identifier (':' TypeExpr)? '=' Expr

日本語で説明すると:オプションで mut キーワードを付けることができ、その後ろに変数名を書き、オプションで : 型 を書き、最後に = 値 を書きます。この構造は言語全体を通じて一貫しており、一度はっきりと学べばそれで完了です。

不変変数(デフォルトの動作)

YaoXiang では、すべての変数はデフォルトで不変です。一度値を代入すると、それ以上変更することはできません。これは言語の安全性を 위한設計です。

yaoxiang
x = 10
// x = 20   // コンパイルエラー!x は不変です

= を使用して変数を宣言すると、コンパイラはスコープチェーンを辿って同じ名前の変数を探します。見つかればその変数に値を代入し、見つからなければ現在のスコープ内に新しい不変変数を作成します。

yaoxiang
x = 1       // 外側のスコープに x がないので、新しい変数として宣言
x = 2       // 外側の x が見つかった、代入を試みる → コンパイルエラー!x は不変

これは少し直感に反するように見えるかもしれません——他の言語学过の方が「見つかるならなぜ代入できないのか」と感じるかもしれません。しかし YaoXiang は安全性を最優先にします:デフォルトで不変であるということは、コードのどこかで変数が誤って変更される心配をしなくて済むということです。

mut 可変変数

変数を変更する必要がある場合は、mut キーワードを使用して明示的に宣言します:

yaoxiang
mut counter = 0
counter = counter + 1   // 変更可能
counter = 100           // これも可能

mut には重要なルールがいくつかあります:

ルール1mut は明示的な新しい宣言であり、コンパイラは外側のスコープで同じ名前の変数を探しません。

yaoxiang
mut x = 10      // 現在のスコープに新しい可変変数 x を作成
mut x = 20      // コンパイルエラー!同じスコープ内で x はすでに宣言済み

ルール2mut で宣言した変数は、外側のスコープの変数と同じ名前を付けることはできません(シャドーイングの禁止)。

yaoxiang
x = 10
{
    mut x = 20   // コンパイルエラー!x はすでに外側で宣言されており、シャドーイングは不允许
}

ルール3:同じスコープ内で、各名前は1回만宣言できます——= でも mut でも 마찬가지です。

yaoxiang
x = 10
mut x = 20   // コンパイルエラー!x はすでに宣言済み

これらのルールにより、各変数名は現在のスコープ内で一意であることが保証されます。同じ名前がどの変数を指すかという混乱に巻き込まれることはありません。

型推論 vs 明示的な型注釈

YaoXiang は Hindley-Milner(HM)型推論アルゴリズムを使用しています。コンパイラは書いた値から型を自動的に推論できるため、大多数の場合は手動で型を書く必要はありません。

yaoxiang
x = 42              // Int に推論
name = "YaoXiang"   // String に推論
pi = 3.14159        // Float に推論
is_valid = true     // Bool に推論

型を明示的に标注したい場合は(例えばコード可読性を高めるため、またはコンパイラが推論できない場合)、: 型 構文を使用します:

yaoxiang
count: Int = 100
greeting: String = "Hello"
ratio: Float = 0.618

両方の記述方法は完全に同等です。型を省略してコード 작성を開始し、必要に応じて型注釈を追加することもできます。これにより、プロトタイプ開発が非常に 빠르게行えると同時に、最終的なコードの型安全性を犠牲にしません。

基本型一覧

YaoXiang には、日常的なプログラミングのほとんどのシナリオをカバーするいくつかの組み込み基本型があります。

Int(整数)

yaoxiang
a = 42              // 十進法
b = 0o52            // 八進法(0o 接頭辞)
c = 0x2A            // 十六進法(0x 接頭辞)
d = 0b101010        // 二進法(0b 接頭辞)
e = 1_000_000       // 数字の区切りにアンダースコアを使用可能

Float(浮動小数点数)

yaoxiang
pi = 3.14159
speed = 2.998e8         // 科学的記数法:2.998 × 10^8
tiny = 1.6e-19

String(文字列)

yaoxiang
name = "YaoXiang"
empty = ""              // 空文字列
escape = "Hello\nWorld" // エスケープをサポート:\n 改行、\t タブ、\\ バックス拉斯、\" ダブルクォート
unicode = "\u{4F60}\u{597D}"  // Unicode エスケープ

Bool(ブール)

yaoxiang
is_ready = true
is_done = false

ブール値は通常、条件判断に使用されます:

yaoxiang
if is_ready {
    print(" обработка начинается")
}

変数のスコープ

スコープは変数の可視範囲を決定します。YaoXiang のスコープルールは非常にシンプルで:{} ブロックが新しいスコープを作成します

基本ルール

yaoxiang
{
    x = 10
    print(x)   // アクセス可能:x は現在のスコープ内
}
// print(x)    // エラー:x はスコープ外でアクセス不可

内側のスコープは外側の変数をアクセスできます:

yaoxiang
outer = "外側にいる"
{
    print(outer)   // 外側の outer にアクセス可能
    inner = "内側にいる"
}
// print(inner)    // エラー:inner はスコープ外でアクセス不可

関数引数のスコープ

yaoxiang
greet: (name: String) -> Void = {
    print("こんにちは, " + name)
    // name はこの関数ボディ内で可視
}
// name は関数体外でアクセス不可

ブロック式

YaoXiang の {} ブロックは式でもあり、値を返せます:

yaoxiang
result = {
    x = 10
    y = 20
    return x + y   // 30 を上一スコープに返す
}
// result の値は 30
// x と y はブロック外でアクセス不可

ブロックの戻り値の詳細については、后续の関数章を参照してください。ここでは覚えておいてほしいこと:波括弧はスコープを作成し、内側は外側を見えますが、外側は内側を見えません

小結

YaoXiang の変数システムの中核的なコンセプトをマスターしました:

コンセプト要点
統一された構文モデルname: type = value、変数、関数、型はすべてこれを使用
デフォルトで不変x = 10 の後、x は変更不可
可変変数mut で明示的に宣言 mut x = 10
シャドーイング禁止同じ名前は同じスコープ内で1回만宣言可能
型推論HM アルゴリズムが自動推論、: 型 で明示的に标注することも可能
スコープ{} がスコープを作成、内は外を見、外は内を見ない

次は基本型の詳細を学ぶか、制御フローの章に直接進むことができます。