(in-package txt2web) (defvar *delivered* nil) (defun src-file (filename) (uiop/pathname:merge-pathnames* filename (asdf:system-source-directory :txt2web))) (defun read-progn-from-string (string) `(progn ,@(read-code-from-string string))) (defun read-code-from-string (string) (with-input-from-string (in string) (let ((*package* *package*)) (loop :for form := (read in nil :eof) :until (eq form :eof) :when (eq (first form) 'cl:in-package) :do (setf *package* (find-package (second form))) :else :collect form)))) (defun load-src (filename) (alexandria:read-file-into-string (src-file filename) :external-format :utf-8)) ;;;; For testing (defvar *dont-expand* '(setf)) (defun should-expand (form) (cond ((not (listp form)) nil) ((listp (car form)) t) ((member (car form) *dont-expand*) nil) ((not (symbolp (car form))) nil) ((not (eq (symbol-package (car form)) (find-package :parenscript))) t))) (defun ps-macroexpand-all (form) (if (should-expand form) (let ((form (ps::ps-macroexpand form))) (if (listp form) (mapcar #'ps-macroexpand-all form) form)) form))