💾 Archived View for idiomdrottning.org › acetone captured on 2023-07-10 at 13:42:37. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2023-03-20)
-=-=-=-=-=-=-
Acetone is a parser for Chicken Scheme that helps you turn lists into trees.
Acetone contains one procedure, parse, that works like a map-in-order:
(parse add1 '(0 1 2)) ⇒ (1 2 3)
Except it can also handle multiple values, or zero:
(parse (fn (when (even? x) (values x x))) '(0 1 2 3)) ⇒ (0 0 2 2)
It can also insert parentheses by using the keywords #:open and #:close like this:
(parse (fn (cond ((zero? (modulo x 3)) (values #:open x)) ((= 2 (modulo x 3)) (values x #:close)) (else x))) (iota 8)) ⇒ ((0 1 2) (3 4 5) (6 7))
So once you have your lists of tokens (you get that from a lexer, which means something like string-split or read-lines), you can use parse with a procedure you write that transforms the tokens and adds structure with #:open and #:close.
This also works which is sometimes useful:
((parse add1) (iota 3)) ⇒ (1 2 3)
No problem, just use side-effects! Keep track of state separately, with parameters, call-tables, or closures.
Moving things down is no problem, just stash them in separate state and grab them back when you need them.
Moving things up requires separate passes. Go through it once, yank out and collect everything you want to move up (in a call-table for example), and then go through it again and put it in where it belongs.
git clone https://idiomdrottning.org/acetone