#:use-module (ice-9 receive))
-(define s1
- (make-system '(l)
- (lambda (e)
- (sleep 3)
- (map
- (lambda (e1)
- (set-entity-components (car e1) `(l . ,(cons 1 (cdadr e1)))))
- e))))
+(define-system (s1 l)
+ (lambda (e)
+ (sleep 3)
+ (map
+ (lambda (e1)
+ (set-entity-components (car e1) `(l . ,(cons 1 (cdadr e1)))))
+ e)))
-(define s2
- (make-system '(l)
- (lambda (e)
- (sleep 4)
- (map
- (lambda (e1)
- (set-entity-components (car e1) `(l . ,(cons 2 (cdadr e1)))))
- e))))
+(define-system (s2 l)
+ (lambda (e)
+ (sleep 4)
+ (map
+ (lambda (e1)
+ (set-entity-components (car e1) `(l . ,(cons 2 (cdadr e1)))))
+ e)))
(define (composing-with-join)
(let ((entities '())
(define (making-systems)
(let ((entities '())
(components '()))
- (receive (e c) (((make-system '() (lambda (e) (list (new-entity (make-a 1 2)) (new-entity (make-a 10 20))))) entities components))
+ (receive (e c) (((make-system () (lambda (e) (list (new-entity (make-a 1 2)) (new-entity (make-a 10 20))))) entities components))
(set! entities e)
(set! components c))
(format #t "Two new entities with a:~%~a~%~a~%~%" entities components)
- (((make-system '(a) (lambda (e) (display e) (newline) '())) entities components))))
+ (((make-system (a) (lambda (e) (display e) (newline) '())) entities components))))
(export making-systems)
(lset-intersection eq? e* (find-entities-by-components c (cdr t)))))))))
-(define (make-system component-types system-fun)
- (lambda (entities components)
- (let* ((e (find-entities-by-components components component-types))
- (e* (map (lambda (x) (assoc x entities)) e))
- (e** (map (lambda (x) (cons (car x) (filter (lambda (x) (memq (car x) component-types)) (cdr x)))) e*))
- (res (system-fun e**)))
- (lambda* (#:optional (entities2 #f) (components2 #f))
- (let ((e (if (and entities2 components2) entities2 entities))
- (c (if (and entities2 components2) components2 components)))
- (modify-entities res e c))))))
+(define-macro (make-system component-types system-func)
+ `(let ((func ,system-func))
+ (lambda (entities components)
+ (let* ((e (find-entities-by-components components ',component-types))
+ (e* (map (lambda (x) (assoc x entities)) e))
+ (e** (map (lambda (x) (cons (car x) (filter (lambda (x) (memq (car x) ',component-types)) (cdr x)))) e*))
+ (res (func e**)))
+ (lambda* (#:optional (entities2 #f) (components2 #f))
+ (let ((e (if (and entities2 components2) entities2 entities))
+ (c (if (and entities2 components2) components2 components)))
+ (modify-entities res e c)))))))
+
+
+(define-macro (define-system head system-func)
+ (let ((name (car head))
+ (component-types (cdr head)))
+ `(define ,name (make-system ,component-types ,system-func))))
(define (join-systems . systems)
(export find-entities-by-components
+ define-system
make-system
join-systems
threaded-systems)