2016-10-19 12 views
1

5つの文字列連結を使用してstartという文字列を9文字含むコンマで区切られたresultというグローバル変数を作成したかったのです。 私は2つのコードを持っていますが、2つ目のコードだけがグローバル変数を宣言しています。 何らかの理由でそれが私の脳に簡単に登録されていません...私はコードの最初の部分で結果がローカル変数であるためにletを使用しただけですか?これについてもっと詳しい説明はありますか?Ocaml - グローバル変数とローカル変数

let start = "ab";; 

let result = start^"," in 
    let result = result^result in 
    let result = result^result in 
    let result = result^result in 
    let result = result^start in 
    result;; 
- : string = "ab,ab,ab,ab,ab,ab,ab,ab,ab" 

let result = 
    let result = start^"," in 
    let result = result^result in 
    let result = result^result in 
    let result = result^result in 
    let result = result^start in 
    result;; 
val result : string = "ab,ab,ab,ab,ab,ab,ab,ab,ab" 

答えて

1

私は、コードの最初の部分になりlet inを使用だけということですローカル変数ですか?

かなりです。グローバル変数を定義する構文はのないlet variable = expressionです。ローカル変数を定義する構文はlet variable = expression in expressionであり、inの後の式にローカルでvariableを定義します。

0

let ... inがあるときは、ローカル変数を宣言しています。 letだけがモジュールの最上位レベルにある場合は、モジュールのグローバル名を宣言しています。 (つまり、モジュールからエクスポートできる名前)

最初の例は、完全にlet ... inで構成されています。したがって、トップレベルの名前は宣言されていません。

あなたの2番目の例では、という1つが単独であり、それに続いてlet ... inが数回続きます。したがって、トップレベルの名前はresultと宣言します。

2

私はちょっと退屈な人にさせてください。 OCamlにはローカル変数とグローバル変数はありません。この概念は、異なるスコープ規則を持つ言語に由来しています。また、「変数」という言葉自体は慎重に取らなければならない。その意味はCのような言語で変わった。この単語の元の数学的な意味は、そのような値の範囲を表す数式内で使用される数学的オブジェクトの名前に対応します。 Cのような言語では、変数はメモリセルと混同されます。これは時間の経過とともに変化します。したがって、混乱を避けるために、より正確な用語を使用しましょう。変数の代わりにという名前のを使用しましょう。変数...悲しい名前はメモリセルではないので、作成するものはありません。 letの構文のいずれかを使用している場合は、実際にはというバインディングというバインディング(名前と値の関連付け)を作成しています。 let <name> = <expr-1> in <expr-2>は、<expr-2>式のスコープ内のtheの値をバインドします。 let <name> = <expr-1> in <expr-2>も式ですので、例えば<expr-2>も内部let ... in ...構造を含むことができ、例えば、

let a = 1 in 
    let b = a + 1 in 
    let c = b + 1 in 
     a + b + c 

私は特に、表現の構文構造を強調するために、非慣用的な方法でコードをインデントそれ自体であります。 OCamlでは、すでにスコープ内にバインドされている名前を使用することもできます。新しいバインディングは、例えば、

let a = a + 1 in 
    let a = a + 1 in 
     let a = a + 1 in 
      a + a + a 

最後に、トップレベル(別名モジュールレベルで)聞かせて結合(OCamlの中で定義と呼ばれる、(それは例えば、Cでは許可されません)、既存のものを非表示になります文法はlet <name> = <expr>ですが、ここにはinはありません。この定義は<name>を、定義点から囲んでいるモジュールの最後まで拡張する語彙スコープの<expr>の評価結果に結び付けます。モジュールを実装するときは、let <name> = <expr>を使用してコードを名前にバインドする必要があります(名前を省略する場合は、_を使用します)。対話型トップレベル(対話型ocamlプログラム)とは少し異なりますが、実際には式を受け取り、評価します。例えば、

let result = start^"," in 
    let result = result^result in 
    let result = result^result in 
    let result = result^result in 
    let result = result^start in 
    result 

は、有効なOCamlのプログラム(mlファイルに入れて、コンパイルすることができるもの)ではありません。これは式であり、モジュール定義ではないからです。

関連する問題