Work in progress here.
Meanwhile,
length l is if ~#l then 0 else 1+length 1 _ l;
length 1 2 3
3
fac n is if n=0 then 1 else n*fac n-1
fac 5
120
The execution-tree:
fac
({@}
`Y
({@}
({@}
({@}
`B_
({@}
`S
({@}
({@}
({@};`C_;{?})
({@}
({@}
`C
({@};{:};=))
0))
1)))
({@}
`S
({@};{:};*)))
({@}
({@};`C;`B)
({@}
({@}
`C
({@};{:};-))
1))))
i.e.,
disp fac
+---------------¯---------------+
¦ ¦
`Y +-----------¯-----------+
¦ ¦
+-----------¯------------+ +---¯----+
¦ ¦ ¦ ¦
+----¯-----+ +-¯-+ +¯+ +-¯--+
¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦
`B_ +------¯-------+ `S +¯+ `C `B +-¯-+ 1
¦ ¦ ¦ ¦ ¦ ¦
`S +----¯-----+ :: * `C +¯+
¦ ¦ ¦ ¦
+----¯-----+ 1 :: -
¦ ¦
+-¯-+ +-¯--+
¦ ¦ ¦ ¦
`C_ cond +-¯-+ 0
¦ ¦
`C +¯+
¦ ¦
:: =
The execution-trace:
[] `Y(`B_(`S(`C_ cond(`C(=)0)1))(`S(*))(`C
[] `C(=)0 5
[] 5
5 []
[] 0
0 []
0 []
[] 5
5 []
[] `C `B(`C(-)1)(`Y(`B_(`S(`C_ cond(`C(=)0
[] `C(=)0(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 0
0 []
0 []
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] `C `B(`C(-)1)(`Y(`B_(`S(`C_ cond(`C(=)0
[] `C(=)0(`C(-)1(`C(-)1 5))
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] 0
0 []
0 []
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] `C `B(`C(-)1)(`Y(`B_(`S(`C_ cond(`C(=)0
[] `C(=)0(`C(-)1(`C(-)1(`C(-)1 5)))
[] `C(-)1(`C(-)1(`C(-)1 5))
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] 1
1 []
2 []
[] 0
0 []
0 []
[] `C(-)1(`C(-)1(`C(-)1 5))
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] 1
1 []
2 []
[] `C `B(`C(-)1)(`Y(`B_(`S(`C_ cond(`C(=)0
[] `C(=)0(`C(-)1(`C(-)1(`C(-)1(`C(-)1 5)))
[] `C(-)1(`C(-)1(`C(-)1(`C(-)1 5)))
[] `C(-)1(`C(-)1(`C(-)1 5))
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] 1
1 []
2 []
[] 1
1 []
1 []
[] 0
0 []
0 []
[] `C(-)1(`C(-)1(`C(-)1(`C(-)1 5)))
[] `C(-)1(`C(-)1(`C(-)1 5))
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] 1
1 []
2 []
[] 1
1 []
1 []
[] `C `B(`C(-)1)(`Y(`B_(`S(`C_ cond(`C(=)0
[] `C(=)0(`C(-)1(`C(-)1(`C(-)1(`C(-)1(`C(-
[] `C(-)1(`C(-)1(`C(-)1(`C(-)1(`C(-)1 5)))
[] `C(-)1(`C(-)1(`C(-)1(`C(-)1 5)))
[] `C(-)1(`C(-)1(`C(-)1 5))
[] `C(-)1(`C(-)1 5)
[] `C(-)1 5
[] 5
5 []
[] 1
1 []
4 []
[] 1
1 []
3 []
[] 1
1 []
2 []
[] 1
1 []
1 []
[] 1
1 []
0 []
[] 0
0 []
1 []
1 []
1 []
2 []
6 []
24 []
120 []
120