fc2ブログ

OCamlをつつく13-for文。お勧めしないけど繰り返せるピヨ。

お久しぶり♪今日はOCamlしたくなったからつつくピヨ♪えっと、OCamlでつついていない基本は・・・そうだfor文をまだ紹介していなかったね。ということで、関数型言語のスタイルではあまりお勧めできない繰り返し文をつつくピヨ。


for i = 1 to 10 do print_string "Piyo " done;;


このサンプルプログラムを実行すると10回ピヨと言うピヨ♪OCamlはシンプルだねー。OCamlのfor文は次の様に定義されているんだ。


for 変数名 = int型の式 ( to もしくは downto ) int型の式 do done

分かってもらえると思うけど、こんな風に書いている部分は任意の項目ピヨ。この定義をみたら色々なOCamlらしさがあるピヨ。1つ目にint型に固定されているのが気になるよね?じゃあ、試しに変数の値をflot型にしてみるピヨッ♪


for i = 1.0 to 10.0 do print_string "Piyo " done;;


実行してみて。やっぱりシンタックスエラーが出るピヨ。やっぱりint型でないと駄目なんだね。
次に気になるのは、toとdowntoの違いピヨ。試しに二つのサンプルをつついてみたピヨ。


for i = 1 to 10 do
  print_int i;
  print_string " "
  done;;

for i = 10 downto 1 do
  print_int i;
  print_string " "
  done;;


これでバッチリだよね♪が複数行の時;をつける事に注意が必要ピヨ。
おっと忘れるところだった。それ以外にもう一つ分かり難い落とし穴があるピヨ。それは・・・


for i = 1 to 10 do
  i > 10
  done;;


このサンプルを実行してごらん。シンタックスエラーでuntilとか何とか言われたよね?これは、for文の式はunit型を返す式以外は禁止されているからなんだ。これはつまり、unitというのは戻り値が何もない事をあらわしているから、for文の中で値を返しちゃ駄目!という事なんだ。OCamlのfor文は制約が多いピヨォ。でもこれは弱点とかじゃなくて、関数型言語のプログラミングは繰り返し文はあまり使わないからその様に設計したとボクは思う。
この様にfor文は使いにくいから、OCamlでは他のプログラミング言語で馴れたスタイルから関数型を使用するスタイルに切り替えよう♪OCamlは上手い事出来ているね♪
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

OCamlの周辺をつつく0-OCaml Browser始動♪

みんな、オキャムルルしているかな?よりよいオキャムルライフを送るには、OCaml Browserが必要ピヨ♪だけど、OCaml ヴァージョン3.11.0コンパイラを普通にインスールしただけでは使えないピョォ。これはどうした事だろう・・・調べてみたピヨッ♪
OCaml Browserは、OCamlでGUIを扱うためのLablTkライブラリを使って書かれているんだ。ということは、Tcl/Tkをインストールすれば使えるということになるピヨ♪ということで、これからこのライブラリのインストール方法を書くピヨ♪
先ずはここにアクセスしてみて♪すると、ずらーと色々なものが出てくるピヨ。この中から、Active Tclを探してクリックしよう!Ctrl+Fで検索したら早いよ。そしたら、次はOS名が色々出てくるからWindowsをクリックしよう。ここまではOKだよね?ここからが注意が必要なんだけど、この時点で数字(ヴァージョン)が沢山表示されているから決断しなければならない。多くの人が最新ヴァージョンを選んでしまうと思うけど、ここはグッとこらえてヴァージョン8.4.19を選ぼう!そうしないとOCaml Browserは動かないピヨ。ここまできたらあとは簡単、ActiveTcl8.4.19.1.286921-win32-ix86-threaded.exe をダウンロードして実行するだけ♪おっと忘れるところだった。インストールが完了したら環境変数PATHにダウンロードした場所\binを追加しなくてはならないピヨ。注意してね♪
環境変数の編集方法は分かるよね?一応説明しておくピヨッ!今から言う順番にアクセスしてね♪

スタート→コントロールパネル→システム→詳細設定タブ→環境変数ボタン

到~着♪もしPATHをまだ作っていない場合は、新規でPATHを作り、ある場合は編集をしてね♪値はダウンロードした場所\binだよぉ。編集する場合は、;を忘れちゃ駄目!注意してね♪こんな感じにするんだ。

