💾 Archived View for idiomdrottning.org › the-awesomeness-of-require captured on 2024-05-10 at 11:00:42. Gemini links have been rewritten to link to archived content
⬅️ Previous capture (2024-02-05)
-=-=-=-=-=-=-
I wanted a filter in brev (I mean, a procedure) that if a gemtext snippet matched this format:
a line that ends with a quote: > the second line is a blank line, or it's a quote line => an://url/with a mandatory preceding blank line
it should rewrite that to
=> an://url/with a line that ends with a quote: > the second line is a blank line, or it's a quote line
and if it didn’t match that format, just pass it through unchanged.
I’m running all the entries of my tinylog through it.
Thanks to the fanciest define of all time and its require feature, that was pretty easy.
Require takes two arguments; the first is either a bool or a pred, the second is a value. If the bool is true, or the pred applied to the value is true, then pass through the value. Otherwise backtrack out of the procedure entirely! Through magic time travel♥︎ probably better known as call-with-current-continuation.
First do nothing by default, just pass through all input as it is:
(define (link-linify-source x) x)
Then handle the special case of a string that’s splittable into the pattern we’re looking for.
(define (link-linify-source (= (fn (string-split x "\n" #t)) ((? (strse? ":$") hd) (? (disjoin (like? "") (strse? "^>")) lean) . rest))) (conc (string-intersperse (cons* (conc (string-intersperse (take (string-split (require (strse? "^=> ") (last (butlast rest)))) 2)) " " hd) lean (drop-right (require (< 2 (length rest)) rest) 3)) "\n") "\n"))
If, in the middle of this mess, we notice that the second-to-last line isn’t a link line, we just nope out as if the filter never even matched, thanks to require. Pretty neat♥︎