Extras

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ⱼ