diff options
| author | Gene Pasquet <dev@etenil.net> | 2026-04-08 01:57:20 +0100 |
|---|---|---|
| committer | Gene Pasquet <dev@etenil.net> | 2026-04-08 01:57:20 +0100 |
| commit | 9e8b75f9949259ef01942cd3717b79b044efddf7 (patch) | |
| tree | c6b71291ade57f0560a9bbf0db9f5b66bab65cb3 /entity.scm | |
| parent | 84840ede6646ed793b61cdd889d3f57ab05e9311 (diff) | |
Refactor update pipelines
Diffstat (limited to 'entity.scm')
| -rw-r--r-- | entity.scm | 27 |
1 files changed, 22 insertions, 5 deletions
@@ -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 |
