5

私はプログラミング言語としてLualocalが大好きですが、すべてのローカル変数に対して常に「」と入力しなければならないのは信じられないほどバグです。

それは私のコードをより雑然と見せてくれるだけです。

ですから、Luaの上にドメイン固有言語(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
local a = 1
if a > 1 then
    local b = 2
    print b
else
    local c = 3
    print c + myglobal
end

私のDSLLuaで:

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

更新

ローカル関数はどうですか?

次のコードはどのように機能しますか?

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

すべてのグローバル関数をすべて大文字で作成したいのかどうかはわかりません。

たぶん私は関数を無視し、' local'識別子...思考を必要としますか?

4

3 に答える 3

5

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

Metaluaは、...を提供する言語およびコンパイラです。

  • Lisp方言やTemplateHaskellによって提供されるものとパワーが似ている完全なマクロシステム。操作されたプログラムは、ソースコード、抽象構文木、またはそれらの任意の組み合わせとして、タスクに適したものと見なすことができます。
  • 動的に拡張可能なパーサー。これにより、他の言語とうまく調和する構文でマクロをサポートできます。

または、トークンフィルターを使用できます。

トークンフィルターは、パーサーに移動する前に、レクサーからのトークンのストリームを検査および変更する機会を提供することで機能します。トークンのみを表示でき、トークンの生成のみが許可されます。レクサーに到達するテキストを表示したり、レクサーに到達するテキストを生成したりすることは許可されていません。

どちらのアプローチにも長所と短所があります。Metaluaを使用すると、Luaで高級言語の変更を行うことができますが、学習曲線は急になります。トークンフィルターを使用すると、トークンストリームに簡単な変更を加えることができますが、機能には制限があります(2005年の講演を参照)。

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

a = 1
a = a * a

それを1つに変換しますlocalか、それとも2つにしますか?

local a = 1     vs.    local a = 1
a * a                  local a = a * a  -- valid in Lua, creates a new variable
于 2012-03-16T22:02:21.737 に答える
3

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

私もかつて、Luaの問題に非常に悩まされていました。つまり、switchorcaseステートメントがありません。私は実際に、この機能をサポートするように実装を変更することになりました。しかし、結局、私は自分だけが使用する方言でプログラミングすることを気にしないことに決めました。

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

于 2012-03-17T01:48:34.083 に答える
3

Moonscriptにはすでにデフォルトですべての変数がローカルにあり、グローバルを宣言するにはexportキーワードを使用するだけで済みます。これは非常に優れた次世代のコーヒースクリプトのような言語であり、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
于 2013-04-06T21:46:06.587 に答える