プリミティブ型

要約:
  • プリミティブ型は、Curl® 言語のコアに直接組み込まれています。
  • 整数、浮動小数点数、ブール値および文字のプリミティブ型があります。
  • 距離や時間などの数量のプリミティブ型もあります。
Curl® 言語では、コアに直接組み込まれている多数の基本データ型をサポートしています。これらの基本データ型はプリミティブ型です。プリミティブ型でない組み込みのデータ型も多数あります。これらのデータ型はクラスで実装されるため、クラス型と呼ばれます。クラス型についてはこの章の別のセクションで説明します。プリミティブ型は言語のコアに直接組み込まれているため、これらの操作は効率的かつ迅速になります。Curl 言語には次のプリミティブ型が用意されています。

整数

要約:
整数 (小数点以下の部分を伴わない) を格納する場合に整数変数を使用します。たとえば、2.5 は整数ではありませんが、2 は整数です。Curl 言語には、整数を操作する多数の演算子があります。整数変数を宣言するには、次のデータ型のいずれかを使用します。
データ型説明既定値サイズ (ビット)有効範囲
int32 ビット符号付き整数032-2,147,483,648 ~ 2,147,483,647
int88 ビット符号付き整数08-128 ~ 127
int1616 ビット符号付き整数016-32,768 ~ 32,767
int3232 ビット符号付き整数032-2,147,483,648 ~ 2,147,483,647
int6464 ビット符号付き整数064-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
uint32 ビット符号なし整数0320 ~ 4,294,967,295
uint88 ビット符号なし整数080 ~ 255
uint1616 ビット符号なし整数0160 ~ 65,535
uint3232 ビット符号なし整数0320 ~ 4,294,967,295
uint6464 ビット符号なし整数0640 ~ 18,446,744,073,709,551,615
byte8 ビット符号なし整数080 ~ 255
int32 データ型と int データ型は同じです。つまり、int32int の別名です。同様に、uint32uint の別名であり、 byteuint8 の別名です。リテラル値としての整数の情報は、整数リテラル を参照してください。
次の例では、整数変数を宣言して初期化しています。

例: 整数変数の宣言と初期化
|| Declare and initialize integer variables
{let a:int}                 || "a" is an int, initialized to 0 (default)
{let b:int=-5}              || "b" is an int, initialized to -5
{let c:int=5}               || "c" is an int, initialized to 5
{let d:int8=5}              || "d" is an int8, initialized to 5
{let e:int8=256 asa int8}   || "e" is an int8, initialized to 256
{let f:int16=5}             || "f" is an int16, initialized to 5
{let g:int32=5}             || "g" is an int32, initialized to 5
{let h:int64=5}             || "h" is an int64, initialized to 5
{let i:int=(2.7 asa int)}   || "i" is an int, initialized to 2.7

|| Display the integer variables' values
a is ... {value a}{br}
b is ... {value b}{br}
c is ... {value c}{br}
d is ... {value d}{br}
e is ... {value e}{br}
f is ... {value f}{br}
g is ... {value g}{br}
h is ... {value h}{br}
i is ... {value i}
上の例では次の点を確認してください。
内部的には、整数は 2 の補数形式といわれる方法で表されます。2 の補数形式の詳細を把握するには多少の努力が必要ですが、整数の操作方法を理解する上ではこれは必要ありません。重要なのは、2 の補数である整数を使用することの意味を理解することです。基本的には、整数は特定の範囲内の値と見なすことができます。たとえば、int8 は -128 以上で 127 以下の値です。整数データ型の 1 つの値が範囲を超えても、Curl® 実行環境 (RTE) はエラーを生成しません。代わりに、値は範囲の反対側の位置にラップします。たとえば、値 127 が int8 変数に格納され、その変数に 1 を加えた場合、変数の値は -128 にラップします。同様に、値 -128 が int8 変数に格納され、その変数から 1 を引いた場合、変数の値は 127 にラップします。
Figure: 2 の補数計算
ここでは、2 つの大きな数の加算の結果として小さな数が得られるという状況について説明します。値の合計がデータ型の有効範囲外になると合計値がラップします。次の例では、2 つの int32 値の合計が int32 の有効範囲外になることを示しています。