C:\foo;C:\Tcl\bin

お疲れ様♪これでついに便利なブラウザが使えるピヨ♪場所は・・・
スタート→全てのプログラム→Objective Caml→Caml Browserだよ♪
便利だから使おう♪♪おしまいピヨ。

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく12-バリアント型。潜在能力は未知数!

今回はvariant型をつつくピヨ♪バリアント型というのは値に名前をつけたものピヨッ♪
じゃあ、早速プログラムにしてつついてみるピヨ♪


# type boolean = True | False;; 
type boolean = True | False

let get_boolean x = if x = 0 then True else False;;
val get_boolean : int -> boolean = 

# get_boolean 0;;
- : boolean = True

# get_boolean 1;;
- : boolean = False


つまり・・・

type 名前 = 値1 | 値2 | ・・・

という風に書くのがバリアント型なんだ。 こんな具合に使用するピヨ♪今のサンプルでは命令言語の列挙対と似ているピヨ。OCamlでは値は必ず先頭が大文字でなくてならないから注意してね♪
でもOCamlは複雑なフランス女性(妄想)。これはバリアント型の一面でしかないピヨ。先ほどの例は全てが定数の特殊なバリアント型なんだ。
じゃあ、普通のバリアント型はどんなのかというと・・・


# type types = Int of int | Float of float | 
    Char of char | String of string | 
    Bool of bool | Unit of unit;;
type types =
    Int of int
  | Float of float
  | Char of char
  | String of string
  | Bool of bool
  | Unit of unit

※紙面上の都合で途中で改行しているピヨ。


つまり、こんな風に・・・

type 名前 = 値1 of 型名 | 値2 of 型名 | ・・・

宣言するピヨ♪で、肝心な使い方なんだけどぉ・・・ パターンマッチという機能でよく使用するピヨ。だから、残念だけど使用法についての説明は今後するピヨ。ごめんね。

追記
正確さがなかったので追記するピヨ。いげ太さんがいった通りで、上記で値と書いてあるものを正確に書くとconstructor(コンストラクタ)というんだ。コンストラクタというとC++とかのコンストラクタと同じと思って混乱する人が居ると思うけどこれは別物ピヨ。コンストラクタというのは構築子という意味だから、オブジェクト指向言語ではオブジェクトを構築するためのメソッドとしてコンストラクタと読んでいるピヨ。一方OCamlの方はオブジェクトを構成する要素としてコンストラクタとして呼んでいるとボクは思うピヨ。
ちなみに、ボクが値と呼んだのはちゃんと理由があっての事なんだ。マニュアルに「バリアント型の宣言は、その型の値が取りうる形を全て並べ立てます。」て書いてあるし、全てが定数の場合のサンプルだったからね。あと、関数型言語では全てのものがシンボルであり、値そのものだからなんだ。命令型言語では分類しているから関数とオブジェクトは別のものなんだけど、LISPとかの関数型言語で引数に関数をとる関数が普通に使えるのはそういった考え方の違いからなんだ。
だけど、OCamlはオブジェクト指向言語だからコンストラクタは型のようなもので、値(インスタンス)は別に存在するピヨ。それを考えたら値と表現したのは間違っていたピヨ。なので、コンストラクタはメタデータと考えてね。

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく11-条件判断。関数でも判定は必要!

今度はif文をつつくよ。関数型言語は命令型言語と思考が違いすぎると思う人も多いと思うけど、条件判定が必要な事実は変わらないからif文をつっつくピヨ。


let x = 10;;
if x > 10 then print_string "true" else print_string "false";;
let x = 20;;
if x > 10 then print_string "true" else print_string "false";;


このプログラムを実行してみて。if文の動きがわかりやすいと思うピヨ。if 条件結果がtrue(真)ならば thenブロックのプログラムが実行されて、 結果がfalse(偽)ならば elseブロックのプログラムが実行されるんだ。
これでif文はほとんどマスターしたのと同じだけど、面白くないから意地悪プログラムを書いてみたピヨ。こんなこと思いつくなんて、ドリィちゃんと似てきたのかな?


let x = 20
if x > 10 then print_string "true";;

