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