##// END OF EJS Templates
Fix labels
Fix labels

File last commit:

r28:77d82154 default
r28:77d82154 default
Show More
ps-macros.lisp
163 lines | 3.5 KiB | text/x-common-lisp | CommonLispLexer
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (in-package sugar-qsp.lib)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;;; Parenscript macros which make the parser's intermediate
;;;; representation directly compilable by Parenscript
;;;; Some utility macros for other .ps sources too.
;;; Utils
;;; Common
Removing unnecessary returns
r27 (defpsmacro label-block (() &body body)
Locals
r14 (let ((has-labels (some #'keywordp body)))
`(block nil
,@(when has-labels
Fix labels
r28 '((defvar _labels)))
Removing unnecessary returns
r27 (tagbody
,@body
(void)))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro str (&rest forms)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (cond ((zerop (length forms))
"")
((and (= 1 (length forms))
(stringp (first forms)))
(first forms))
(t
`(& ,@forms))))
;;; 1loc
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro location ((name) &body body)
Menu, game saving
r11 `(setf (root locs ,name)
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (async-lambda (args)
(label-block ()
,@body))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro goto% (target &rest args)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 `(progn
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (goto ,target ,args)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (exit)))
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro xgoto% (target &rest args)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 `(progn
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (xgoto ,target ,args)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (exit)))
;;; 2var
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro qspvar (name index slot)
Properly handle stringly-indexed arrays
r16 `(api-call get-var ,(string name) ,index ,slot))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro set ((var vname vindex vslot) value)
(assert (eq var 'qspvar))
Properly handle stringly-indexed arrays
r16 `(api-call set-var ,(string vname) ,vindex ,vslot ,value))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 3expr
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro <> (op1 op2)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 `(not (equal ,op1 ,op2)))
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro ! (op1 op2)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 `(not (equal ,op1 ,op2)))
;;; 4code
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro exec (&body body)
(format nil "javascript: ~{~A~^~%~}" (mapcar #'ps* body)))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 5arrays
;;; 6str
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro & (&rest args)
`(chain "" (concat ,@args)))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 7if
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro qspcond (&rest clauses)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 `(cond ,@(loop :for clause :in clauses
:collect (list (first clause)
Properly handle stringly-indexed arrays
r16 `(tagbody
,@(rest clause))))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 8sub
;;; 9loops
;;; Yep, that's a huge kludge since Javascript doesn't support arbitrary labels
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro jump (target)
Fix labels
r28 `(return-from label-body
(funcall (getprop _labels ,(string-upcase (second target))))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro tagbody (&body body)
Fix labels
r28 (let ((funcs (list nil "_nil")))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (dolist (form body)
(cond ((keywordp form)
(setf (first funcs) (reverse (first funcs)))
Fix labels
r28 (push (string-upcase form) funcs)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (push nil funcs))
(t
(push form (first funcs)))))
(setf (first funcs) (reverse (first funcs)))
(setf funcs (reverse funcs))
(if (= 2 (length funcs))
`(progn
,@body)
`(progn
Fix labels
r28 (setf ,@(loop :for (label code . rest-labels) :on funcs :by #'cddr
:append `((@ _labels ,label)
(block label-body
(block ,(intern label)
,@code
,@(when rest-labels
`((funcall
(getprop _labels ,(first rest-labels))))))))))
(funcall (getprop _labels "_nil"))))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 10dynamic
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro qspblock (&body body)
`(async-lambda (args)
Properly handle stringly-indexed arrays
r16 (label-block ()
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 ,@body)))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 11main
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro act (name img &body body)
Tutorial game works!
r6 `(api-call add-act ,name ,img
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (async-lambda ()
Properly handle stringly-indexed arrays
r16 (label-block ()
Removing unnecessary returns
r27 ,@body))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1
;;; 12aux
;;; 13diag
;;; 14act
;;; 15objs
;;; 16menu
;;; 17sound
;;; 18img
;;; 19input
;;; 20time
Locals
r14
;;; 21local
FOR loop
r17
;;; 22for
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro qspfor (var from to step &body body)
`((intern "QSPFOR" "API")
,(string (second var)) ,(third var) ;; name and index
,from ,to ,step
(lambda ()
(block nil
,@body
t))))