352 - 'interpolate' as a poor man's printf
This commit is contained in:
parent
c84ae38bbe
commit
6507c17556
73
mu.arc
73
mu.arc
|
@ -1148,6 +1148,79 @@
|
||||||
}
|
}
|
||||||
(reply (result string-address)))
|
(reply (result string-address)))
|
||||||
|
|
||||||
|
; replace underscores in first with remaining args
|
||||||
|
(init-fn interpolate ; string-address template, string-address a
|
||||||
|
((default-scope scope-address) <- new (scope literal) (30 literal))
|
||||||
|
; result-len = template.length + a.length - 1 (we'll the '_')
|
||||||
|
((template string-address) <- arg)
|
||||||
|
((tem-len integer) <- len (template string-address deref))
|
||||||
|
((a string-address) <- arg)
|
||||||
|
((a-len integer) <- len (a string-address deref))
|
||||||
|
((result-len integer) <- add (tem-len integer) (a-len integer))
|
||||||
|
((result-len integer) <- sub (result-len integer) (1 literal))
|
||||||
|
; result = new string[result-len]
|
||||||
|
((result string-address) <- new (string literal) (result-len integer))
|
||||||
|
; result-idx = i = 0
|
||||||
|
((result-idx integer) <- copy (0 literal))
|
||||||
|
((i integer) <- copy (0 literal))
|
||||||
|
{ begin
|
||||||
|
; copy template into result until '_'
|
||||||
|
{ begin
|
||||||
|
; while (i < template.length)
|
||||||
|
((tem-done? boolean) <- lt (i integer) (tem-len integer))
|
||||||
|
(break-unless (tem-done? boolean) (2 blocks))
|
||||||
|
; while template[i] != '_'
|
||||||
|
((in byte) <- index (template string-address deref) (i integer))
|
||||||
|
((underscore? boolean) <- eq (in byte) (#\_ literal))
|
||||||
|
(break-if (underscore? boolean))
|
||||||
|
; result[result-idx] = template[i]
|
||||||
|
((out byte-address) <- index-address (result string-address deref) (result-idx integer))
|
||||||
|
((out byte-address deref) <- copy (in byte))
|
||||||
|
; ++i
|
||||||
|
((i integer) <- add (i integer) (1 literal))
|
||||||
|
; ++result-idx
|
||||||
|
((result-idx integer) <- add (result-idx integer) (1 literal))
|
||||||
|
(loop)
|
||||||
|
}
|
||||||
|
;? (print-primitive ("i now: " literal))
|
||||||
|
;? (print-primitive (i integer))
|
||||||
|
;? (print-primitive ("\n" literal))
|
||||||
|
; copy 'a' into result
|
||||||
|
((j integer) <- copy (0 literal))
|
||||||
|
{ begin
|
||||||
|
; while (j < a.length)
|
||||||
|
((arg-done? boolean) <- lt (j integer) (a-len integer))
|
||||||
|
(break-unless (arg-done? boolean))
|
||||||
|
; result[result-idx] = a[j]
|
||||||
|
((in byte) <- index (a string-address deref) (j integer))
|
||||||
|
((out byte-address) <- index-address (result string-address deref) (result-idx integer))
|
||||||
|
((out byte-address deref) <- copy (in byte))
|
||||||
|
; ++j
|
||||||
|
((j integer) <- add (j integer) (1 literal))
|
||||||
|
; ++result-idx
|
||||||
|
((result-idx integer) <- add (result-idx integer) (1 literal))
|
||||||
|
(loop)
|
||||||
|
}
|
||||||
|
; skip '_' in template
|
||||||
|
((i integer) <- add (i integer) (1 literal))
|
||||||
|
; copy rest of template into result
|
||||||
|
{ begin
|
||||||
|
; while (i < template.length)
|
||||||
|
((tem-done? boolean) <- lt (i integer) (tem-len integer))
|
||||||
|
(break-unless (tem-done? boolean))
|
||||||
|
; result[result-idx] = template[i]
|
||||||
|
((in byte) <- index (template string-address deref) (i integer))
|
||||||
|
((out byte-address) <- index-address (result string-address deref) (result-idx integer))
|
||||||
|
((out byte-address deref) <- copy (in byte))
|
||||||
|
; ++i
|
||||||
|
((i integer) <- add (i integer) (1 literal))
|
||||||
|
; ++result-idx
|
||||||
|
((result-idx integer) <- add (result-idx integer) (1 literal))
|
||||||
|
(loop)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(reply (result string-address)))
|
||||||
|
|
||||||
(def canon (table)
|
(def canon (table)
|
||||||
(sort (compare < [tostring (prn:car _)]) (as cons table)))
|
(sort (compare < [tostring (prn:car _)]) (as cons table)))
|
||||||
|
|
||||||
|
|
103
mu.arc.t
103
mu.arc.t
|
@ -3032,10 +3032,12 @@
|
||||||
|
|
||||||
; helper
|
; helper
|
||||||
(def memory-contains (addr value)
|
(def memory-contains (addr value)
|
||||||
(and (is memory*.addr len.value)
|
;? (prn "Looking for @value starting at @addr")
|
||||||
|
(and (>= memory*.addr len.value)
|
||||||
(loop (addr (+ addr 1)
|
(loop (addr (+ addr 1)
|
||||||
idx 0)
|
idx 0)
|
||||||
(if (> addr len.value)
|
;? ;? (prn "comparing @memory*.addr and @value.idx")
|
||||||
|
(if (>= idx len.value)
|
||||||
t
|
t
|
||||||
(~is memory*.addr value.idx)
|
(~is memory*.addr value.idx)
|
||||||
(do1 nil
|
(do1 nil
|
||||||
|
@ -3058,4 +3060,101 @@
|
||||||
(if (~memory-contains memory*.3 "hello, world!")
|
(if (~memory-contains memory*.3 "hello, world!")
|
||||||
(prn "F - 'strcat' concatenates strings"))
|
(prn "F - 'strcat' concatenates strings"))
|
||||||
|
|
||||||
|
(reset)
|
||||||
|
(new-trace "interpolate")
|
||||||
|
(add-code '((def main [
|
||||||
|
((1 string-address) <- new "hello, _!")
|
||||||
|
((2 string-address) <- new "abc")
|
||||||
|
((3 string-address) <- interpolate (1 string-address) (2 string-address))
|
||||||
|
])))
|
||||||
|
;? (= dump-trace* (obj whitelist '("run")))
|
||||||
|
(run 'main)
|
||||||
|
;? (prn memory*.1 " " memory*.2 " " memory*.3)
|
||||||
|
;? (prn (memory* memory*.3))
|
||||||
|
;? (prn (memory* (+ memory*.3 1)))
|
||||||
|
;? (prn (memory* (+ memory*.3 2)))
|
||||||
|
;? (prn (memory* (+ memory*.3 3)))
|
||||||
|
;? (prn (memory* (+ memory*.3 4)))
|
||||||
|
;? (prn (memory* (+ memory*.3 5)))
|
||||||
|
;? (prn (memory* (+ memory*.3 6)))
|
||||||
|
;? (prn (memory* (+ memory*.3 7)))
|
||||||
|
;? (prn (memory* (+ memory*.3 8)))
|
||||||
|
;? (prn (memory* (+ memory*.3 9)))
|
||||||
|
;? (prn (memory* (+ memory*.3 10)))
|
||||||
|
;? (prn (memory* (+ memory*.3 11)))
|
||||||
|
(if (~memory-contains memory*.3 "hello, abc!")
|
||||||
|
(prn "F - 'interpolate' splices strings"))
|
||||||
|
|
||||||
|
(reset)
|
||||||
|
(new-trace "interpolate-empty")
|
||||||
|
(add-code '((def main [
|
||||||
|
((1 string-address) <- new "hello!")
|
||||||
|
((2 string-address) <- new "abc")
|
||||||
|
((3 string-address) <- interpolate (1 string-address) (2 string-address))
|
||||||
|
])))
|
||||||
|
;? (= dump-trace* (obj whitelist '("run")))
|
||||||
|
(run 'main)
|
||||||
|
;? (prn (memory* memory*.3))
|
||||||
|
;? (prn (memory* (+ memory*.3 1)))
|
||||||
|
;? (prn (memory* (+ memory*.3 2)))
|
||||||
|
;? (prn (memory* (+ memory*.3 3)))
|
||||||
|
;? (prn (memory* (+ memory*.3 4)))
|
||||||
|
;? (prn (memory* (+ memory*.3 5)))
|
||||||
|
;? (prn (memory* (+ memory*.3 6)))
|
||||||
|
;? (prn (memory* (+ memory*.3 7)))
|
||||||
|
;? (prn (memory* (+ memory*.3 8)))
|
||||||
|
;? (prn (memory* (+ memory*.3 9)))
|
||||||
|
;? (prn (memory* (+ memory*.3 10)))
|
||||||
|
;? (prn (memory* (+ memory*.3 11)))
|
||||||
|
(if (~memory-contains memory*.3 "hello!")
|
||||||
|
(prn "F - 'interpolate' without underscore returns template"))
|
||||||
|
|
||||||
|
(reset)
|
||||||
|
(new-trace "interpolate-at-start")
|
||||||
|
(add-code '((def main [
|
||||||
|
((1 string-address) <- new "_, hello!")
|
||||||
|
((2 string-address) <- new "abc")
|
||||||
|
((3 string-address) <- interpolate (1 string-address) (2 string-address))
|
||||||
|
])))
|
||||||
|
;? (= dump-trace* (obj whitelist '("run")))
|
||||||
|
(run 'main)
|
||||||
|
;? (prn (memory* memory*.3))
|
||||||
|
;? (prn (memory* (+ memory*.3 1)))
|
||||||
|
;? (prn (memory* (+ memory*.3 2)))
|
||||||
|
;? (prn (memory* (+ memory*.3 3)))
|
||||||
|
;? (prn (memory* (+ memory*.3 4)))
|
||||||
|
;? (prn (memory* (+ memory*.3 5)))
|
||||||
|
;? (prn (memory* (+ memory*.3 6)))
|
||||||
|
;? (prn (memory* (+ memory*.3 7)))
|
||||||
|
;? (prn (memory* (+ memory*.3 8)))
|
||||||
|
;? (prn (memory* (+ memory*.3 9)))
|
||||||
|
;? (prn (memory* (+ memory*.3 10)))
|
||||||
|
;? (prn (memory* (+ memory*.3 11)))
|
||||||
|
(if (~memory-contains memory*.3 "abc, hello")
|
||||||
|
(prn "F - 'interpolate' splices strings at start"))
|
||||||
|
|
||||||
|
(reset)
|
||||||
|
(new-trace "interpolate-at-end")
|
||||||
|
(add-code '((def main [
|
||||||
|
((1 string-address) <- new "hello, _")
|
||||||
|
((2 string-address) <- new "abc")
|
||||||
|
((3 string-address) <- interpolate (1 string-address) (2 string-address))
|
||||||
|
])))
|
||||||
|
;? (= dump-trace* (obj whitelist '("run")))
|
||||||
|
(run 'main)
|
||||||
|
;? (prn (memory* memory*.3))
|
||||||
|
;? (prn (memory* (+ memory*.3 1)))
|
||||||
|
;? (prn (memory* (+ memory*.3 2)))
|
||||||
|
;? (prn (memory* (+ memory*.3 3)))
|
||||||
|
;? (prn (memory* (+ memory*.3 4)))
|
||||||
|
;? (prn (memory* (+ memory*.3 5)))
|
||||||
|
;? (prn (memory* (+ memory*.3 6)))
|
||||||
|
;? (prn (memory* (+ memory*.3 7)))
|
||||||
|
;? (prn (memory* (+ memory*.3 8)))
|
||||||
|
;? (prn (memory* (+ memory*.3 9)))
|
||||||
|
;? (prn (memory* (+ memory*.3 10)))
|
||||||
|
;? (prn (memory* (+ memory*.3 11)))
|
||||||
|
(if (~memory-contains memory*.3 "hello, abc")
|
||||||
|
(prn "F - 'interpolate' splices strings at start"))
|
||||||
|
|
||||||
(reset) ; end file with this to persist the trace for the final test
|
(reset) ; end file with this to persist the trace for the final test
|
||||||
|
|
Loading…
Reference in New Issue