Implement locals and foldl, which is the direction we should have been folding to not reverse the params/locals anyway
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
|
|
||||||
(let (
|
(let (
|
||||||
|
|
||||||
|
foldl (let (helper (rec-lambda recurse (f z v i) (if (= i (len v)) z
|
||||||
|
(recurse f (f z (idx v i)) v (+ i 1)))))
|
||||||
|
(lambda (f z v) (helper f z v 0)))
|
||||||
foldr (let (helper (rec-lambda recurse (f z v i) (if (= i (len v)) z
|
foldr (let (helper (rec-lambda recurse (f z v i) (if (= i (len v)) z
|
||||||
(f (idx v i) (recurse f z v (+ i 1))))))
|
(f (idx v i) (recurse f z v (+ i 1))))))
|
||||||
(lambda (f z v) (helper f z v 0)))
|
(lambda (f z v) (helper f z v 0)))
|
||||||
@@ -18,6 +21,6 @@
|
|||||||
(recurse (eval [ [vau '_ [(idx (idx dict i) 0)] [ [vau 'inner [] 'inner] ] ] (idx (idx dict i) 1) ] env) dict (+ i 1)))))
|
(recurse (eval [ [vau '_ [(idx (idx dict i) 0)] [ [vau 'inner [] 'inner] ] ] (idx (idx dict i) 1) ] env) dict (+ i 1)))))
|
||||||
(lambda (env dict) (helper env dict 0)))
|
(lambda (env dict) (helper env dict 0)))
|
||||||
)
|
)
|
||||||
(provide foldr empty_dict put get-value add-dict-to-env)
|
(provide foldl foldr empty_dict put get-value add-dict-to-env)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
(local $tmp1 i32)
|
(local $tmp1 i32)
|
||||||
(local $tmp2 i32)
|
(local $tmp2 i32)
|
||||||
(i32.const 11)
|
(i32.const 11)
|
||||||
(local.get $num)
|
(local.get $tmp2)
|
||||||
i32.add
|
i32.add
|
||||||
(i32.add (local.get $num))
|
(i32.add (local.get $num))
|
||||||
)
|
)
|
||||||
|
|||||||
15
wasm.kp
15
wasm.kp
@@ -103,7 +103,7 @@
|
|||||||
(let (
|
(let (
|
||||||
(locals body) x
|
(locals body) x
|
||||||
enc_locals (encode_vector (lambda (loc)
|
enc_locals (encode_vector (lambda (loc)
|
||||||
(concat (encode_u_LEB128 (idx loc 0)) (encode_u_LEB128 (idx loc 1)))) locals)
|
(concat (encode_u_LEB128 (idx loc 0)) (encode_valtype (idx loc 1)))) locals)
|
||||||
enc_expr (concat (flat_map encode_ins body) [0x0B])
|
enc_expr (concat (flat_map encode_ins body) [0x0B])
|
||||||
code_bytes (concat enc_locals enc_expr)
|
code_bytes (concat enc_locals enc_expr)
|
||||||
) (concat (encode_u_LEB128 (len code_bytes)) code_bytes))
|
) (concat (encode_u_LEB128 (len code_bytes)) code_bytes))
|
||||||
@@ -153,11 +153,18 @@
|
|||||||
) 0 nil nil)
|
) 0 nil nil)
|
||||||
result (if (!= 0 (len result)) (idx result 0)
|
result (if (!= 0 (len result)) (idx result 0)
|
||||||
result)
|
result)
|
||||||
_ (if (!= 0 (len locals)) (error "We don't support locals yet!"))
|
|
||||||
_ (println "params " params " result " result " locals " locals " body " body)
|
_ (println "params " params " result " result " locals " locals " body " body)
|
||||||
outer_name_dict (put name_dict name (len function))
|
outer_name_dict (put name_dict name (len function))
|
||||||
(num_params inner_name_dict) (foldr (lambda (x a) [(+ (idx a 0) 1) (put (idx a 1) (idx x 1) (idx a 0))]) [ 0 outer_name_dict ] params)
|
(num_params inner_name_dict) (foldl (lambda (a x) [(+ (idx a 0) 1) (put (idx a 1) (idx x 1) (idx a 0))]) [ 0 outer_name_dict ] params)
|
||||||
|
(num_locals inner_name_dict) (foldl (lambda (a x) [(+ (idx a 0) 1) (put (idx a 1) (idx x 1) (idx a 0))]) [ num_params inner_name_dict ] locals)
|
||||||
_ (println "inner name dict" inner_name_dict)
|
_ (println "inner name dict" inner_name_dict)
|
||||||
|
compressed_locals ((rec-lambda recurse (cur_list cur_typ cur_num i)
|
||||||
|
(cond (and (= i (len locals)) (= 0 cur_num)) cur_list
|
||||||
|
(= i (len locals)) (concat cur_list [ [cur_num cur_typ] ])
|
||||||
|
(= cur_typ (idx (idx locals i) 2)) (recurse cur_list cur_typ (+ 1 cur_num) (+ 1 i))
|
||||||
|
(= nil cur_typ) (recurse cur_list (idx (idx locals i) 2) 1 (+ 1 i))
|
||||||
|
true (recurse (concat cur_list [[cur_num cur_typ]]) (idx (idx locals i) 2) 1 (+ 1 i)))
|
||||||
|
) [] nil 0 0)
|
||||||
inner_env (add-dict-to-env de inner_name_dict)
|
inner_env (add-dict-to-env de inner_name_dict)
|
||||||
our_type [ (map (lambda (x) (idx x 2)) params) (slice result 1 -1) ]
|
our_type [ (map (lambda (x) (idx x 2)) params) (slice result 1 -1) ]
|
||||||
our_code (flat_map (lambda (x) (let (ins (eval x inner_env))
|
our_code (flat_map (lambda (x) (let (ins (eval x inner_env))
|
||||||
@@ -176,7 +183,7 @@
|
|||||||
; export
|
; export
|
||||||
export
|
export
|
||||||
; code
|
; code
|
||||||
(concat code [ [ [] our_code ] ])
|
(concat code [ [ compressed_locals our_code ] ])
|
||||||
])
|
])
|
||||||
))
|
))
|
||||||
i32.const (lambda (const) [['i32.const const]])
|
i32.const (lambda (const) [['i32.const const]])
|
||||||
|
|||||||
Reference in New Issue
Block a user