Plaster

common-lisp
(defmacro write-to-file (file function) " writes the result of evaluating function to file " (let ((x (gensym))) `(let ((x (quote ,(funcall function)))) (with-open-file (stream (javascript-file-pathname ,file) :direction :output :if-exists :overwrite :if-does-not-exist :create) (eval`(ps-to-stream ,stream ,x)))))) (defun add-onclick () `(let ((form (chain document (onclick "#register")))) (chain (chain document (get-Element-By-Id "#register-submit")) (add-event-listener "click" (function (chain form (submit))))))) ;;;macroexpansion (LET ((X '(LET ((FORM (CHAIN DOCUMENT (ONCLICK "#register")))) (CHAIN (CHAIN DOCUMENT (GET-ELEMENT-BY-ID "#register-submit")) (ADD-EVENT-LISTENER "click" #'(CHAIN FORM (SUBMIT))))))) (WITH-OPEN-FILE (STREAM (JAVASCRIPT-FILE-PATHNAME "submit-register") :DIRECTION :OUTPUT :IF-EXISTS :OVERWRITE :IF-DOES-NOT-EXIST :CREATE) (EVAL `(PS-TO-STREAM ,STREAM ,X)))) ;;;;result MY-SITE> (write-to-file "submit-register" add-onclick) "(function () { var form = document.onclick('#register'); return document.getElementById('#register-submit').addEventListener('click', form.submit()); })();" ;;;;that gets written to a file called submit-register.js