はじめに
前回の記事では、プログラム内で変数を使う時の基本をお話しました。
変数って便利ですよね。
プログラムの挙動を変えるためにソースコードを何箇所も書き換えるのはとても面倒ですが、変数を使うことで、ソースコードの先頭部分を一箇所書き換えるだけでよくなりました。
これは小さな一歩でありながら、大きな進歩でもあります。
しかし、そもそも毎回プログラムを書き換えるのって面倒じゃないですか?
そこで今回のお話です。まずは何がやりたいのか目標を示しましょう。
コマンド入力時に引数を与えたい
これまで、プログラムを実行するときは、そのプログラム名をコマンド(命令)として与えていました。
たとえば「yuka」というプログラムならば、ターミナル画面で次のようにコマンドを入力して実行していました。
> yuka
でも、こんな感じで実行できたら便利じゃないですか?
「16歩分の床ブロックを敷きなさい」
> yuka 16
あるいは、「100歩分の床ブロックを敷きなさい」
> yuka 100
このように、コマンド入力時にその時限りのパラメータ(値)を与え、プログラム内でそのパラメーターを利用するのです。
ちなみに、この「コマンド入力時にプログラムに渡すその場限りのパラメータ」を「コマンドライン引数」とここでは呼びます。
つまり、コマンドライン引数を使ったプログラムの書き方が今回のテーマです。
コマンドライン引数を使ったサンプルコード
使いこなしには少しだけコツが必要です。 できるだけシンプルに説明するために、次のようなコードを紹介しましょう。
-- hikisuu0 local arg = ... print(arg)
これを理解するには、実際の挙動を確かめるのが一番。「hikisuu0」というプログラム名でファイル保存して、色々実行してみましょう。
たとえば、こんな引数を与えて数回実行してみます。
> hikisuu0 100 100
> hikisuu0 abc abc
> hikisuu0 1 2 3 4 1
> hikisuu0 a b c d a
> hikisuu0
以上からわかることは、このプログラムは与えたコマンドライン引数のうち一番目のものだけを画面に表示するということです。ただし引数を何も与えないと何も表示しません。
サンプルコードの詳細解説
上記のサンプルコードをそのままコピペすればそのままあなたのプログラムに使えるわけなのですが、「なんで?どういう理屈でそうなるの?」と思いませんか?その疑問に思う気持ちは重要です。私は尊重します。(興味ない人はこの章を読み飛ばしてもOK)
詳細に解説しましょう。
まず注目するのは1行目のlocal arg = ...
です。
基本的な形が、local 変数名 = 値
の形をしていることから、変数arg 1の定義をしていると推測できるはずです。では...
とは何でしょうか。
Lua言語では...
というピリオド3つの表記を「可変長引数式」と呼びます。その詳しい説明はここでは省略しますが、この3つの点だけでコマンド入力時に後ろに続けて入力したパラメータ(コマンドライン引数)が利用できるわけですね。
なお、...
という表記によって、入力したコマンドライン引数の全部が利用できます。たとえば4つ入力したら4つともです。
しかし、local arg = ...
という表記では、入力したコマンドライン引数のうち先頭の1個しか利用できません。今回はそれで問題ないのですが、もしあらかじめ4つの引数を入力することがわかっていて、その4つ全てを拾って使いたいのならば、次のような表記が必要です。
local arg1, arg2, arg3, arg4 = ...
つまり代入用の変数をあらかじめ4つ用意しておくわけですね。ちなみにこういうような複数の変数への代入を一括で行う表記のことを「多重代入」2と呼びます。
とはいえ先ほども言いましたが、今回は多重代入は使いません。だって今回は、引数は先頭の一つだけでよいのですから。
床ブロック設置プログラムにコマンドライン引数を利用
さて、コマンドライン引数を使って、前回のプログラム「yuka2」を次のように改造しました。
変更点わかります?
---------------------------------- -- yuka3: 床にブロックを設置する(1往復) ---------------------------------- ------- Config ------- local hosuu = ... ------- Main ------- -- 地面に置いたタートルでは床にブロック置けないので、浮かせる turtle.up() -- 床にブロックを敷き詰めながら指定した歩数だけ前に進む for i=1,hosuu do turtle.placeDown() turtle.forward() end -- 右の列に移動 turtle.turnRight() turtle.forward() -- 右の列のスタート地点に移動。こちら側を向いている。 turtle.turnRight() turtle.forward() -- 右の列に床ブロックを敷き詰めながら戻ってくる for i=1,hosuu do turtle.placeDown() turtle.forward() end
実は。前回の「yuka2」プログラムに比べると一箇所しか変わってないんです。
- 「yuka2」の6行目:
local hosuu = 6
- 「yuka3」の6行目:
local hosuu = ...
これだけ!
プログラム実行
次のようなコマンドを入力して挙動を確認しましょう。
> yuka3 6
> yuka3 16
おわりに
これでタートルに、柔軟に床貼りをしてもらえますね! レッツ床貼り!(ネザーとかで)
次回は、このプログラムの問題点について触れ、その改善をします。
実際に使いはじめるとそのうち気づく問題点なのですが・・・。もしわかったら、コメントに書いてみてくださいね。