トップ » 技術記事 » Luaとなでしこのラブラブ仲良し生活(1) - なでしこv1.522でLuaをサポート

Luaとなでしこのラブラブ仲良し生活(1) - なでしこv1.522でLuaをサポート

タグ: Lua なでしこ

日本語プログラミング言語「なでしこ」の1.522以降では、なでしこから「Lua」のコードを呼び出すことができるようになりました。なでしこに不足する機能をLuaで記述できるだけでなく、Lua 用に作られたライブラリをなでしこのプログラムで利用することができます。本稿では、なでしこ+Luaの活用方法について紹介します。

日本プログラミング言語なのに、Lua ?

日本語プログラミング言語「なでしこ」の1.522以降では、なでしこから「Lua」のコードを呼び出すことができるようになりました。これによって、なでしこのプログラムを Lua で拡張できるようになりました。

なでしこのプログラムから、Lua のプログラムを実行したり、その Lua のプログラムから、なでしこのプログラムを実行することができるようになっています。

想定される用途としては次のようなものが考えられます。

  • なでしこの拡張ライブラリを Lua で記述
  • Luaは実行速度が高速なので、なでしこのプログラムで実行速度が求められるところをカバーする
  • なでしこの次に覚える言語として、Lua 言語の学習

Luaのプログラムを実行してみよう

それでは、さっそく、Lua のプログラムを実行してみましょう。なでしこをインストールすると、Lua の実行環境も同時にインストールされます。ですから、なでしこさえインストールしてれば、他に必要なものはありません。

なでしこのエディタを起動したら、次のように入力して実行ボタンをクリックしてみてください。

「print "Hello, Lua"」をLUAする
なでしこからLuaを実行したところ
なでしこからLuaを実行したところ

このように、なでしこからLuaのプログラムを実行する場合には、以下のように「LUAする」という命令を記述します。

[書式]
「(LUAのプログラム)」をLUAする

このように、なでしこの文字列に、Lua のプログラムを与えるだけなので、使い方はとてもシンプルです。

次に、Luaのサンプルプログラムでよくある階乗を求めるプログラムを実行してみます。

『
-- 階乗の計算
function fact(n)
  if n == 0 then
    return 1
  else
    return n * fact(n-1)
  end
end
print(fact(5))
--
』をLUAする

これを実行すると、120が画面に表示されます。

Luaをコンソールで使いたい場合

Lua で標準入出力を扱いたい場合があります。例えば、コンソールへ文字列を出力する「io.write()」や「io.read()」を使いたい場合です。そんな時は、なでしこエディタの設定メニューから、[設定>なでしこ実行方式>コンソール]をクリックしてください。標準入力や標準出力を使った命令が利用できます。

※【なでしこ実行モード】cnako
「
io.write("足し算をします。数値を入力してください。\n")
a = io.read()
io.write("次の数を入力してください。\n")
b = io.read()
c = a + b
io.write("答え:"..c)
」をLUAする
コンソールでLuaするを実行したところ
コンソールでLuaするを実行したところ
なでしこのプログラムなのに日本語ゼロで実行も可能

なでしこの文法が柔軟なのは、以前より(命令以外を)日本語を使わなくても記述できる点にあります。なでしこの関数呼び出しスタイルで Lua のプログラムを実行させる場合、以下のように記述することもできます。

LUA(` print "Hello, Lua!" `)

Lua のプログラムを呼び出す時には、この方が自然に見えるでしょうか。

注意したいポイント

ただし、あくまでも、なでしこの文字列の中にプログラムを書いているということを忘れないようにしなければなりません。なでしこの文字列「…」では波カッコ"{..}"が文字列の展開の意味を持っています。Lua のプログラムで波カッコを使いたい場合(Tableなどを使う場合)には、次のように、エスケープする必要があります。

「
-- 波カッコを表示するだけのLUAプログラム
print "{波カッコ}...{波カッコ閉じ}"    --> {...}
print "{\{}...{\}}"                    --> {...}
」をLUAする

これを実行すると「{…}」が2組、表示されます。ご覧の通りエスケープは面倒です。そこで、波カッコで評価を行わない「展開なしの文字列」を使うことができます。

なでしこのプログラムでは、文字列の種類に以下の種類があり、目的に応じて使い分けることができます。

種類 備考
「…」 よく使うなでしこの文字列。波カッコ {..}の中を評価する。
"…" 展開のある文字列。波カッコ{..}の中を評価する。
『…』 展開のない文字列。
`…` 展開のない文字列。

ここから、Lua のプログラムを書く場合には、『…』 あるいは、`…` の文字列が向いていることが分かります。

また、純粋に外部に記述した Lua のプログラムを実行したい場合には、なでしこの「開く」命令と組み合わせて次のように記述できます。

LUAファイル=「test001.lua」
LUAファイルを開いて、LUAする。
Lua について学ぶには?

なでしこユーザーの方で、Lua について学びたいと思っている方には、次のWebサイトが参考になります。

日本でLuaに関する書籍も発売されていますので、それも参考になるでしょう。





なでしことLuaのラブラブ生活に欠かせない命令

さて、なでしこから、Lua のプログラムを実行するだけでは、それほど、お互いにとってメリットはないかもしれません。そこで、なでしこと Lua の連携に使える命令を紹介します。