let x = 1;;
if x > 10 then print_string "true";;


このようにelseは省略できるんだ。 だけど、上記サンプルの2つ目のif文は動作がおかしくなるよ。 何故かと言うと、elseブロックを実行したいのにそれがないからなんだ。 つまり、絶対にtrueと分かっている時のみelseを省略できるんだ。でもそんな状況は滅多にないからelseブロックは必ず書こう
ところで、今までのサンプルプログラムはtrueブロックもelseブロックも1行だったけど、複数行の場合はどうすると思う?答えはこれだよ。


if x = 10 then 
  begin
    print_string "true\n";
    print_string "true";
  end
else 
  print_string "false";;


この手品のネタが分かったかな?そう、beginendキーワードで 実行文を挟むんだ。 あっ、それと、print_stringの最後の;に気をつけてね。 この場合はいるピヨ。 このようにif文は命令言語ぽい構文だからすぐに慣れると思うピヨ。 これでif文はおしまい。 おつかれー。


バサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサバサ

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく10-比較演算子。やっぱ必要ピヨォツ。

OCamlが関数型言語だからといっても比較は絶対必要だから、初期段階でつついていこう。比較演算については言葉よりも見た方が早いので、毎度同じみ~♪サンプルプログラムでござーる♪

let x = 10;;
let y = 10;;
y = x;;
y <> x;;

let x = 100;;
let y = 90;;
x > y;;
y < y;;

let x = 200;;
let y = 200;;
x >= y;;
x <= y;;;

比較演算子についてはOCamlも素直で、=記号は等価<>記号は不等価という点に注意したら後はすぐになれるピヨ。 みじかいけどこれで、おわ
ドリィちゃん「排他的論理和!」

let x = true;;
let y = true;;
not x = y ;;

let y = false;;
not x = y ;;

えっと・・・排他的論理和が出来るって事だよね?ドリィちゃん。
ドリィちゃん「そう」
排他的論理和というのは、 二つのビットが等しい場合はfalse 等しくない場合はtrueを返す天邪鬼な論理演算の事なんだピヨ。 ちょっと変わっているよね(笑)でも必要な場合があるから馬鹿にしちゃ駄目だよ。 バイナリを扱うときの必須アイテムだから覚えておこう。 画像処理とかにも多用するからゲームが作りたい人は排他的論理和と友達になろう!!

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく9-論理演算。やっぱ必須だね♪

次は何をつつこうかかなり迷ったけど、ひとまずプログラミングの必須アイテム論理演算をつつくピヨ。 当然OCamlにも論理演算は用意されているよ。早速見てみよう!

let x = true;;
x && false;;
x || false;;
not x;;

これについてはもういいよね?もし論理演算自体について分からない事があれば、今後言語全般のカテゴリで論理演算をつつくからそれを見てね。さっくり、おしまい。
ドリィちゃん「OCamlに排他的論理和が足りなぃぃ・・・」

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく8-文字と文字列。日本語を使いたい!

OCamlは未知の言語だから文字についても調べてみたピヨ。OCamlをつつく2ー基本型。OCamlは何で出来ているのかな♪でも紹介したけど、OCamlの文字はcharstringは文字列ピヨ。でも使い方をまだつついていなかったから今回はそれをするピヨ。それじゃあ、このプログラムみて。

let c = 'a';;
let s = "test";;
"test".[0];;
"te" ^ "st";;

プログラムを実際に打って結果を見てね。打った?じゃあ、説明するピヨ。文字と文字列の変数束縛の仕方は見ての通りだけど、他の2つのプログラムは説明が要ると思うから言うピヨ。
先ずは、"test".[0];;だけど、これは文字列の一部を取り出しているピヨ。文字列は文字の配列だから、これで取り出せるのは理解できると思う。ところが、文字列変数sからこの命令文では取り出せないんだ。 何でだろう?ボクわかんないや。後でソースコード見て原因が分かったら書くピヨ。
次は"te" ^ "st";;のプログラムを解説するピヨ。このプログラムは文字列を連結しているんだ。つまり、^演算子で文字列が連結できるんだ。文字列連結は頻繁に使うから覚えておこう。
本当は文字と文字列につつく余地があるけど、長くなりすぎるから今回はこれでおしまい。

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく7-剰余演算。やっぱりあったのね。

