4

lua 内でドメイン固有言語を実装するために、言語にベアワードを追加したいと考えています。したがって、それ print("foo")は次のように書くことができますprint(foo)

私がこれを行った方法は、環境テーブルのメタテーブルを変更すること_Gです。

mt = {__index = function(tbl,key) return key end}
setmetatable(_G, mt)

変数の値を取得するにfoo_G.foo_G["foo"]

これは良いアプローチですか?隠れた欠点はありますか?より良い方法はありますか?ベアワードが特定のファイル内でのみ機能するようにすることはできますか? (おそらく、別の luascript から を使用してそのファイルを実行することによってloadstring)

4

1 に答える 1

4

誰かがあなたの「キーワード」と同じ名前のローカルを宣言するとすぐに、それはあなたの「キーワード/グローバル変数」を隠し、あなたのメカニズムは失敗します:

print(foo)   -- does what you think
local foo = 2
print(foo)   -- argh!

また、スクリプトでのローカル変数の定義を防ぐことはできないことに注意してください。

編集:(コメントへの回答)。

カスタマイズされた Lua エンジンを使用していますか? 常にローカル スコープにいるため、ローカル スコープに入ることを防ぐことはできません。これはまったく逆です。技術的には、Lua にはグローバルスコープがありません(たとえば、C と同じ意味です)。代わりに、(テーブルとして実装された)グローバル名前空間があります。グローバルにアクセスするためのメカニズムは、Lua 5.1 (関数環境) と Lua 5.2 (暗黙_ENVのプレフィックス) で異なりますが、概念はほぼ同じです。

特に、Lua スクリプトがロードされると、インタープリターまたは、 、 などによってload、通常は「メイン チャンク」と呼ばれる無名関数 (クロージャー) の本体として解釈されます。したがって、常にローカル スコープが存在します。標準の Lua では、パーサーがロード中のスクリプト内のステートメントに遭遇したときに、ローカル変数の定義を防ぐことはできません。loadstringdofilelocal

于 2013-09-06T08:21:44.680 に答える