なでしこ側に用意された、Lua を扱う命令
命令の名前 機能
LUAする 引数として指定されたLuaのプログラムを実行する
LUA値 Lua側の変数の値を取得する

例えば、Lua で行った計算結果を、なでしこで取得して画面に表示するには次のようにします。

LUA(`--
r = 1
n = 5
for i = 1, 10 do
  r = r * n
end
--`)
LUA値("r")を言う。
http://aoikujira.com/demo/hakkaku/rc/20090527Somrim-n5-10.png

また「LUAする」命令は、毎回、Luaのエンジンを初期化するわけではないので、Lua のプログラムを、別々の場所に分けて書くこともできます。

LUA(`function add(a,b) return a + b end`)
LUA(`ret = add(3,5)`)
LUA値("ret")を言う。
Lua 側に用意されたなでしこを扱う命令

そして、Lua 側からなでしこを扱うための命令には次のものがあります。なでしこの変数を設定・取得したり、なでしこのプログラムを実行したりできます。

関数 機能
nako_get("変数名") なでしこの変数の値を得る
nako_set("変数名","値") なでしこの変数に値を設定する
nako_eval("プログラム") なでしこのプログラムを実行する

以下のプログラムは、Lua からなでしこの命令を利用する例ですが、メモ帳を起動して文字を書き込むというプログラムになっています。

LUA(`--
-- メモ帳を起動する
nako_eval("「notepad.exe」を起動。")
-- 1から30までの数値を書き込む
for i=1,30 do
  nako_eval("「メモ帳」に「("..i..")」をキー文字送信")
  nako_eval("0.1秒待つ。")
end
--`)
http://aoikujira.com/demo/hakkaku/rc/20090527XuSDKl-lua-notepad1to30.png

なでしこのライブラリをLuaで作る

では、最後に、Lua でなでしこのライブラリを作る方法を紹介します。とは、言っても基本的には、なでしこで関数を定義し、その中で「LUAする」命令を実行するだけです。

以下は、足し算を行う関数を定義したものです。

#-----------------------------------------------------------------------
# 関数の定義
●テスト加算(AとBを)
  「result = {A} + {B}」をLUAする
  それは、LUA値("result")
#-----------------------------------------------------------------------
# 関数を使ってみる
3と5をテスト加算して、表示。

また、速度が求められる場合には、あらかじめ Lua の関数を定義しておいて、なでしこの関数呼び出しでは、Lua の関数を呼び出すだけにしておきます。

#-----------------------------------------------------------------------
# Lua の関数定義
LUA(`--
function add(a, b)
    return a + b
end
--`)
#-----------------------------------------------------------------------
# なでしこの関数定義
●テスト加算(AとBを)
  「result = add({A},{B})」をLUAする
  それは、LUA値("result")
#-----------------------------------------------------------------------
# 関数を使ってみる
3と5をテスト加算して、表示。

WindowsのCOMコンポーネントを利用する

実は、ずいぶん前から、なでしこでも Windows の COMコンポーネント(ActiveX)を使えるようにしようという計画があるのですが、いまだ実現していません。そこで、Windows 版の Lua 「Lua for Windows」に付属している、LuaCOM というライブラリを使うことで、COMを扱うことができるようになります。

※なでしこのインストールフォルダに、<clibs>というフォルダがあれば、それは、Lua のライブラリを入れておくためのフォルダです。もし<clibs>フォルダがなければ、ここから LuaCOM をダウンロードしてなでしこのフォルダにコピーしてください。

以下のプログラムは、LuaCOMを利用して、Excelを起動し、そこに適当な値を100個書き込むというサンプルとなっています。

LUA(`--
-- Excel を起動する
require('luacom')
local excel = luacom.CreateObject("Excel.Application")
excel.Visible = true
local wb = excel.Workbooks:Add()
local ws = wb.Worksheets(1)
for row=1,100 do
   ws.Cells(row,1).Value2 = math.random()
   ws.Cells(row,2).Value2 = math.random()
   ws.Cells(row,3).Value2 = math.random()
  end
--`)
http://aoikujira.com/demo/hakkaku/rc/20090527nYVpK-excel.png

もちろん、なでしこの「エクセルセル設定」を使えば、上のプログラムと同じことができるのですが、なでしこで利用できない Excel の機能も Lua を使うことで実装できるようになります。

例えば、Internet Explorer を起動して、なでしこのページを表示させるプログラムを作ることができます。

LUA(`-- IEを操作する
require('luacom')
ie = luacom.CreateObject("InternetExplorer.Application")
ie.Visible = true
ie:Navigate2("http://nadesi.com")
--`)

まとめ

Lua と なでしこを組み合わせることで、それぞれの欠点を埋め合って、生産性を高めることができます。なでしこユーザーの中には、英語が苦手で Lua の導入はあまり嬉しくないと思う人もいるかもしれません。しかし、なでしこのライブラリを書く側にとっては、C言語やDelphiを使って、DLLを作らなくても良いので、気軽にライブラリの作成ができるようになったと思います。

なでしこの 1.522 のバージョンでは、Lua 側に、まだ、luacom しかライブラリが用意されていませんが、今後、Lua 側に便利なライブラリを追加していくつもりです。今後の展開も楽しみにしていてください!

Series NavigationLuaで外部ライブラリを呼び出す»

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :