Skip to content

Instantly share code, notes, and snippets.

@CosmicToast
Created June 4, 2023 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CosmicToast/a620f7ed40fbac87e2d4d3ed4fab892f to your computer and use it in GitHub Desktop.
Save CosmicToast/a620f7ed40fbac87e2d4d3ed4fab892f to your computer and use it in GitHub Desktop.
Proof of concept PHP-style templating mode for Janet
(def- opener "<?janet")
(def- closer "?>")
(def- file ~{:main (some (+ :code :text))
:text '(to (+ ,opener -1))
:code (/ :code* ,parse-all)
:code* (* ,opener '(to ,closer) ,closer)})
(defn template-string
[s]
(def out @"")
(def env (make-env))
(put env :out out)
(def mch (peg/match file s))
(each v mch
(if (array? v)
(do (def fib (fiber/new (fn [] ((compile v env))) :a))
(fiber/setenv fib env)
(resume fib))
(buffer/push out v)))
out)
# example
(print (template-string ```
before
<?janet (def bye "bye") (prin "hi") ?>
middle
<?janet (prin bye) ?>
after
```))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment