(in-package txt2web.api) (defpsmacro with-call-args (args &body body) `(progn (init-args ,args) ,@body (get-result))) (defpsmacro with-frame (&body body) `(progn (push-local-frame) (unwind-protect ,@body (pop-local-frame)))) (defpsmacro href-call (func &rest args) `(+ "javascript:" (inline-call ,func ,@args))) (defpsmacro inline-call (func &rest args) `(+ ',func "(\"" ,(first args) ,@(loop :for arg :in (cdr args) :collect "\", \"" :collect arg) "\");")) (defpsmacro with-sleep ((resume-func) &body body) `(new (*promise (lambda (resolve) (start-sleeping) (let ((,resume-func (lambda () (finish-sleeping) (resolve))))) ,@body)))) (defvar *serv-vars* nil) (defpsmacro define-serv-var (name (value &optional index) &body body) (setf name (string-upcase (symbol-name name))) (pushnew name *serv-vars* :test #'equal) `(setf (getprop serv-vars ,name) (create :name ,name :body (lambda (,value ,@(when index (list index))) ,@body))))