Lua入門 その1 — Hello World
目次
1 はじめに
ようやくちゃんとプログラミングに取り組める環境が整いました。
ここからはLuaを使って実際にプログラミングを行なっていきます。
次の目標は、自分が何を書いたのか理解した上でプログラムを動かせるようになることだと、どこかで書きました。 そのためには、少くとも使用するプログラミング言語のルールを覚える必要があります。 そこで、目標をちょっと修正します。 次の目標は、Luaの基本的なルールを覚えることとします。
どのようにしてルールを覚えていくかは、二つ方法が考えられます。
- 最初にルールを一通り学んでしまう。
- 必要になるまで学ばない。
Luaはシンプルでミニマムな言語で、覚えなければいけないルールは比較的少ない方です。 最初に言語のルールを並べていって、記憶してしまうという1の方法をとっても、それほど苦痛にならないかもしれません。
このシリーズでは、言語のルールを覚えるだけではなく、プログラミングのやり方も模索しながら進めていきたいです。 そのためには、最初に問題を提示して、その問題を解決するために必要なものを、その都度導入していくというスタイルでやります。 つまり、2の必要になるまで学ばないという方法を取ります。
2 最初の問題 Hello Wrold
さっそくやってみます。 これから問題は次のような枠に囲んで提示することにします。
問題1 — Hello World
画面に Hello, world! というテキストを表示させる。
すでにC++でやってますが、今度はそれをLuaでやってみます。
2.1 準備
まず作業場所を確保しましょう。
FreeBSDに以前追加したユーザーでログインします。
もうrootではログインしません。 もし一般ユーザーを追加していなかったら前のページに戻って作成してきて下さい。
ホームディレクトリの中にコードをぶちこんでおくためのディレクトリを作成します。 例えばcodeという名前にしておきます。
% mkdir code⏎
その中にさらに、問題の解答を詰め込んでおくためのディレクトリを作成します。 例えば、URLを見てもらうと、このシリーズはpintroという名前を使っていますので、pintroとでもしておきます。
% cd code⏎ % mkdir pintro⏎
さらにその中に、問題1のコードを置いておくために適当な名前のディレクトリを作成します。 ここで名前をhelloworldのように問題の内容を表すものにするか、問題番号を使うかは迷うところです。 こちらは問題番号を使うことにしておきます。
% cd pintro⏎ % mkdir problem1⏎
そして、その中に移動します。
% cd problem1⏎ % pwd⏎ /home/toma/code/pintro/problem1
カレントディレクトリは /home/toma/code/pintro/problem1
になっているはずです。
「toma」の部分は自分のログインしているユーザー名で置き換えて下さい。
ディレクトリ名は、同じようにする必要はありません。 迷ったときに、一応、参考にでもして下さい。
2.2 書いて、動かす
作業場所が用意できました。 その中でLua版のHello Worldを動かします。
Luaのコードを実行する方法は主に二つあります。
一つは、ファイルにコードを書いて、Luaのインタープリタにそのファイルを実行させる方法です。
もう一つは、Luaを対話モードで起動して、そこでコードを打ち込む方法です。
もう一つ重要な実行方法があります。 別の言語から実行するという方法です。 しかし、今の段階で扱えるほど簡単ではないので、省略します。
両方ともやってみましょう。
2.2.1 ファイルにコードを書いて動かす
ファイルにコードを書くには、テキストエディタを使います。 既にviかeeのどちらかで、テキストファイルを編集できるようになっている必要があります。
コードを書くファイルの名前は、「hello.lua」とします。 拡張子に広く使われているのは「.lua」です。 絶対そうでないといけないという訳でもありません。 「hello.l」とかにしても特に問題はおきません。 ですが、こんなところで反抗的になる意味はあまりないです。 普通に「.lua」としておきます。
viでこのファイルの編集を開始するには、次のコマンドを入力します。
% vi hello.lua⏎
eeでこのファイルの編集を開始するには、次のコマンドを入力します。
% ee hello.lua⏎
テキストエディタが起動して、編集できるようになったら、次のコードを書き込みます。
print("Hello, world!")
書き終えたら、保存してテキストエディタを終了します。
C++のときは、このあとコンパイルというステップが必要でした。 嬉しいことに、Luaはコンパイルはしなくても実行することができます。 コンパイルするのではなく、インタープリタにさっきのLuaのコード実行させます。
Luaで書かれたコードは、直接コンピューターが理解できるコードに変換されるのではありません。 インタープリタが実行されると、指定されたLuaのコードをインタープリタが解釈して、対応する命令に変換して処理していきます。 いわば、コンピューターとLuaのコードの間に一枚層を挟むことによって、事前にコンパイルすることを不要としています。
前回、lua54というパッケージをインストールしました。 これには、Luaのインタープリタのプログラムが含まれています。 コマンド名はlua54です。 次のコマンドで、さっき書いたHello Worldを実行することができます。
% lua54 hello.lua⏎ Hello, world!
いちいちlua54というコマンドを先に書かないのは面倒に思えるかもしれません。
もし、hello.luaがとても便利なもので、日常的に繰り返し何度も使うようであるなら、単に hello
とするだけで実行できるようにしたいものです。
今はまだ必要ないと思われるのでここでは紹介しませんが、UNIX環境では広く使われている良い解決策があります。
なので、大丈夫です。
2.2.2 対話モードで動かす
対話モードで動かすためには、まずLuaを対話モードで起動します。 それには、Luaのインタープリタのプログラムであるlua54を、引数なしで実行します。
% lua54⏎ Lua 5.4.2 Copyright (C) 1994-2020 Lua.org, PUC-Rio > ▋
>
がプロンプトであり、ユーザーからの入力待ち状態であることを示しています。
続けてLuaのコードを打ち込むことで、その場で実行して結果を得ることがきます。
ここでは、次のようにします。
> print("Hello, world!")⏎ Hello, world! > ▋
すぐに Hello, world!
と表示されました。
そして、またプロンプトが表示され、入力待ちの状態になりました。
いくらでも続けてコードを打ち込むことができます。
このような対話的にプログラミングを行う環境のことを、REPL (Read Eval Print Loop; 読み込み、評価 表示 繰り返し)と呼びます。 REPLには色んな使い道が考えられます。 差し当り今の段階では、ファイル書くまでもないような、ちょっとしたコードを試してみるのに便利です。
対話モードを終了するには Ctrl+D を叩きます。
> ^D % ▋
Ctrl+Dは、EOF (End Of File; ファイルの終わり)を意味する特別な文字を送信します。 EOFが入力されると、Luaのインタープリタはそれが対話モードの終了を意味するものだと解釈して、終了します。 EOFで対話モードを終了させるのは、LuaのREPLだけではなく、他の言語のREPLや対話形式のアプリケーションの多くで使えます。 終了させたくなったら、とりあえずCtrl+Dを試してみるように覚えておいて損はないです。
2.2.3 ファイルに書くか、対話モードで書くか
Luaには、コードを実行するための方法が2通りあります。 どちらを使っていくかですが、ファイルに書いていく方をメインにしていきます。 対話モードは補助的に利用することにします。
2.3 print
さっき書いたLuaのHello Worldのコードを見てみます。
print("Hello, world!")
注目するべきポイントを挙げてみます。
- printという謎の単語
- printに続いて開き括弧と対応する閉じ括弧がある。
- 表示させたいテキストは、「"」で囲まれている。
「print」という単語は印字するという意味で、何となく「表示させる」という意味を持ったものではないか、と想像できるかもしれません。
また、二重引用符「"」で囲まれた部分が、表示させたいテキストではないか、と想像できるかもしれません。
「(」と「)」はちょっと奇妙に映るかもしれません。
printというのは、Luaが用意してくれている関数です。 関数は、数学の関数と似ているところがあります。 しかし、異なるところの方が大きいです。 どちらかというと「命令」といった方がしっくりくるかもしれません。 printは、「このテキストを画面に表示せよ」という命令だと捉えることができます。
printのような、特定の単語に続けて開き括弧「(」が来ると、その単語は関数の名前である、と解釈されます。
そして、対応する閉じ括弧「)」までが、関数の呼び出し; function callを意味します。
括弧に囲まれた内側のものは、関数の引数です。
従って print(何か引数)
というのは、何か引数を一つ指定して、printという名前の関数を呼び出す、という意味になります。
二重引用符「"」で囲まれたものは、文字列です。 文字列とは、Luaにコードとして認識されるのではなく、そのままテキストであるとされます。 言ってみれば、コードの中にテキストを埋め込むような感じです。 プログラムにとっては、命令を記述したものではなく、データを記述したものとも考えられます。
ここまでを整理すると print("Hello, world!")
は次のようになります。
「"Hello, world!"という文字列を引数として、printという関数を呼び出せ」
Luaのインタープリタはそのように解釈して、コンピューターが理解できる命令に変換して、その結果、画面に Hello, world!
というテキストが表示されます。
2.3.1 少し書き換えてみる
printの引数の文字列は、どのような文字列にでもすることができます。 テキストエディタでもう一度hello.luaを開きます。 例えば、hello.luaの内容を次のようにしてみます。
print("You say Goodbye")
修正できたら、保存してテキストエディタを終了します。 そして、さっきと同じようにLuaのインタープリタであるlua54に、ファイル名hello.luaを指定して実行します。
% lua54 hello.lua⏎ You say Goodbye
表示されるテキストが変わってます。
関数呼び出しは何回でも書けます。 再度テキストエディタでhello.luaを開いて、次のように変更してみます。
print("You say Goodbye") print("I say Hello")
保存して、テキストエディタを終了します。 実行するには、さっきと同じようにします。
% lua54 hello.lua⏎ You say Goodbye I say Hello
こんな感じでprintをたくさん書いていけば、ちょっとした詩や歌詞を表示するプログラムなら作ることができるでしょう。
2.4 チャンク
Luaでは、Luaが解釈できるコードのことをチャンク; chunkと呼びます。 理由は分かりません。 何かの塊、のようなニュアンスの英語です。 さっきファイルに書いた1行だけのコードもチャンクで、対話モードで入力したコードもチャンクです。 もっとたくさんのコードが含まれているものも、やはりチャンクです。 チャンクを含んだファイルを、チャンクファイル、と呼ぶことはないようです。 コードを書くことを、チャンクを書く、とは言わないようです。
郷に入っては郷に従えに従って、これからなるべくチャンクと呼ぶことにします。 まだすごい違和感があります。 正しい用法を守れる自信はあまりありません。
3 まとめ
このページは、今後のどのような進め方をするのかを見せるためのデモみたいなものです。 覚えるべきことは少ないです。
- 最初の問題Hello Worldを提示しました。 今後は、このように最初に問題を提示して、その解決策を模索しながらLuaのルールを導入していくというスタイルを取ります。
- Luaのプログラムを実行する方法について書きました。
方法は2通りあります。
- Luaのインタープリタにファイル名を指定して、コマンドを実行する方法
- 対話モードでLuaのコードを打ち込む方法
- print関数について書きました。
- 文字列について書きました。
別にこれらを完璧に理解していなければいけないという訳ではないです。 今後も必要に応じて繰り返し書くことになるので、時間を掛けて身に付けていけば良いです。