Chapter 2. プログラミングの構成要素

Table of Contents
式と値
名前と束縛
束縛のスコープ
評価のための環境
静的な意味論
プリミティブ型
タプルとタプル型
レコードとレコード型
条件式
シーケンス式 (逐次実行)
コード中のコメント

ATS のコアは値渡し (call-by-value) の関数型言語です。 この章ではしばらく 値渡し の意味について説明します。 関数型プログラミングとしては厳密な定義がないためです。 これから探検する関数型プログラミングの最も重要な側面は束縛の概念です。 それは名前と式の関係を表わしています。

式と値

ATS は豊かな構文と高機能を両立しています。 そしてその文法は多くの既存のプログラミング言語よりも、おそらく複雑です。 ATS には多様な形の式があります。 それらを少しずつ説明します。

まず整数の算術式 (IAE) からはじめましょう: 1, ~2, 1+2, 1+2*3-4, (1+2)/(3-4) などです。 負の符号は ATS ではチルダ (~) で表わすことに注意してください。 また浮動小数点数もサポートしています。 浮動小数点数の定数をいくつか挙げてみましょう: 1.0, ~2.0, 3., 0.12345, 2.71828, 31416E-4 などです。 3.31416E-43.03.1416 にそれぞれ等価であることに注意してください。 ここで強調したいことは、ATS において 11.0 とは全く別の数だということです: 前者は整数であるのに対して、後者は (倍精度の) 浮動小数点数なのです。

また真理値の定数もあり、それは: truefalse です。 真理値の式は次のような形です: 1 >= 0, not(2-1 >= 2), (1 < 2) andalso (2 < 3), (~1 > 1) orelse (~1 <= 1) などです。 これらの式では not, andalso, orelse はそれぞれ 否定, 論理積, 論理和 を表わします。 C言語の文法に馴染んだプログラマには 演算子 &&|| はそれぞれ andalsoorelse が同じ意味であると言えばわかるでしょう。

他に一般に使われる定数としては文字と文字列があります。 例えば次に示すのは文字の定数です: 'a', 'B', 'n' (改行), 't' (タブ), '(' (左丸括弧), ')' (右丸括弧), '{' (左波括弧), '}' (右波括弧) などです。 さらに次に示すのは文字列の定数です: "My name is Zoe", "Don't call me "Cloe"", "this is a newline:n" などです。

関数名 foo と式 exp が与えられた時、式 foo(exp) は関数適用または関数呼び出しです。 あいまいさがない場合には foo(exp) の小括弧をはずすことができます。 例えば print("Hello") は関数適用であり、 また print "Hello" と書くこともできます。 もし foo が引数のない関数であった場合、 foo() という関数適用を取れます。 もし foo が2引数の関数であり exp1 と exp2 が式であった場合、 foo(exp1, exp2) という関数適用を取れます。 より多くの引数を取る関数についてはわかると思います。

+(1,2) とは書けないことに注意してください。 + という名前は中置演算子として既に定義されてしまっています。 けれども op+(1,2) と書くことはできます。 ATS において op はキーワードで、後ろに続く名前の中置記法設定を一時的に無効化します。 結合性 (前置, 中置, 後置) についての詳細は別の章で説明します。

値は、これ以上単純化できない特殊な形の式です。 例えば 1~2 のような整数の定数は値です。 しかし整数の式 1+2 は値ではありません。 なぜなら値 3 に単純化できるからです。 評価とは与えられた式を値になるまで単純化する計算過程です。 けれども 1/0 のような式は単純化して値にすることができません。 このような式の評価はどこかで中断されなければなりません。 評価については後でゆっくり説明します。