四則演算とくれば、やっぱり剰余演算も気になるピヨ。そこで調べてみたピヨ。公式マニュアルが調べにくいので、ちょっとだけ苦労したよ。このマニュアル、何で基本を分かりやすく書いていないのかなぁ。 でも皆は心配する必要が無いピヨ。この記事を見て基礎を学習しよう。

let x = 10 mod 3;

日本語のコメントが使えないから不便ピヨ。それはさておき、皆分かったかな?念のために書いておくと、mod剰余算で割り算の余りを求める演算ピヨ。 皆これでバッチリだよね?うん。それじゃあ終わり。

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく6ーコメントと勘違い。

前回でボクはOCamlのコメントが使いにくいと書いたけど、あれはボクの勘違いから生じたものだったピヨ。マニュアルで(**)がコメントと書かれていたのを** と思ったんだけど括弧も含めてコメント だったピヨ。参ったねぇ。ここ2日間違いが多いピヨ。 でも間違いを恐れていては何も始まらない。コメントをつつくことにしたピヨ。 コメントはコンパイラ仕様で次の通りに書かれているピヨ

コメントは (* で始まり *) で終わります。
(* や *) の間にブランクを挟んではいけません。
コメントはブランクとして扱われます。
文字列や文字リテラルの中にコメントは入れられません。
コメントは入れ子にすることも可能です。
※公式ホームページの日本語版から抜粋

なるピヨ。コメントは空白文字として扱われんだね。 だから入れ子にする事も出来るピヨ。でも何でコメントはブランクなのに、 間にブランクを入れたら駄目なんだろう?レクサで無視したらいいのに。 やったら駄目と言われたらやるのが鳥情ピヨ。やってみた。

(*     *)let x = 10;;

よし、エラー来い!あれ?エラーにならないぞ。うーん。 おそらく、日本語マニュアルはヴァージョン3.06のものだからそれ以降に改善されたんだろうね。 まぁ当たり前だよね。コンパイラは*)がくるまですべてを破棄すればいんだけだからね。

テーマ : プログラミング
ジャンル : コンピュータ

OCamlをつつく5ー再帰関数。ループは再帰、それが関数型のやり方さ。

よくある命令型言語の解説ではここら辺で反復文(ループ文)を紹介する所だけど、でも関数言語はあまり反復文を使用しないんだ。関数型と呼ぶだけあって基本的には再帰関数で表現するピヨ。サンプルとして0.1つつきで紹介したHelloプログラムを見てみよう。

*iterは再帰関数*
let hello max = 
  let rec iter count =  
    if count < max then begin
        if count = 0 then Printf.printf "hello indre\n";
        print_int count;
        print_string "\t";
        iter ( count + 1 )
    end
    in
    iter 0;;

hello 10;;
Printf.printf "good-by";;

再帰関数の宣言文がどこだか分かったかな?再帰関数の宣言は let rec iter countの部分ピヨ。つまり次の形式になっているんだ。

let rec 関数名 インスタンス名

関数名にの他にインスタンス名(便宜上のボクが付けた表記)なんて少し変だけど、その代わり関数も変数と同じ様に扱えるのがOCamlの強みなので我慢しよう。
ところで、「何でコメントをlet rec iter count = の部分につけないの」と思った人も居ると思うけど、それをすると文法エラーになるんピヨ。 OCamlは残念ながらコメントが使いづらいね。
コメントの部分はコピーしちゃ駄目だよ。エラーになるから。

あと、命令型言語の使い手が気になるのはパフォーマンスだと思う。C言語の使い手たちは、関数呼び出しのオーバーヘッドがを心配すると思うけど、OCamlには末尾再帰という機能があって、関数呼び出しをジャンプ命令としてコンパイルするからパフォーマンスが劣化しないらしい。えっ?何で疑問文なのかって?それは、ボクがまだ確かめていないからピヨ。翻訳されたアセンブリを見てないうちは確信を持っていえないし、Windowsはパフォーマンス上不利だと公式ページに明記されているからね。Windowsは残念ながらまだ作りこまれていない様だ。気が向いたらボクが実装しようかな♪
ここまでの説明で「末尾再帰があるからループの代わりにバリバリ使おう」と思った人には残念なお知らせがあるピヨ。それは、末尾再帰にも条件があるんだ。その条件とは、 最後は必ず自分を呼ぶ事ピヨ。この条件は結構難しいよね。ボクもHelloをプログラミングした時困ったよ。でもせっかく関数型言語を楽習しているんだから、なるべくループを使わずに、末尾再帰を意識してプログラミングをしよう。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

