;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; OTHER STUFF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; get list of all goal files (asm-file "goal_src/build/all_files.gc") ;; tell compiler about stuff defined/implemented in the runtime. (asm-file "goal_src/kernel-defs.gc") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; BUILD SYSTEM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; compile, color, and save a file (defmacro m (file) `(asm-file ,file :color :write) ) ;; compile, color, load and save a file (defmacro ml (file) `(asm-file ,file :color :load :write) ) (desfun make-build-command (file) `(asm-file ,file :color :write) ) (defmacro build-game () `(begin ,@(apply make-build-command all-goal-files) (build-dgos "goal_src/build/dgos.txt") ) ) (defmacro e () `(:exit) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; CONDITIONAL COMPILATION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defmacro #when (clause &rest body) `(#cond (,clause ,@body)) ) (defmacro #unless (clause &rest body) `(#cond ((not ,clause) ,@body)) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; TARGET CONTROL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defmacro lt (&rest args) ;; shortcut for listen-to-target. also sends a :status command to make sure ;; all buffers on the target are flushed. `(begin (listen-to-target ,@args) (:status) ) ) (defmacro r (&rest args) ;; shortcut to completely reset the target and connect, regardless of current state `(begin ;; connect, so we can send reset. if we're already connected, does nothing (listen-to-target ,@args) ;; send a reset message, disconnecting us (reset-target) ;; establish connection again (listen-to-target ,@args) ;; flush buffers (:status) ) ) ;;;;;;;;;;;;;;;;;;; ;; GOAL Syntax ;;;;;;;;;;;;;;;;;;; ;; Bind vars in body (defmacro let (bindings &rest body) `((lambda :inline-only #t ,(apply first bindings) ,@body) ,@(apply second bindings))) ;; Let, but recursive, allowing you to define variables in terms of others. (defmacro let* (bindings &rest body) (if (null? bindings) `(begin ,@body) `((lambda :inline-only #t (,(caar bindings)) (let* ,(cdr bindings) ,@body)) ,(car (cdar bindings)) ) ) ) ;; Define a new function (defmacro defun (name bindings &rest body) (if (and (> (length body) 1) ;; more than one thing in function (string? (first body)) ;; first thing is a string ) ;; then it's a docstring and we ignore it. `(define ,name (lambda :name ,name ,bindings ,@(cdr body))) ;; otherwise don't ignore it. `(define ,name (lambda :name ,name ,bindings ,@body)) ) )