2022/11/08(火) [n年前の日記]
#1 [tic80][lua] TIC-80上でMoonScriptを試用
TIC-80 1.0 は、Lua以外にも色々な言語でスクリプトを書けるけど、その中の MoonScript というのが気になったので少しだけ試用してみた。環境は Windows10 x64 21H2 + TIC-80 1.0.2164。
MoonScript というのは、最終的に Lua に変換して実行される言語らしいけど、JavaScript を拡張した CoffeeScript なる言語を参考にして作られているらしい。まあ、JavaScript界隈では、CoffeeScript ってオワコン扱いされているらしいけど…。それでも、素の Lua に比べたらマシな記法ができるのではないかと期待…。
MoonScript というのは、最終的に Lua に変換して実行される言語らしいけど、JavaScript を拡張した CoffeeScript なる言語を参考にして作られているらしい。まあ、JavaScript界隈では、CoffeeScript ってオワコン扱いされているらしいけど…。それでも、素の Lua に比べたらマシな記法ができるのではないかと期待…。
◎ Hello Worldを眺める。 :
とりあえず、TIC-80 + MoonScript版の Hello World を引用してみる。
これだけでも、少しは言語仕様が分かる。
-- title: game title -- author: game developer, email, etc. -- desc: short description -- site: website link -- license: MIT License (change this to your license of choice) -- version: 0.1 -- script: moon t=0 x=96 y=24 export TIC=-> if btn 0 y-=1 if btn 1 y+=1 if btn 2 x-=1 if btn 3 x+=1 cls 13 spr 1+(t%60)//30*2,x,y,14,3,0,0,2,2 print "HELLO WORLD!",84,84 t+=1
これだけでも、少しは言語仕様が分かる。
- コメント行は Lua と同様、「--」から始まる。
- ブロックの終了を示す「end」「)」「}」が無い。Pythonと同様にインデントでブロックを表す。
- 関数を作成する時は、TIC=-> のように書くらしい。
- 関数呼び出し時、Ruby のように、括弧を省略できる。
- 代入演算子の += が使える。ということは -=, *=, /= も使えるのだろう…。
◎ classを使ってみる。 :
_先日Rubyで書いたサンプル
を、MoonScript で書き直してみる。
_moveballmoon.moon
以下、参考ページ。
_MoonScriptしようや... - Qiita
_Language Guide - MoonScript 0.5.0
_moveballmoon.moon
-- script: moon class Ball new: (@x,@y,@scrw,@scrh) => @id = 1 + 2 * math.random(0,5) spd = 0.4 * @scrw / 60.0 a = math.rad(math.random(360)) @dx = spd * math.cos(a) @dy = spd * math.sin(a) update: => @x += @dx @y += @dy if @x<=0 or @x>=@scrw-16 @dx *=-1 if @y<=0 or @y>=@scrh-16 @dy *= -1 draw: => spr @id,@x,@y,0,1,0,0,2,2 export t=0 sw,sh=240,136 -- init objs export objs={} n=80 for i=1,n objs[i] = Ball(sw/2,sh/2,sw,sh) export TIC=-> -- update for i=1,#objs objs[i]\update! -- draw cls 0 for i=1,#objs objs[i]\draw! print "Lua: #{_VERSION}",4,8,12 print "count: #{t}",4,16,12 print "#{t//60} sec",4,24,12 t+=1
以下、参考ページ。
_MoonScriptしようや... - Qiita
_Language Guide - MoonScript 0.5.0
- class Hoge と書けばクラスを定義できる。
- クラスのインスタンス変数には「@」をつけるっぽい。
- new: がコンストラクタの定義。
- 関数の引数が無い場合は、update! のように、最後に「!」をつけて「引数が無いよ」と伝えるらしい。update() でも良さそうだけど…。
- objs[i].draw! でも objs[i]:draw! でもなく、objs[i]\draw! と書く。「:」は別のどこかで区切り文字として使ってしまっているから、らしい。
- #objs で、テーブルの個数を取得できる。
- for i=1,#objs で、最後につける do は省略できる。
- Rubyと同様に、"hoge #{t}" と書けば、文字列内に t の値が展開される。
- グローバル変数、グローバル関数には export をつける。
◎ 感想。 :
MoonScript を使えば、素のLuaで書くより楽になりそうな感じはした。ただ、これなら、Ruby (mruby) で書いたほうがもっと楽になりそうな印象。まあ、それは自分がちょっとだけ Ruby に慣れてるせいかもしれんけど…。
ただ、クラスのコンストラクタの引数に、いきなりインスタンス変数を記述できるのはイイ感じ。コンストラクタ内でわざわざ再設定しなくて済む。以下の解説ページでも「こういうことができないからRubyはクソ」てな言及が…。
_100 Languages Speedrun: Episode 89: MoonScript - DEV Community
ところで。TIC-80のエディタ上で MoonScript を書いていた際、ずっと parseエラーが出て悩んでしまった。原因は、タブ文字によるインデントとスペース文字によるインデントが混在してしまったせいだった。TIC-80 は new moon と打って MoonScript のソースを新規作成した際、インデントをタブ文字で挿入してあるので、そのソースに対してスペースを打ってインデントしていくとハマってしまう…。ブロックをインデントで指定する言語はこういうところが面倒臭いなと…。
TIC-80のエディタ上で、タブ文字等の制御コードを表示する機能があればこんなことにはならんのに。低機能な内蔵エディタの使用を強要されるからこういうトラップに引っ掛かってしまうのだな。
このあたり、「どうだ。無料版は不便だろう。お金を払ってPro版を買うのだ」という作戦なのだろうか…。
ただ、クラスのコンストラクタの引数に、いきなりインスタンス変数を記述できるのはイイ感じ。コンストラクタ内でわざわざ再設定しなくて済む。以下の解説ページでも「こういうことができないからRubyはクソ」てな言及が…。
_100 Languages Speedrun: Episode 89: MoonScript - DEV Community
ところで。TIC-80のエディタ上で MoonScript を書いていた際、ずっと parseエラーが出て悩んでしまった。原因は、タブ文字によるインデントとスペース文字によるインデントが混在してしまったせいだった。TIC-80 は new moon と打って MoonScript のソースを新規作成した際、インデントをタブ文字で挿入してあるので、そのソースに対してスペースを打ってインデントしていくとハマってしまう…。ブロックをインデントで指定する言語はこういうところが面倒臭いなと…。
TIC-80のエディタ上で、タブ文字等の制御コードを表示する機能があればこんなことにはならんのに。低機能な内蔵エディタの使用を強要されるからこういうトラップに引っ掛かってしまうのだな。
このあたり、「どうだ。無料版は不便だろう。お金を払ってPro版を買うのだ」という作戦なのだろうか…。
[ ツッコむ ]
以上です。