OCamlの概要:ヌルポインター、ステートメント、および警告[4]

[約。 trans .:前の部分[ 1 ; 2 ; 3 ]
前の部分はamaraoによって翻訳されました。この部分では、nullポインターに関する段落も彼によって翻訳されました]

ヌルポインター


読者に名前と年齢を尋ねるサイトでアンケートを作成したとします。 唯一の問題は、何らかの理由で読者の何人かが年齢を伝えたくないということです。彼らは頑なに適切なフィールドへの記入を拒否します。 この場合、不良データベース管理者は何をしますか?

年齢が整数であると仮定すると、問題を解決するための2つのオプションがあります。 最も頻繁に(そして最も正しくない)のは、空のフィールドのサインとして特別な値を設定することです。 たとえば、年齢-1は、データが受信されなかったことを意味します。そうでない場合、データは受信されます(正しくない場合でも)。 この方法は、訪問者の平均年齢を計算するまで決定します。 あなたの特別な意味を考慮するのを忘れていたので、訪問者の平均年齢は7年半であるという結論に達し、すべての長い単語を削除して明るい色を使用してデザインをやり直すためにWebデザイナーを雇います。

別の正しい方法は、値が「整数またはヌル」のフィールドに年齢を格納することです。 年齢を保存するためのSQLテーブルを次に示します。

テーブルユーザーを作成する
 (
  ユーザーIDシリアル、
  名前テキストがヌルではない、
   age int-nullの場合があります
 );

年齢データが受信されない場合、特別なSQL NULL値がデータベースに入力されます。 平均を計算するように指示すると、SQLはこの値を自動的に無視します。
多くのプログラミング言語にもヌルの概念がありますが、使いやすさはさまざまです。 Perlでは、任意のスカラー式(数値または文字列)をundef (「ゼロ」と言うPearlメソッド)にすることができます。 これにより多くの警告が発生しますが、多くの場合、このような警告は重大なエラーを示しているにもかかわらず、初心者プログラマーによって無視されます。 Javaでは、オブジェクトへの参照もnullになる可能性があるため、 Integerを使用して年齢を保存し、年齢の参照にnullを使用することは非常に合理的です。 Cでは、ポインタはもちろんnullにできますが、素整数をnullにしたい場合は、まずヒープ上のmallocによって作成されたオブジェクトにそれを配置する必要があります。

OCamlは、次のように( Pervasives )定義された単純な多相バリアント型を使用して、null問題に対するエレガントなソリューションを使用します。

タイプ 'aオプション=なし| いくつかの

「ヌルポインター」はNoneとして記述されます。 上記の例の年齢(nullの可能性がある整数)は、 int option型です[ int listbinary_treeように、逆方向に読み取ります。
 #いくつか3 ;;
 -:intオプション=約3

オプションの整数のリストはどうですか?
 #[なし; いくつか3; 約6; なし] ;;
 -:intオプションリスト= [なし; いくつか3; 約6; なし]

そして、オプションの整数リストはどうですか?
 #一部[1;  2;  3] ;;
 -:int list option = Some [1;  2;  3]

ステートメント、警告、致命的なエラー、および標準エラー出力


Perlの最大の機能の1つは、プログラムのデバッグや、スタックのダンプ、例外のスローとキャッチなどの予期しないエラーを処理するための豊富なコマンドセットです。 OCamlにはこのような豊富なデバッグコマンドセットがありません。Javaよりも優れており、Cとほぼ同じですが、Perlほどではありません。 (例外については後で詳しく説明します。)

まず、 assertは式を引数として受け取り、例外をスローします。 この例外をキャッチしないと仮定すると(おそらく、特にこの例外をキャッチするのは不合理です)、これにより、プログラムが停止し、エラーが発生した行番号のソースコードが出力されます。 例:

 #assert(Sys.os_type = "Win32");;
例外:Assert_failure( ""、0、30)。

(Win32で実行しても当然エラーは発生しません)

また、物事がうまくいかない場合にだけassert falseを呼び出してプログラムを停止assert falseこともできますが、...

failwith "error message"は、 Failure例外をスローします。これは、キャッチされなかった場合、送信されたエラーメッセージの出力でプログラムを停止します。 failwith 、この例のように、しばしばパターンマッチングと組み合わせて使用​​されます。
   Sys.os_typeと一致
     「Unix」|  「Cygwin」->(*コードの省略*)
   |  「Win32」->(*コードの省略*)
   |  「MacOS」->(*コードの省略*)
   |  _-> failwith "このシステムはサポートされていません"

同じ例のサンプルと比較するいくつかの追加の可能性に注意してください。 いわゆる「範囲サンプル」[約。 transl。:ここで翻訳の問題が発生しました。元の「範囲パターン」、誰かがより正確な翻訳を知っている場合は、登録解除(できればhp)]を使用して「Unix」または「Cygwin」と、 「その他」に対応します。

プログラムをデバッグしたいが、私のように、gdb以外のすべてのデバッガーにうんざりしている場合は、おそらくいくつかの関数で警告を表示する必要があります。 例(強調表示された行に注意してください):
open Graphics;;

open_graph " 640x480";;
for i = 12 downto 1 do
let radius = i * 20 in
prerr_endline ("radius is " ^ (string_of_int radius));
set_color (if (i mod 2) = 0 then red else yellow);
fill_circle 320 240 radius
done;;
read_line ();;

Cからprintfを使用する場合は、Printfモジュールを使用します。
open Graphics;;
open Printf;;

open_graph " 640x480";;
for i = 12 downto 1 do
let radius = i * 20 in
eprintf "radius is %d\n" radius;
set_color (if (i mod 2) = 0 then red else yellow);
fill_circle 320 240 radius
done;;
read_line ();;


[約。 あたり オリジナルへのリンクについて:オリジナルがocaml-tutorial.orgにあることは知っていますが、[直接; Googleキャッシュ経由。 archive.orgを通じて; Tor]経由でミラーへのリンクを指摘しました]

Source: https://habr.com/ru/post/J118183/


All Articles