##// END OF EJS Templates
Fixed saves...
Fixed saves...

File last commit:

r25:4adc2646 default
r26:fd5a11c5 default
Show More
ps-macros.lisp
164 lines | 3.6 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
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (defpsmacro label-block ((&key (locals t)) &body body)
Locals
r14 (let ((has-labels (some #'keywordp body)))
`(block nil
,@(when has-labels
'((defvar __labels)))
Properly handle stringly-indexed arrays
r16 ,@(if locals
Remove cl-uglify-js
r23 `((tagbody
,@body))
Properly handle stringly-indexed arrays
r16 `((tagbody
,@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 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)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 `(return-from ,(intern (string-upcase (second target)))
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (funcall (getprop __labels ,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)
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (let ((funcs (list nil :__nil)))
(dolist (form body)
(cond ((keywordp form)
(setf (first funcs) (reverse (first funcs)))
(push form funcs)
(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
(setf ,@(loop :for f :on funcs :by #'cddr
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 :append `((@ __labels ,(first f))
Properly handle stringly-indexed arrays
r16 (block ,(intern (string-upcase (string (first f))))
,@(second f)
,@(when (third f)
`((funcall
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 (getprop __labels ,(third f)))))))))
100% parser, 100% macros, 50% intrinsics, 10% api, 0% misc
r1 (jump (str "__nil"))))))
;;; 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 ()
Use Parenscript's minifier and obfuscator... and namespaces. SAVES CURRENTLY BROKEN
r25 ,@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))))