2012-03-16 12 views
5

私は本当に大好きです。プログラミング言語としてはLuaが大好きですが、すべてのローカル変数に常に「local」と入力する必要があります。私のDSL for Luaは...動作しますか?

これはちょうど私のコードをより煩雑に見せます。

私は、Luaの上にDomain Specific Language(DSL)を作成して、単に次の変数命名規則を持つことができますか?変数名はすべて大文字である場合

  1. 、それはグローバル変数エルス
  2. だ、変数はlocal変数

質問は次のとおりです。うこの作品 - [はい]または[いいえ?言い換えれば

-- In Lua 5.2 
isGlobalinLua = "is global in default Lua" 
GLOBALVAR  = "is global var in default Lua" 
local localvar = "is local var in default Lua" 

-- In my DSL Lua language 
isLocalinDSLLua = "is local in DSL Lua" -- translates to: local isLocalinDSLLua = ... 
GLOBALVAR  = "is global DSL Lua" 
localvar  = "is local var in DSL Lua" -- translates to: local localvar = ... 

だから今、デフォルトのLuaに次のコード:

MYGLOBAL = 10 
a = 1 
if a > 1 then 
    b = 2 
    print b 
else 
    c = 3 
    print c + MYGLOBAL 
end 

UPDATE:私のDSLのLuaで

myglobal = 10 
local a = 1 
if a > 1 then 
    local b = 2 
    print b 
else 
    local c = 3 
    print c + myglobal 
end 

ローカル機能はどうですか?

次のコードはどのように動作しますか?

myfunc = function (...) -- local myfunc = function (...) 

すべての大域機能をすべて大文字にしたいとは思っていません。

多分私は機能を無視し、 'local'という識別子を必要とします...考えていますか?

+0

興味深い質問です。 +1これが正しいかどうか、これを行う正しい方法が何であるかを見ることに興味があります。 –

+3

もちろんこれを行うことができます。あなたのDSLを読み込んでLuaソースを出力するプリプロセッサを書く。これは簡単なことではないし、それがどれほど価値があるのか​​は明らかではない。私は、実装言語と同じレベルの抽象度で動作するDSLには、個人的には少ししか見ません。時間を節約したり、エラーを防ぎません。 「ドメイン特有の」言語における「ドメイン」は、通常、エンドユーザドメインを指す。このようなゲームプレイヤー、会計士、ビジネスマンなど。 –

+0

それで、1年後、このアイデアから何が出ましたか? – lhf

答えて

3

Moonscriptには既定ですべての変数がローカルにあり、グローバルを宣言するにはexportキーワードを使用する必要があります。それは非常に素晴らしい次世代のcoffeescriptのような言語であり、それはLuaにコンパイルされます。私はLuaを使うのにどこでも使っています。

foo = 'bar' -- local 
square (x) -> x*x -- local 

-- globals 
export square 
export MY_GLOBAL = 12 

export class Foo 
    new: (bar) => @bar = bar -- self.bar = bar 
    get_bar: => @bar 
+0

残念ながら、私はcoffeescriptのファンではありません。あなたが残りの部分を使わずに使ってみたいMoonscriptの部分をどうやって引き出すことができるか知っていますか? – nickb

5

変更は比較的簡単なので、基本的に2つのオプションがあります。あなたはMetaluaを試してみることができます:

Metaluaが提供する言語およびコンパイラです...

  • のLisp方言またはテンプレートHaskellのでoffferedているものへの電源で同様の完全なマクロシステム、。操作されたプログラムは、 のソースコードとして、抽象構文木として、またはそれらの任意の組み合わせとして、あなたの仕事に合ったものが と見なすことができます。
  • 動的に拡張可能なパーサー。これにより、残りの言語とうまく融合する構文でマクロをサポートできます。

それとも、token filtersを使用することができます。

トークンフィルタはあなたに検査し、 彼らは パーサーに行く前にレクサーから来るトークンのストリームを変更する機会を与えることによって動作します。あなたはトークンだけを見ることになり、あなたは のトークンを生成することが許されます - あなたはレクサーに来るテキストを見ることも、 レクサーに入るテキストを生成することも許されません。

どちらの方法も賛否両論があります。 MetaluaはあなたがLuaで高水準の言語修正を行うことを可能にしますが、より険しい学習曲線を持っています。トークンフィルタを使用すると、トークンストリームを簡単に変更できますが、電力は制限されています(2005 talk参照)。

トークンフィルタで十分であるかどうかわからないのは、小文字の開始識別子がすべて代入される前にlocalを挿入すると、単純なケースでのみ機能するためです。次のコードはどうですか?

a = 1 
a = a * a 

localに変換しますか、2つにしますか?

local a = 1  vs. local a = 1 
a * a     local a = a * a -- valid in Lua, creates a new variable 
+0

"a"が既に定義されている前者です。 – nickb

3

はい、これは可能ですが、結果は「ドメイン固有の言語」とは呼ばれません。これは「プリプロセッサ」と呼ばれます。

私はまた、Lua —の問題によって信じられないほど盗聴されました。switchまたはcaseという文がありません。私は実際にこの機能をサポートするように実装を変更しました。しかし結局、私は私が使った方言でプログラミングすることに気にしなかったと決めました。

Cのプログラミングスキルをお持ちの場合、Luaの実装は非常にクリーンで、目標を達成する最も簡単な方法はおそらく実装を変更することです。

関連する問題