aboutsummaryrefslogtreecommitdiff
path: root/entity.scm
diff options
context:
space:
mode:
authorGene Pasquet <dev@etenil.net>2026-04-08 01:57:20 +0100
committerGene Pasquet <dev@etenil.net>2026-04-08 01:57:20 +0100
commit9e8b75f9949259ef01942cd3717b79b044efddf7 (patch)
treec6b71291ade57f0560a9bbf0db9f5b66bab65cb3 /entity.scm
parent84840ede6646ed793b61cdd889d3f57ab05e9311 (diff)
Refactor update pipelines
Diffstat (limited to 'entity.scm')
-rw-r--r--entity.scm27
1 files changed, 22 insertions, 5 deletions
diff --git a/entity.scm b/entity.scm
index e4b3937..891fbde 100644
--- a/entity.scm
+++ b/entity.scm
@@ -38,6 +38,11 @@
;; er-macro-transformer so (rename 'entity-skips-pipeline?) captures the
;; binding from THIS module — works across compiled unit boundaries.
+ ;;
+ ;; Syntax:
+ ;; (define-pipeline (name skip-sym) (entity-formal ...)
+ ;; guard: guard-expr ;; optional — entity returned unchanged when #f
+ ;; body ...)
(define-syntax define-pipeline
(er-macro-transformer
(lambda (form rename _compare)
@@ -46,16 +51,28 @@
(skip (cadr name-skip))
(formals (caddr form))
(f1 (car formals))
- (body (cdddr form))
+ (rest (cdddr form))
+ (has-guard? (and (pair? rest) (pair? (cdr rest))
+ (eq? (car rest) guard:)))
+ (guard-expr (and has-guard? (cadr rest)))
+ (body (if has-guard? (cddr rest) rest))
(%define (rename 'define))
(%if (rename 'if))
(%let (rename 'let))
+ (%not (rename 'not))
(%quote (rename 'quote))
(%skip? (rename 'entity-skips-pipeline?)))
- `(,%define (,name ,@formals)
- (,%if (,%skip? ,f1 (,%quote ,skip))
- ,f1
- (,%let () ,@body)))))))
+ (if has-guard?
+ `(,%define (,name ,@formals)
+ (,%if (,%skip? ,f1 (,%quote ,skip))
+ ,f1
+ (,%if (,%not ,guard-expr)
+ ,f1
+ (,%let () ,@body))))
+ `(,%define (,name ,@formals)
+ (,%if (,%skip? ,f1 (,%quote ,skip))
+ ,f1
+ (,%let () ,@body))))))))
(define (make-player-entity x y width height)
(list #:type 'player