CakeML
flatLang
closLang
BVL
BVI
dataLang
wordLang
stackLang
labLang
Machine code
fun app123 x = let a = [1,2,3] in a ++ x end
app123 [0] = # app123 (0=x)
do MakeSpace 9
1 :≡ Cons nil_tag [] # empty list []
2 :≡ Const 3 # Number 3
3 :≡ Cons cons_tag [2; 1] # 3::[]
4 :≡ Const 2 # Number 2
5 :≡ Cons cons_tag [4; 3] # 2::[3]
6 :≡ Const 1 # Number 1
7 :≡ Cons cons_tag [6; 5] # 1::[2,3]
8 :≡ ListAppend [7; 0] # x ++ [1,2,3]
return 8
size_of_heap s
- At every allocation
- On heap consuming operations
size_of_stack s.stack
- At every function call
- On stack consuming operations
ftail [] = []
ftail (x::xs) = ...
ftail xs
ftail [0] =
# LENGTH x = 0?
do 1 :≡ TagLenEq 0 0 [0];
if_var 1 (return 0) # Nil case, return []
# Cons case
do 2 :≡ ElemAt 0 [0]; # head (x)
3 :≡ ElemAt 1 [0]; # tail (xs)
...
# ftail xs
tailcall_ftail [3]
├────H────┼────C────┤
├─────H─────┼───C───┤
├──────H──────┼──C──┤
├───────H───────┼─C─┤
├────────H────────┼C┤
├─────────H─────────┤
〘[n₁,n₂,...,nₖ]〙= Block ts₁ cons_tag [Number n₁;
Block ts₂ cons_tag [Number n₂;
Block tsᵢ cons_tag [Number nᵢ;
...
Block tsₖ cons_tag [Number nₖ;
Block 0 nil_tag []]]]
ts₁ ∈ seen ==> ts₂ ∈ seen ∧ tsᵢ ∈ seen ∧ ... ∧ tsₖ ∈ seen
ts₂ ∈ seen ==> tsᵢ ∈ seen ∧ ... ∧ tsₖ ∈ seen
∀i. tsᵢ ∈ seen ==> ∀j. i <= j <= k ==> tsⱼ ∈ seen
Block tsᵢ tagᵢ lᵢ ∈ all_blocks s
∧ Block tsⱼ tagⱼ lⱼ ∈ all_blocks s
∧ tsᵢ = tsⱼ
==>
Block tsᵢ tagᵢ lᵢ = Block tsⱼ tagⱼ lⱼ