Minecraftとタートルと僕スマートフォン用の表示で見るMinecraftとタートルと僕PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。【補足】関数を定義する関数を定義する(基礎編)前回は関数型プログラミングの基本ということで、Luaの関数がファーストクラスオブジェクトであることを説明しました。関数を変数に代入したり、関数を関数の引数として与えたり、関数の辺地として関数が返すようにできるのです。そのおかげで、長い関数名を短い関数名に変えたり、後から柔軟に挙動を変える「動的な関数」を作れたりするわけです。これらを使いこなすことができれば、あなたも立派な関数型プログラマ!!!・・・・・・ごめん、うそです。これらはまだ基本に過ぎないのですよ。似たような関数をたくさん定義するという苦難APIを作るときに悩まされるのが、似たような関数をたくさん定義しなければならないことです。プログラマは冗長なプログラムを嫌います。「同じような処理、同じような記述が長々と続くプログラムはキモイ!」と生理的なレベルで嫌悪を抱くようになればあなたも立派なプログラマですね:Pそのような冗長な処理、冗長な記述は、共通部分をまとめてサブ関数にしましょう。構造化プログラミングですよ。http://pastebin.com/JB7ikE7Rforward()、back()、up()、down()、turnRight()、turnLeft()の6つの関数を定義しているのですが、ほとんど同じ記述となっています。自分の書いたプログラムながら、うんざり。関数型プログラミングの手法を利用して、構造化しましょう。共通部分を見つけ出す。error_msgend違うのは以下の3箇所のようです。turtle.forward()")ということは、3つの引数を持つサブ関数を作ればうまく行きそう。turtle.back()")end前回のプログラムと比べるとかなりすっきりとしましたね。ポイントは、サブ関数subDef()の第1引数が関数であることです。関数それ自体を引数として与えるために、turtle.forwardと末尾のかっこ()は必要ないのですからね。このようなサブ関数を使った構造化はバグを減らす効果がありますし、何より書くのが楽になります。残った4つの関数についても書き換えたプログラム全体はと以下のようになります。turtle.turnLeft()")endなお、変数や関数定義の頭にlocalとつけたのは、それらをローカル変数、ローカル関数にするためです。APIを作るときには、変数・関数のローカル/グローバルを意識しましょう。APIファイルの中で(localをつけていない)グローバルな変数・関数が、このAPIが提供する変数・関数になります。逆に、APIファイルの中でローカル宣言した変数・関数は他のプログラムから(原則として)利用することはできません。このAPIを利用する側のプログラムからは、変数LOGFILEやsubDef()関数を直接触れないようにしているわけです。ファーストクラスオブジェクトなので好きな変数に代入することができると学びました。そのため、上記の関数定義は以下のように書き換えることが可能です。endという制御文で、無名関数を作成することができます。(無名関数)のように変数forwardに新たに作った無名関数を代入するという処理になります。以下の2つは全く同じ意味です。・・・end実はぶっちゃけて言いましょう。Luaでは、前者の記述がプログラム中にあったら、後者の記述に置き換えてから実行されます。後者の変数に無名関数を代入するという処理の方がLua的には正しいのです!ええー!なんだってー!?(AA略まだ終わりではないのですよかなりすっきりとしましたが、実はもっと簡略化できます。え?もうこれ以上は無理って?いえ、共通部分はまだあるのですよ。見比べて探してみましょう。それでは、この記事のタイトルである「関数を定義する関数を定義」してみましょう。turtle.back()")ポイントは2行目のreturnです。関数createLoggedFunc()は、以下のような構造をしており、実行すると無名関数を返してくれるのです。以下が、この方法で作ったプログラム完成版です。http://pastebin.com/CUyLbuZ3このプログラムの詳細な解説はまた次回。version0.4を完成させました。はてなブログPro「Minecraft」「ComputerCraft」について知りたいならば「お勧めコンテンツ」の『ComputerCraftとは』をご覧下さい。