Luaレッスン16 「ヒントと秘訣(その1)」和訳

原典:http://compasstech.com.au/TNS_Authoring/Scripting/script_tut16.html

レッスン16 「ヒントと秘訣(その1)」

補足
今後の目標はどこに定めたらよいでしょうか? 
可能性は無限にあります。 思いのままに突き進んでください。でも時には休む必要もあるでしょう?
学ぶべきことはまだまだたくさんあります。基礎は身についたはずですから、もっと高度なWebサイトなどを検索して、求める答を探してください。もしかしたら、プロのプログラマーとの交流が生まれるかもしれませんよ。 Lua Nspired Wikiにはぜひアクセスすべきです。受け身にとどまらず、自らこのWebサイトに貢献することすら可能でしょう。ユニークな人、優秀な人たちによって管理されているWebサイトです。
Nspired Luaにある素晴らしいチュートリアルには必ず一通り目を通してください。また、歴史あるTI-Calc.org Luaアーカイブでは、見事なサンプル・ファイルが見つかることでしょう。
しかしレッスン1~15では紹介し切れていないことがまだいくつかありますので、もうすこしおつきあいください。

以下に3つの重要事項を示します。これは、Luaの師匠であるジョーン・パワー(TI)から示されたものです。氏は、われわれがLuaのプログラムを開発する際に大きな役割を果たしてくれました。

検索
文字列の中に従属文字列が含まれているかどうかと、その従属文字列の位置とが知りたい場合はfindを使ってください。 findを実行すると数字が2つ返ってきます。最初に一致した文字列の先頭および末尾を示すインデックスです。 文字列の中に従属文字列が含まれていない場合はnilが返されます。 findメソッドには、試す価値のある万能なパターン・マッチング機能があります。 たとえば以下のように「str:find("%b()")」と指定した場合は、最初に見つかった括弧対の先頭および末尾を示すインデックスが返ってきます。
formula = "2*(3+(4+5))"
formula:find("%b()")を実行すると、最初に見つかる括弧対の位置が先頭から3番目と11番目であるから、3, 11という値が返ってきます

置換
従属文字列を別の文字列に置換したい場合は、次のようにしてください。
newstring = oldstring:gsub("=", "->")
このように指定すると、古い文字列に含まれていた"="がすべて"->"に置き換わります。 最初に見つかった文字だけを置き換えたい場合は、oldstring:gsub("=", "->", 1)のように指定してください。 何も見つからなかった場合は、元の入力文字列がそのまま返されます。 gsubメソッドは、findと同じパターン・マッチング機能を使います。
応用例として、読みづらい"^2"や"^3"などを"2"や"3"のような表記に置き換えるプリティー・プリント機能はいかがでしょうか? 
"^"や"+"のような一部の共通記号は、Luaのパターン定義に含まれています。 "%"を使えば、そうしたパターン定義は無視され、%のうしろに続く文字がそのまま使用されます。
以下に示した函数を調べ、各行での処理の内容を確認してください。これは、"-1x^2+-0x+-4"のような二次方程式を"-x2-4"に変換する函数です (プリティー・プリント機能について詳しくは、サンプル・ファイルをダウンロードして、pretty.tns、pretty.luaのどちらかのドキュメントを詳しく見てください)。
function pretty(input)
input = tostring(input)
input = input:gsub("%+%-", "-")
input = input:gsub("0x%^2%+", "")
input = input:gsub("0x%^2%-", "")
input = input:gsub("0x%+", "")
input = input:gsub("0x%-", "")
input = input:gsub("%+0", "")
input = input:gsub("%-0", "")
input = input:gsub("1x", "x")
input = input:gsub("%^2","2")
return input
end


分割
1つの文字列を"="の前後で分割したい場合は、以下のようにしてください。
parts = equation:split("=")
left = parts[1]
right = parts[2]
上の3行は、以下のように1行にまとめることも可能です。
left, right = unpack(equation:split("="))

レッスン17Lesson 17では、math.evalに関する内容を中心に、引き続き、パワフルで便利なLuaの機能を学びます。Luaを使ってTI-Nspireの機能をさらに引き上げることが出来ます。

---------------------------------------------------------------------------

 (訳註)今回の実行例。スクリプトはサンプル・ファイルのまま。

f:id:ti-nspire:20141117130545g:plain