*Luaリファレンス 要注意点 ~コンパイル/Eval~ [#d3df91d8]

**dofile("somefile.lua") [#ic0307ab]
-要するにimport, includeの類。~
ただしpythonでいうところの''reloadの機能を兼ねる''~
プログラム実行後に、somefile.luaを変更し、''再びどこかで、dofile''をすると、その内容が反映される。
**dofileと類似の関数 [#s5609728]
-dofile(filename)~
先述した通り。~

**dofile(filename) [#o5c1a839]
>先述した通り。~
ファイル(のチャンクを)中間コードにコンパイルして、実行する
~
-loadfile(filename)~
該当のファイル(のチャンクを)中間コードにコンパイルして返す。内容を実行はしない。

**loadfile(filename) [#za6b7eed]
>該当のファイル(のチャンクを)中間コードにコンパイルして返す。~
~内容を実行はしない。~
~
返り値:
  ・成功 --> コンパイル済みチャンク
  ・失敗 --> nil と エラーメッセージ (例: nil,  cannot open *****.lua)
を返す。
|成功|コンパイル済みチャンク|
|失敗|nil と エラーメッセージ (例: nil,  cannot open *****.lua)|
を返す。~
~
loadfileは''チャンクを実行しない''ので注意。~
即ち、dofileとloadfileの関係は自作するなら、以下のようにあらわせる
#sh(lua){{
function dofile (filename)
    local f = assert(loadfile(filename))  -- loadfileは実行しない。コンパイルしたチャンクを無名関数として返すのみ
    return f() -- 実行
end
}}
~

loadfileはチャンクを実行しないので注意。即ち、dofileとloadfileの関係は以下のようにあらわせる
**loadstring("i=i+1") [#h85d1fa8]
>loadstringは、文字列をチャンクとみなし、中間コードに無名関数としてコンパイルして、~
その関数への参照を返す。~
それは「可変長引数」を持つ無名関数となる。~
~
よって
#sh(lua){{
loadstring("a = 1")

function (...) a = 1 end
}}
と等価である。~
~
このように、loadstringの''返り値は、関数として評価(要するに( )を付ける)ことで、実行可能である''。
~
#sh(lua){{
i=3
f = loadstring("i=i+1")
f()
print(i)
}}
ということが可能。以下のようにloadstringによって返ってきた値をそのまま()で評価して
#sh(lua){{
loadstring("print('OK')")()
}}
とすることも出来る。~
~
**チャンクと名前空間 [#m95ed250]
>loadstringを利用する際は、対象記述対象は、グローバル変数だということ。
#sh(lua){{
i = 32
local i = 0

f = loadstring("i=i+1;print(i)")
g = function() i=i+1;print(i) end
print(f()) -- 33 loadstringで操作していたのは、あくまでグローバル
print(g()) -- 1  こちらはローカル。
}}

**読み込み文字列をeval [#j7c51418]
>
#sh(lua){{
local l = io.read()
local f = assert(loadstring("return " .. l ))
print("the expression is " .. f() )
}}

**簡単なREPL(入力コンソール)の例 [#s1b5ab2a]
>入力値として「x*2」などとして確認してください。
#sh(lua){{
print "enter function to be plotted (with variable 'x'):"
local l = io.read()
local f = assert(loadstring("local x = ...; return " .. l))
for i=1, 20 do
    print(string.rep("*", f(i)))
end
}}


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS