Concurrent Clean : ABCマシン(13) : 関数のエクスポートと push_node
関数のエクスポートは、2種類のエクスポートがあるのです。
module Lib app :: (a b -> c) a b -> c
がエクスポートされると、
.export e_Lib_sapp .descexp e_Lib_dapp e_Lib_napp e_Lib_lapp 3 0 "app"
で、.exportされる方は実際の計算で、.descexpされる方は関数オブジェクトの取り扱い関連なのですが、おそらくこんな区別。
- e_Lib_sapp
- 正格な関数実行
- e_Lib_dapp
- 関数オブジェクトのラベル名
- e_Lib_napp
- 関数オブジェクトのノードの実行(遅延評価)
- e_Lib_lapp
- カリー化された関数オブジェクトの正格評価
で、e_Lib_nappのABCコードがこんな感じ。
.o 1 0 e_Lib_napp push_node _cycle_in_spine 3 .d 3 0 jsr ea1 .o 1 0 fill_a 0 1 pop_a 1 .d 1 0 rtn
この、push_nodeの意味がわからない。『Functional Programming and Parallel Graph Rewriting (International Computer Science Series)』には載っていないので、cgcode.cから読み込んでいかないといけなかったのですが・・・
多分、こんな感じだと思う。set_entryとpush_argsの合成関数だと思う。
push_node :: Instrid Nr_args -> Instruction push_node entry nr_args = f where f (as,bs,cs,gs,ds,pc,ps,io) = (as`,bs,cs,gs`,ds,pc,ps,io) where gs` = gs_update nodeid (n_setentry entry) gs as` = as_pushn args as args = n_nargs (gs_get nodeid gs) nr_args arity arity = nr_args nodeid = as_get 0 as