例: 2 の補数演算の実例
{value
    || Declare an "int" variable called "a" and initialize
    || it with the value 2000000000 (within legal range).
    let a:int32 = 2000000000

    || Declare an "int" variable called "b" and initialize
    || it with the value 2000000000 (within legal range).
    let b:int32 = 2000000000

    || Declare an "int" variable called "c" and initialize
    || it with the sum of "a" and "b" (outside legal range).
    let c:int32 = a + b

    || Display the value of "c"
    c
}
一般的に、整数変数を宣言するときは int データ型を使用します。たいていの目的はこのデータ型で対応できます。また、int データ型は主にプロセッサのネイティブ ワード サイズを使用するため、他の整数データ型よりも速くコードを生成することも大切なポイントです。スピードが問題になる場合、他の整数型ではなく int データ型の使用を検討してください。
スペースや実行時のリソースが問題になる場合は、他のデータ型の使用も考えられます。整数の範囲が明らかな場合は int8uint8int16uint16int32uint32uint64 または int64 を使用して、ソース コードで使用するメモリを最適化することができます。
int 値の操作では、次の 2 つの大切な定数があります。これらは max-intmin-int です。max-intint が保持できる最大値の定数です。min-intint が保持できる最小値の定数です。

浮動小数点数

要約:
  • 浮動小数点数は、オプションで小数部を持ちます。
  • データ型:floatdouble
  • double は浮動小数点数の既定のデータ型です。float データ型で浮動小数点数を指定するには、数値に f を追加します。
  • 既定値は 0.0 です。
  • 浮動小数点数値は特定の数を表しますが、四則演算で無限の精度を持つ結果が得られた場合は、浮動小数点数の精度に限度があるため正確な結果に最も近い値の浮動小数点数を返します。
  • infinity および nan (数でない) は浮動小数点の定数です。
オプションの小数部を持つ数を格納する場合に浮動小数点変数を使用します。たとえば、2.0 および 2.5 は両方とも浮動小数点数です。浮動小数点変数を宣言するには、次のデータ型のいずれかを使用します。
データ型説明既定値サイズ (ビット)有効範囲
floatIEEE 754 単精度浮動小数点数0.0f32-3.402823466E+38 ~ -1.175494351E-38、0.0、または 1.175494351E-38 ~ 3.402823466E+38
doubleIEEE 754 倍精度浮動小数点数0.064-1.7976931348623157E+308 ~ -2.2250738585072014E-308、0.0、または 2.2250738585072014E-308 ~ 1.7976931348623157E+308
double は浮動小数点数の既定のデータ型です。float データ型で浮動小数点数を指定するには、数に f を追加します。リテラル値としての浮動小数点の情報は、浮動小数点リテラル を参照してください。
次の例では、浮動小数点変数を宣言して初期化しています。

例: 浮動小数点変数の宣言と初期化
|| Declare and initialize floating-point variables
{let a:float}                    || "a" is a float, initialized to 0.0f (default)
{let b:float=5}                  || "b" is a float, initialized to 5
{let c:float=5.0f}                || "c" is a float, initialized to 5.0f
{let d:float=5.5f}                || "d" is a float, initialized to 5.5f
{let e:float=-5.5f}               || "e" is a float, initialized to -5.5f
{let f:float=1234.1234f}          || "f" is a float, initialized to 1234.1234f
{let g:double}                   || "g" is a double, initialized to 0.0 (default)
{let h:double=123456.123456}     || "h" is a double, initialized to 123456.123456
{let i:double=12345678.12345678} || "i" is a double, initialized to 12345678.12345678

|| Display the floating-point variables' values
a is ... {value a}{br}
b is ... {value b}{br}
c is ... {value c}{br}
d is ... {value d}{br}
e is ... {value e}{br}
f is ... {value f}{br}
g is ... {value g}{br}
h is ... {value h}{br}
i is ... {value i}
上の例では次の点を確認してください。
浮動小数点数は、小数値の部分について科学表記法に基づく方式を使用して、内部に格納されます。この表記法では、数 2.525e-12.5e00.25e+1 などのように表されます。内部表現で小数点以上の部分にゼロ以外の桁数の仮数を持つ場合、浮動小数点数値は正規化されます。
浮動小数点数は、正負記号、仮数および指数で構成されます。数 0.25e+1 の場合、仮数は 0.25、指数は +1 になります。常用のほとんどの数のように、数 0.25e+1 も10 進法です。ただし、浮動小数点数の内部表現は 2 進法です。10 進法の浮動小数点数の多くは、正確に 2 進法で表すことはできません。たとえば、有限小数で表される分数は、2 進法表現では無限に繰り返されることになります。小数 0.1 を例に取り上げてみると、これを2 進法で表す場合、数値 0.0001100110011001 を近似値として、無限に繰り返される数列なります。
浮動小数点数の操作においては、浮動小数点数値が特定の値を表す一方で、予想される本来の値とは任意に異なる可能性が発生することに注意してください。これは、その精度の限界と 2 進法の内部表現に起因するものです。(浮動小数点プログラムが数学上のシステムをどれだけ正確にモデル化しているかを決定するプロセスはエラー解析と呼ばれますが、ここでは説明しません)。浮動小数点の結果が数学的結果と異なることは、よくコードのバグの原因となります。ただしほとんどの場合は、一貫して倍精度を使用し、必要な有効桁数だけを表示するようにする限り、有効な結果を得ることができます。
次の例では、浮動小数点数の精度の限界により、四則演算子が正確な値の代わりにどのようにして結果に一番近い値の浮動小数点数を返すかを示しています。

例: 近似値としての浮動小数点数
|| Declare and initialize a couple of floating-point
|| numbers.
{let f1:float = 0.1f}
{let f2:float = 0.6f}

|| Remember that internally "f1" is represented by an
|| approximation of 0.1.  However, the display of "f1"
|| shows the approximation rounded up to 0.1
{value f1}

|| Because the numbers are internally represented by
|| approximations of the real numbers, when you add the
|| numbers you will not get the result that you expect.
|| However, because the difference is so small, the
|| display of the result will be rounded to the expected
|| value.
{value f1 + f2}

|| However, if you compare the actual result to the expected
|| result, they are not equal.  The equality operator (==)
|| returns "true" if the values are equal and "false"
|| otherwise.  Remember that the internal representation is not
|| the same as the rounded display of the number.
{value f1 + f2 == 0.7}
2 つの型の浮動小数点変数 (floatdouble) の違いは、数を表すのに使用するビット数だけです。値の実際の内部表現はプラットフォームに依存し、それぞれ仮数と指数の有効範囲が異なります。そのため、理論上は浮動小数点数値の有効範囲はプラットフォームに依存することになります。ただし、本リリースでサポートされているプラットフォームは IEEE 754 標準に準拠しています。
仮数または指数が値の有効範囲を超えるような浮動小数点数を操作する場合もよくコードのバグの原因となります。
浮動小数点数に関する演算ではエラーは生成されません。浮動小数点数がコンピュータ上で表現できる範囲外の数である場合、特殊なビット列を使用してその数が無限大または負の無限大であることを示します。このような数を示すには、<infinity> および -<infinity> の出力表現が使用されます。同じように、結果が定義されていない演算を行う式の結果は、<not-a-number> になります。これらの特殊な値は、infinity および nan グローバル定数に対応します。

例: 結果が <infinity> および <not-a-number> になる演算
|| Divide 0 by 0.
{value 0.0 / 0.0}

|| Divide 1 by 0.
{value 1.0 / 0.0}

|| Divide -1 by 0.
{value -1.0 / 0.0}

|| Divide 0 by 1.
{value 0.0 / 1.0}

|| See if 1 divided by 0 is infinity.
{value (1.0 / 0.0) == infinity}

ブール値

要約:
  • ブール値変数は次の 2 つの値、true または false のいずれかを格納します。
  • Curl 言語では、1 ビットのみを使用してブール値を内部で表現します。
  • Curl 言語では、ブール値に 01 の数値を使用することをサポートしていません。
  • データ型:bool
  • 既定値は false です。
次の2 つの値のどちらかを格納する場合にブール値変数を使用します。true または false です。Curl 言語では、ブール値の内部表現に 1 ビットだけを使用して、ブール値の処理を最適化しています。
ブール値変数を宣言するには、次のデータ型を使用します。
データ型説明既定値サイズ (ビット)有効範囲
boolブール値false1true または false
リテラル値としてのブール値の情報は、 ブール値リテラル を参照してください。
注意: Curl 言語では、ブール値は 01 などの数値との互換性はありません

例: ブール値変数の宣言と初期化
|| Declare and initialize Boolean variables
{let a:bool}       || "a" is a bool, initialized to false (default)
{let b:bool = true}  || "b" is a bool, initialized to true

|| Display the Boolean variables
a is ... {value a}{br}
b is ... {value b}
上の例では次の点を確認してください。

文字

要約:
  • Curl 言語の文字は Unicode 標準に準拠しています。
  • データ型:char
  • 既定値は \u0000 (Unicode 値 0000) です。
文字変数を使用して単一文字を格納します。Curl 言語の文字は Unicode 標準に準拠しています。したがって、各文字は対応する Unicode 値を持ちます。Unicode 値は下の範囲の内の一つでなければなりません。

