Skip to content

Instantly share code, notes, and snippets.

@dominictarr
Last active June 27, 2024 09:14
Show Gist options
  • Save dominictarr/2ca7a42a0425db68ab4398e808c5143a to your computer and use it in GitHub Desktop.
Save dominictarr/2ca7a42a0425db68ab4398e808c5143a to your computer and use it in GitHub Desktop.

parse the things HELLO WORLD or HELLO THERE with any number of ! at the end. returns the number of characters matched, if it was a match, or zero.

how to run (clone https://github.com/dominictarr/acidlisp)

> node load.js parse.al > parse.wat
> wat2wasm parse.wat #outputs parse.wasm
> node run.js parse.wasm "HELLO WORLD"
11
> node run.js parse.wasm "HELLO THERE"
11
> node run.js parse.wasm "HELLO THAR"
-1
> node run.js parse.wasm "HELLO THERE!!!"
14
(module
(def strings (import "./strings"))
(def _match (mac R (str i) (block
(def len (strings.length str))
(if (eq i (sub len 1))
&(if (eq (strings.at input (add start $i)) $(strings.at str i)) len -1)
&(if (eq (strings.at input (add start $i)) $(strings.at str i))
(R $str $(add 1 i)) -1)
)
)))
(def Match (mac (str) (list _match str 0)))
(def Or (mac (a b)
&(if (neq -1 (def m $a)) m (if (neq -1 (def m $b)) m -1))
))
(def And [mac (a b)
&{block
(def _start start) ;;_start will be made hygenic
(if
(neq -1 (def m1 $a))
[block
(set start (add _start m1))
(if
(neq -1 (def m2 $b))
(add m1 m2)
(block (set start _start) -1)
)
]
(block (set start _start) -1)
)
}
])
(def Many [mac (a) &{block
(def m2 0)
(loop (neq -1 (def m $a))
(block
(set start (add start m))
(set m2 (add m2 m))
)
)
}])
(def More [mac (a) &{block (And $a (Many $a)) }])
;;returns the number of characters matched.
;;HELLO THERE => 11
;;HELLO WORLD => 11
;;HELLO WORLD! => 12
;;HELLO WORLD!! => 13
;;HELLO WORL => -1
(def hello_world (fun (input start)
(And
(Match "HELLO ")
(Or (Match "THERE") (Match "WORLD"))
(Many (Match "!")))))
;; if i could automatically convert strings,
;; and supported variable args somehow...
;; (And "HELLO " (Or "THERE" "WORLD") (Many "!"))
)
(def hello_world (fun (input start)
(And
(Match "HELLO ")
(Or (Match "THERE") (Match "WORLD"))
(Many (Match "!")))))
(And "HELLO " (Or "THERE" "WORLD") (Many "!"))
)
(export hello_world)
)
(module (memory (export "memory")
1)
(global $FREE (mut i32) (i32.const 0))
(data 0
(offset (i32.const 0))
"\t\00\00\00./strings\06\00\00\00HELLO \05\00\00\00THERE\05\00\00\00WORLD\01\00\00\00!\08\00\00\00./memory")
(func $fun__0
(param $input i32) (param $start i32) (result i32)
(local $_start__3 i32)
(local $1 i32)
(local $5 i32)
(local $3 i32)
(local $m1__4 i32)
(local $_start__6 i32)
(local $9 i32)
(local $7 i32)
(local $m__9 i32)
(local $m__10 i32)
(local $m1__7 i32)
(local $m2__11 i32)
(local $m__12 i32)
(local $2 i32)
(local $m2__8 i32)
(local $m2__5 i32)
(local.set $_start__3 (local.get $start))
(if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 72))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 1)))))
(i32.const 69))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 2)))))
(i32.const 76))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 3)))))
(i32.const 76))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 4)))))
(i32.const 79))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 5)))))
(i32.const 32))
(then (local.set $1 (i32.const 6)))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))
)
)
(else (local.set $1 (i32.const -1)))
)
(local.set $5 (local.get $1))
)
(else (local.set $5 (i32.const -1)))
)
(local.set $3 (local.tee $m1__4 (local.get $5)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then (local.set
$start (i32.add (local.get $_start__3) (local.get $m1__4)))
(local.set $_start__6 (local.get $start))
(if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 84))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 1)))))
(i32.const 72))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 2)))))
(i32.const 69))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 3)))))
(i32.const 82))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 4)))))
(i32.const 69))
(then (local.set $1 (i32.const 5)))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))
)
(local.set $9 (local.get $1))
)
(else (local.set $9 (i32.const -1)))
)
(local.set $7 (local.tee $m__9 (local.get $9)))
(if
(i32.ne (i32.const -1) (local.get $7))
(then (local.set $5 (local.get $m__9)))
(else (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 87))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 1)))))
(i32.const 79))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 2)))))
(i32.const 82))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 3)))))
(i32.const 76))
(then (if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 4)))))
(i32.const 68))
(then (local.set $1 (i32.const 5)))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))))
(else (local.set $1 (i32.const -1)))
)
(local.set $5 (local.get $1))
)
(else (local.set $5 (i32.const -1)))
)
(local.set $3 (local.tee $m__10 (local.get $5)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then (local.set $1 (local.get $m__10)))
(else (local.set $1 (i32.const -1))))
(local.set $5 (local.get $1))
)
)
(local.set $3 (local.tee $m1__7 (local.get $5)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then (local.set
$start (i32.add (local.get $_start__6) (local.get $m1__7)))
(local.set $m2__11 (i32.const 0))
(loop
(if (i32.eq
(i32.load8_u (i32.add (i32.const 4)
(i32.add (local.get $input)
(i32.add (local.get $start) (i32.const 0)))))
(i32.const 33))
(then (local.set $5 (i32.const 1)))
(else (local.set $5 (i32.const -1))))
(local.set $3 (local.tee $m__12 (local.get $5)))
(if (i32.ne (i32.const -1) (local.get $3))(then
(local.set
$start (i32.add (local.get $start) (local.get $m__12)))
(local.tee $2
(local.tee
$m2__11 (i32.add (local.get $m2__11) (local.get $m__12)))) (br 1))))
(local.set $3 (local.tee $m2__8 (local.get $2)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then
(local.set $1 (i32.add (local.get $m1__7) (local.get $m2__8))))
(else
(local.set $start (local.get $_start__6))
(local.set $1 (i32.const -1))))
)
(else
(local.set $start (local.get $_start__6))
(local.set $1 (i32.const -1)))
)
(local.set $3 (local.tee $m2__5 (local.get $1)))
(if
(i32.ne (i32.const -1) (local.get $3))
(then
(local.set $1 (i32.add (local.get $m1__4) (local.get $m2__5))))
(else
(local.set $start (local.get $_start__3))
(local.set $1 (i32.const -1))))
)
(else
(local.set $start (local.get $_start__3))
(local.set $1 (i32.const -1)))
)
(local.get $1)
)
(export "main" (func $fun__0))
)
@manslie3
Copy link

The amino acids found in caviar are in a highly digestible form, making it an efficient source of this vital nutrient https://caviarprice.io/. For individuals looking to increase their protein intake without consuming large amounts of meat, caviar can be an excellent alternative.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment