Commits

camlspotter committed 0774f89

update

  • Participants
  • Parent commits 901458d

Comments (0)

Files changed (2)

 OCaml の真偽値型 ``bool``
 =============================
 
-OCaml の真偽値の型は ``bool`` その *コンストラクタ* は ``true`` と ``false`` である。
-``true`` と ``false`` は小文字で始まっているが、変数ではなく、 ``Some`` や ``None`` と同じコンストラクタである。よってパターンの中に書ける::
+OCaml の真偽値の型は ``bool`` その *コンストラクタ* は ``true`` と ``false`` である。 ``true`` と ``false`` は小文字で始まっているが、変数ではなく、 ``Some`` や ``None`` と同じヴァリアントコンストラクタである。よってパターンの中に書ける::
 
+    (* true の数を数える *)
     function 
       | (true, true) -> 2
       | (true, false) | (false, true) -> 1
       | (false, false) -> 0
 
+``bool`` の文字列への出力
+-------------------------------
+
 ``Printf`` のフォーマット文字列中で ``%b`` を使うことで ``bool`` を出力させることができる::
 
     # Printf.sprintf "%b" true;;
     - : string = "true"
-
 32bit 環境では 31bit, 64bit 環境では 63bit の符号付き整数。 
 「失われた 1bit」は GC が int とポインタを識別するために使われる。
 この 1bit のおかげで ``int`` は box化されず、そのまま扱うことができるので
-「1bit」が失われていないが、box化される ``nativeint`` と比べると高速に動作する。
+「1bit」が失われていないが、box化が必要な ``nativeint`` と比べると高速に動作する。
 
 定数の書式
 ----------------------------
 
 ``max_int``, ``min_int`` を超える演算結果はオーバフローおよびアンダーフローを起こすが、
 起こした事実は特にレポートされない。オバーフロー、アンダフローを起こしたか知りたい場合は
-自分で検査コードを書く必要がある::
+自分で何かしら検査コードを書く必要がある::
 
     # max_int + 1 = min_int;;
     - : bool = true               (* オーバーフローが起こっている *)
     # 42.;;
     - : float = 42.
 
-最後の ``42.`` という記法は他の言語ではエラーになる場合があるので注意が必要だ。
+最後の ``42.`` のように少数点以下を書かない記法は他の言語ではエラーになる場合があるので注意が必要だ。
  
 基本的な演算子
 ----------------------------
      (* pervasives.ml *) 
      let string_of_float f = valid_float_lexem (format_float "%.12g" f);;
 
-OCaml では ``float`` を正確に文字列表現に変換することは難しいが、
+OCaml では ``float`` を完全に正確に文字列表現に変換することは難しいが、
 桁数を上げることで誤差を少なくすることは可能である。例えば Sexplib では
 20桁まで出力を行なっている::
 
 
 正確に ``float`` を外部に出力・記録したい場合は、その 64bit 表現をそのまま
 とり出さなければならない。 ``Pervasives.output_value`` や C言語による
-補助関数の実装などが必要である(Endianness に注意!)。
+補助関数の実装などが必要である(Endianness に注意すること)。
 
 
 ``nativeint``
 ``nativeint`` は OS の基本整数型と同じ幅を持つ符号付き整数型であり、
 ``int`` とは違い「失われた1bit」は無い。そのためシステムプログラミングに向いた整数型
 といえる。一方、 ``int`` が 1bit を犠牲とすることで unbox化された表現を持ち
-高速な演算が可能であるのに対し、 ``nativeint`` はフルサイズ box化されたデータ表現となり、
-GC の対象ともなるため、 ``nativeint`` の計算は ``int`` と比べるとメモリ領域を多く使用するし、
-遅くなってしまう。
+高速な演算が可能であるのに対し、 ``nativeint`` はフルサイズで box化されたデータ表現となり、
+GC の対象となるため、 ``nativeint`` の計算は ``int`` と比べるとメモリ領域を多く使用するし、遅くなってしまう。
 
 CR jfuruse: どれぐらいおそいか
 
     - : nativeint = 1n
     # 0x1234n;;
     - : nativeint = 4660n
-    (* 0oxxx (8進), 0bxxx (2進) も可能 *)
+    (* 0oxxxn (8進), 0bxxxn (2進) も可能 *)
 
 ``Printf`` 系フォーマット文字列では %nd %nx などやはり ``n`` を使う:
 
 ``int32`` と ``int64``
 ==================================
 
+``int32`` と ``int64`` は ``nativeint`` と同じく「失われた1bit」の
+無い、 box化された符号付き整数型だが、幅はアーキテクチャに関係なく
+``int32`` は 32bit、 ``int64`` は 64bit固定である。
 
 
+定数の書式
+----------------------------------
+
+``int32`` は整数の後に ``l``, ``int64`` は後に ``oL`` と書く。
+
+
+    # 1l;;
+    - : int32 = 1l
+    # 0x1234L;;
+    - : int64 = 4660L
+    (* 0oxxxl (8進), 0bxxxL (2進) も可能 *)
+
+``Printf`` 系フォーマット文字列では %ld %Lx などやはり ``l`` や ``L`` を使う:
+
+    # Printf.sprintf "%ld" 42l;;
+    - : string = "42"
+    # Printf.sprintf "%06Lx" 123L;;
+    - : string = "00007b"
+
+基本的な演算子
+----------------------------
+
+``int32`` と ``int64`` のための関数はそれぞれ Int32 と Int64 モジュールに
+定義されている。四則演算が ``add``, ``sub``, ``mul``, ``div`` と二項演算子ではなく
+普通の関数となっているなど、このままでは、不便である。
+
+後述の ``int`` 以外の演算子でも普通の四則演算子を使う も参照のこと。
+
 
 ``nat`` と ``big_int``
 ====================================
 
     type t = { re: float; im: float }
 
-実数と虚数部分を ``float`` で表した二つ組。この ``t`` に対して幾つかの基本的な
+実数(``re``)と虚数(``im``)部分を ``float`` で表した二つ組。
+この ``t`` に対して幾つかの基本的な
 演算が用意されている。が、文字列への変換も文字列からの変換も存在しない。
 何のためにあるのかよくわからないモジュールである。
-OCaml の標準ライブラリには、こういった中の人が自分が便利だからと
-勢いだけで足してしまったモジュールがいくつか有る。
+OCaml の標準ライブラリには、中の人が自分が便利だからと
+勢いだけで足してしまったこういうモジュールがいくつか有る。
+中の人の特権…とでも言おうか。
 
 ``int`` 以外の演算子でも普通の四則演算子を使う
 =================================================