この範囲以外の値は char の正当な値となることできません。 文字を指定するには、キーボードを使用してその文字を入力するか、またはその文字に対応する Unicode 値を指定します。文字変数を宣言するには、次のデータ型を使用します。
データ型説明既定値サイズ (ビット)有効範囲
char単一文字\u0000 (nul 文字)32\u0000 から \uD7FF または、\uE000 から \U0010FFFFまでの範囲
リテラル値としての、文字の情報は、 文字リテラル を参照してください。
注意: Unicode 文字表現には、nul 文字のようにマシンではフォントによる表示が現時点では不可能なものが多数あります。このような値を char 型の変数に代入して表示しようとすると、表示デバイス (コンピュータまたはプリンタ) は四角などの非表示文字用の標準表現を使用します。

例: 文字変数の宣言と初期化
|| Declare and initialize character variables
{let foo:char}           || "foo" is a char, initialized to \u0000
                         || (the default)
{let bar:char='a'}       || "bar" is a char, initialized to 'a'
{let baz:char='\u0061'}  || "baz" is a char, initialized to \u0061

|| Display the character variables
foo is ... {value foo}{br}
bar is ... {value bar}{br}
baz is ... {value baz}
上の例では次の点を確認してください。
文字と一緒に、加算演算子 (+) や減算演算子 (-) も使用できます。加算や減算では、文字の Unicode 値が使用されます。Unicode 値を操作する場合は、char の正当な値の範囲を考慮する必要があります。

例: 文字の四則演算
|| Declare a character variable called "foo" that is
|| initialized with the value 'a'.
{let foo:char='a'}

|| Add two to the value of "foo".
{set foo = (foo + 2) asa char}

|| Return the value of "foo".
{value foo}

|| Subtract one from the value of "foo".
{set foo = (foo - 1) asa char}

|| Return the value of "foo".
{value foo}
|| Will cause an error
|| {set foo = '\u0000' - 1 asa char}

数量

要約:
数量は、値とそれに関連する測定単位が一体となったものです。たとえば、通常の値は 3 (3) という数を格納するだけですが、数量の場合は 3 センチメートル (3cm) という値を格納します。数量はプリミティブ データ型なので、これを効果的に使用することができます。
Curl 言語には、次のプリミティブ数量データ型が用意されています。
データ型既定値サイズ (ビット)
Acceleration0.0(m/s^2)64
Angle0.0rad64
Area0.0(m^2)64
Distance0.0m64
EmDistance0.0em64
Fraction0.064
Frequency0.0(1/s)64
Intensity0.0cd64
Mass0.0g64
Percent0.0%64
PixelDistance0.0px64
Resolution0.0(1/m)64
Speed0.0(m/s)64
Time0.0s64
数量は float または double 値として内部的に表されます。上記の各型には、対応する 32 ビット表現の Float... 型があります。たとえば、DistanceFloatDistance は両方とも測定単位は同じですが、精度は異なります。スペースの節約が非常に重要である場合のみ、Float... バリアントの使用を推奨します。リテラル値としての数量に関する情報は、数量リテラル を参照してください。
数量は値の測定単位と関連付けられているため、測定単位が異なる値を簡単に操作することができます。たとえば、4 インチ (4in) と 10 メートル (10m) のような数量を比較できます。内部的には、数量の値はその数量の既定の測定単位で格納されます。Distance 数量の場合、4in10m は両方ともメートル単位の同等な値で格納されます。

例: 異なる単位を持つ値の操作
|| Declare "d1" a Distance variable and initialize it with
|| the value four inches.
{let d1:Distance = 4in}

|| Declare "d2" a Distance variable and initialize it with
|| the value ten meters.
{let d2:Distance = 10m}

|| Compare d1 and d2 display the greater value.
{if d1 > d2 then
    d1
 else
    d2
}
|| Note that meters, the default unit for Distance quantities,
|| are use to represent Distance quantities internally.
|| By default, a quantity is displayed with the default unit.
数量は、内部的に浮動小数点数値として表されます。したがって、数量は浮動小数点数と同様の内部表現や精度の制限を受けます。たとえば、0.1 のように 10 進数としては正確に表すことのできる数でも、2 進数では正確に表すことができないものがあります。このような制約やその意味については、「浮動小数点数」のセクションで解説しています。
上記の名前付きの数量型以外の数量を使用することもできます。省略形の名前は便宜上のものです。必要に応じて、type-of 演算子を使用して独自の型を作成することもできます。

例: カスタム数量型の作成
|| Define one speed.
{let s1:Speed = 15m / 2s}
|| Another way to write the same value:
{let s2:Speed = 7.5(m/s)}
|| Let's make a funny new quantity type that has no name.
{let speed-squared:{type-of 1(m^2/s^2)} = s1 * s2}

{value speed-squared}
有効な単位指定子のリストや数量に関する演算についてなど、数量の詳細については 「数量と単位」の章を参照してください。