もうここ

バレるんじゃねぇのか?と思う今日この頃。プログラマボクサーというだけで
僕を知っている大半の人には、これを書いているのが僕だとばれてしまうわなー。

で、さらに驚愕の事実。「lua 関数プログラミング」で、ググるとトップに来ちゃう。しかも二件。

…いや、今日は上司が「よし、明日はluaで関数プログラミングだ」と言ってたので、
予習で、上のワードで調べましたよ。するとこのブログですよ…マジで。俺と同じように
検索してやっちまおうてな考えだとまず確実にヒットする。

で、勧進の調べたいことがヒットしないので、

「lua lambda」で検索。すると

http://d.hatena.ne.jp/winebarrel/searchdiary?word=*%5BLUA%5D

あー、確かにプログラミングサイトですけど…なんすか~、ちょっと凄い変換…。

ちなみに昔2chで見た情報だけど、

plus = function(a)
return function(b)
  return (a+b)
end
end

print(plus(5)(6))

のように書ける。このあたりが、高階関数だとかなんとか…。確かupvalueという
関数生成時の環境をクロージャみたいにホールドするしくみがあるからこれができるらしい。

あへぇ~、よくわからんが凄いや。まぁ、クロージャの仕組みはActionScriptにも
出てくるからなじみはあるけど。僕はCとのやりとりにスタックに引数を乗せるしくみが
面白かった。まぁ低いレベルの話ですがね。たとえば、aという関数に引数1をのせて実行したい場合は

lua_pushstring(l,"a")//関数名乗っけて
lua_gettable(l,LUA_GLOBALSINDEX)//関数と入れ替えて
lua_pushnumber(l,1)//引数乗っけて
lua_call(l,1,0)//引数1個、戻り値1個で呼ぶ。

てな感じ、なんかアプリケーションの仕組みの勉強になりそうな感じで楽しい。
まぁここらへんをもうちょっといじいじといじるともうちょっと楽しいのだけれど

ただし、luaで関数プログラミングができても関数が多言語ではないため、

①関数に副作用なし
②変数なし

という制約はありません。うーん、しかしこのように記述することのうまみが今ひとつわからない。
クロージャの仕組みは有用ですよ。でもそれは関数プログラミングのおかげじゃない。クロージャのおかげ。
では関数プログラミングは何が嬉しいの?

http://www.sampou.org/haskell/article/whyfp.html

で、ここを読んでいるわけですが、読んでますますわからん。

わかったら次の機会にでも。…話変わっちゃったな。

| | コメント (0) | トラックバック (0)

LUA_REGISTRYINDEXは何のためにあるのか

ども、久しぶりのプログラムネタです。最近luaL_refを仕事でもプライベートでもよく使っているので、LUA_REGISTRYINDEXとも接する機会が多いですね。

目的としてはやっぱりポインタ代わりに使いますね。

programming in LuaのサンプルやMLでもそんなことを書いてありました。(英語なので不正確)。さて、そのprogramming in luaでのサンプルですが、

//取得
lua_pushstring(L,"関数名");
lua_rawget(L,-1);
ref = luaL_ref(L,LUA_REGISTRYINDEX);

//使用
lua_rawgeti(L,LUA_REGISTRYINDEX,ref);

//さよなら
luaL_unref(L,LUA_REGISTRYINDEX,ref);

となっていました。ここで、あれれと思ったのが、LUA_REGISTRYINDEXって何よってことです。グーグル先生で検索してもよくわかりません。

なので、自分で勝手に推測した結論は

「LUA_REGISTRYINDEXはLuaプログラムにいじられないテーブルのインデックスである」

そう、LUA_GLOBALSINDEXだと、_Gでいじれてしまうし、特定のテーブルを作ったとしてもそれを参照されては元も子もない。

一生懸命LuaからLUA_REGISTRYINDEXをいじる方法を探しましたが見つかりません。つまり、LUA_REGISTRYINDEXとはLUAからいじられたくない値だけどCからは使いたい、そういう値を登録、使用するためにあるものなのです。…だと思います。間違ってたら教えてください。

うん、ごめん。グーグル先生。ありました。5.1ではなく、5.0のマニュアルのほうに
http://uri.sakura.ne.jp/~cosmic/yuno/lab/lua5_manual_ja.html#3.18

まあ、使い方は間違っていなかったと。また認識もそれほど間違いじゃない…と

| | コメント (0) | トラックバック (0)