インドリ

Author:インドリ
みなさん、はじめまして、
コンニチハ。

ボクは、無限の夢(infinity dream)を持つネタ好きな虹色の鳥インドリ(in dre)です。
色々な情報処理技術を啄ばむから楽しみにしてね。

http://twitter.com/indori
は別人による嫌がらせ行為です。
私とは関係ないので注意して下さい。
次はなりすましブログなどをするかもしれませんが、ここ以外でブログをするつもりがないので、ここ以外にインドリのブログがあったとしても無視してください。


何度言っても分からない人がいるので、ここにコメント欄へ書き込むときの注意事項を書きます。


一、社会人としてのマナーをわきまえましょう。
一、妄想に基づく書き込みを止めてください。
一、暴言の類は書かないで下さい。
一、某誹謗中傷サイトの書き込みは彼らの妄想に基づく書き込みですから無視して、ここへ書き込まないで下さい。
一、コメント書く前に他のコメントよく読んでから行って下さい。
一、言いがかかり等の行為を禁止します。
一、その他常識的に考えて迷惑なコメントはしないで下さい。


以上のルールを守れない人のコメントは削除します。



利用上の注意
ここに紹介してある文章およびプログラムコードは正確であるように心がけておりますが、内容を保証するものではありません。当サイトの内容によって生じた損害については、一切の責任を負いませんので御了承ください。


執筆したCodeZineの記事


【VB.NETで仮想CPUを作ろう】

  1. VB.NETで仮想CPUを作ろう
  2. レジスタの実装
  3. 仮想CPUのGUI化
  4. テストドライバの改良
  5. CPUの基礎動作の実装
  6. MOV命令の実装
  7. ADD命令実装
  8. SUB命令実装
  9. INC命令&DEC命令の実装と命令長
  10. MLU命令の実装とModR/Mについて
  11. DIV命令の実装とイベント設計について
  12. 機械語駆動式 関数電卓を作ろう!
  13. 機械語駆動式 関数電卓を作ろう! 解答編(前半)
  14. 機械語駆動式 関数電卓を作ろう! 解答編(後半)


【仮想ネットワーク実装でTCP/IPを学ぼう】
  1. TCP/IPの基礎と勘所
  2. ネットワークアクセス層の勘所
  3. インターネット層の勘所
  4. トランスポート層の勘所
  5. アプリケーション層の勘所
  6. セキュリティの基礎と仮想ネットワークの仕様
  7. GDI+と独自プロトコルの定義



【並列化】
インテル Parallel Studioを使って並列化プログラミングを試してみた
並列プログラミングの効率的なデバッグを実現する「Parallel Inspector」


【TBBシリーズ】
  1. インテル スレッディング・ビルディング・ブロックの概要
  2. インテルTBBから学ぶループの並列化
  3. スレッドセーフとインテルTBBのコンテナ
  4. インテルTBBのスレッドクラス


【OpenMPシリーズ】
  1. OpenMPの基礎構文
  2. OpenMPの実行時ライブラリと並列ループ
  3. OpenMPのメモリモデルとfork- joinモデル

最近の記事
最近のコメント
月別アーカイブ
カテゴリ
Ada (9)
COBOL (5)
C (9)
C++ (11)
C# (370)
D (25)
Java (8)
Perl (1)
Ruby (14)
PHP (2)
Boo (2)
Cobra (2)
LISP (6)
F# (33)
HTML (0)
XHTML (0)
CSS (0)
XML (0)
XSLT (0)
Scala (4)
WPF (0)
WF (2)
WCF (0)
LINQ (4)
MONO (5)
Linux (0)
MySQL (0)
ブログ内検索
リンク
最近のトラックバック
RSSフィード
ブロとも申請フォーム

この人とブロともになる

QRコード
FC2カウンター