Add support for negative integers
This commit is contained in:
@@ -88,10 +88,10 @@
|
|||||||
(concat (lambda args (cond ((equal? (length args) 0) (list))
|
(concat (lambda args (cond ((equal? (length args) 0) (list))
|
||||||
((list? (list-ref args 0)) (apply append args))
|
((list? (list-ref args 0)) (apply append args))
|
||||||
((string? (list-ref args 0)) (apply conc args))
|
((string? (list-ref args 0)) (apply conc args))
|
||||||
(true (error "bad value to concat")))))
|
(#t (begin (print "the bad concat is " args) (error "bad value to concat"))))))
|
||||||
(len (lambda (x) (cond ((list? x) (length x))
|
(len (lambda (x) (cond ((list? x) (length x))
|
||||||
((string? x) (string-length x))
|
((string? x) (string-length x))
|
||||||
(true (error "bad value to len")))))
|
(#t (begin (print "the bad len is " x) (error "bad value to len"))))))
|
||||||
(idx (lambda (x i) (list-ref x (mif (< i 0) (+ i (len x)) i))))
|
(idx (lambda (x i) (list-ref x (mif (< i 0) (+ i (len x)) i))))
|
||||||
(false #f)
|
(false #f)
|
||||||
(true #t)
|
(true #t)
|
||||||
@@ -885,6 +885,7 @@
|
|||||||
((= op 'i64.rem_s) (array #x81))
|
((= op 'i64.rem_s) (array #x81))
|
||||||
((= op 'i64.rem_u) (array #x82))
|
((= op 'i64.rem_u) (array #x82))
|
||||||
((= op 'i64.and) (array #x83))
|
((= op 'i64.and) (array #x83))
|
||||||
|
((= op 'i64.shr_s) (array #x87))
|
||||||
((= op 'i64.shr_u) (array #x88))
|
((= op 'i64.shr_u) (array #x88))
|
||||||
|
|
||||||
((= op 'i32.wrap_i64) (array #xA7))
|
((= op 'i32.wrap_i64) (array #xA7))
|
||||||
@@ -1104,6 +1105,7 @@
|
|||||||
(memory.grow (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'memory.grow))))))
|
(memory.grow (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'memory.grow))))))
|
||||||
(i32.shl (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i32.shl))))))
|
(i32.shl (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i32.shl))))))
|
||||||
(i32.shr_u (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i32.shr_u))))))
|
(i32.shr_u (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i32.shr_u))))))
|
||||||
|
(i64.shr_s (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i64.shr_s))))))
|
||||||
(i64.shr_u (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i64.shr_u))))))
|
(i64.shr_u (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i64.shr_u))))))
|
||||||
|
|
||||||
(i32.wrap_i64 (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i32.wrap_i64))))))
|
(i32.wrap_i64 (lambda flatten (concat (apply concat flatten) (array (lambda (name_dict) (array 'i32.wrap_i64))))))
|
||||||
@@ -1244,7 +1246,16 @@
|
|||||||
((true_loc true_length datasi) (alloc_data "true" datasi))
|
((true_loc true_length datasi) (alloc_data "true" datasi))
|
||||||
((false_loc false_length datasi) (alloc_data "false" datasi))
|
((false_loc false_length datasi) (alloc_data "false" datasi))
|
||||||
(int_digits (func '$int_digits '(param $int i64) '(result i32) '(local $tmp i32)
|
(int_digits (func '$int_digits '(param $int i64) '(result i32) '(local $tmp i32)
|
||||||
|
(_if '$is_neg
|
||||||
|
(i64.lt_s (local.get '$int) (i64.const 0))
|
||||||
|
(then
|
||||||
|
(local.set '$int (i64.sub (i64.const 0) (local.get '$int)))
|
||||||
|
(local.set '$tmp (i32.const 2))
|
||||||
|
)
|
||||||
|
(else
|
||||||
(local.set '$tmp (i32.const 1))
|
(local.set '$tmp (i32.const 1))
|
||||||
|
)
|
||||||
|
)
|
||||||
(block '$b
|
(block '$b
|
||||||
(_loop '$l
|
(_loop '$l
|
||||||
(br_if '$b (i64.le_u (local.get '$int) (i64.const 9)))
|
(br_if '$b (i64.le_u (local.get '$int) (i64.const 9)))
|
||||||
@@ -1273,7 +1284,7 @@
|
|||||||
))
|
))
|
||||||
(else
|
(else
|
||||||
;; default is int
|
;; default is int
|
||||||
(call '$int_digits (i64.shr_u (local.get '$to_str_len) (i64.const 1)))
|
(call '$int_digits (i64.shr_s (local.get '$to_str_len) (i64.const 1)))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -1318,10 +1329,18 @@
|
|||||||
))
|
))
|
||||||
(else
|
(else
|
||||||
;; default is int
|
;; default is int
|
||||||
(local.set '$to_str (i64.shr_u (local.get '$to_str) (i64.const 1)))
|
(local.set '$to_str (i64.shr_s (local.get '$to_str) (i64.const 1)))
|
||||||
(local.set '$len_tmp (call '$int_digits (local.get '$to_str)))
|
(local.set '$len_tmp (call '$int_digits (local.get '$to_str)))
|
||||||
(local.set '$buf_tmp (i32.add (local.get '$buf) (local.get '$len_tmp)))
|
(local.set '$buf_tmp (i32.add (local.get '$buf) (local.get '$len_tmp)))
|
||||||
|
|
||||||
|
(_if '$is_neg
|
||||||
|
(i64.lt_s (local.get '$to_str) (i64.const 0))
|
||||||
|
(then
|
||||||
|
(local.set '$to_str (i64.sub (i64.const 0) (local.get '$to_str)))
|
||||||
|
(i64.store8 (local.get '$buf) (i64.const #x2D))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
(block '$b
|
(block '$b
|
||||||
(_loop '$l
|
(_loop '$l
|
||||||
(local.set '$buf_tmp (i32.sub (local.get '$buf_tmp) (i32.const 1)))
|
(local.set '$buf_tmp (i32.sub (local.get '$buf_tmp) (i32.const 1)))
|
||||||
@@ -1587,7 +1606,7 @@
|
|||||||
(export "memory" '(memory $mem))
|
(export "memory" '(memory $mem))
|
||||||
(export "_start" '(func $start))
|
(export "_start" '(func $start))
|
||||||
)))
|
)))
|
||||||
(output3 (compile (partial_eval (read-string "(+ 1337 (+ 1 2))"))))
|
(output3 (compile (partial_eval (read-string "(+ 1 1337 (+ 1 2))"))))
|
||||||
;(output3 (compile (partial_eval (read-string "\"hello world\""))))
|
;(output3 (compile (partial_eval (read-string "\"hello world\""))))
|
||||||
;(output3 (compile (partial_eval (read-string "((vau (x) x) asdf)"))))
|
;(output3 (compile (partial_eval (read-string "((vau (x) x) asdf)"))))
|
||||||
(_ (print "to out " output3))
|
(_ (print "to out " output3))
|
||||||
|
|||||||
Reference in New Issue
Block a user