+(define-macro (define-mob mob-head . body)
+ (let* ((name (car mob-head))
+ (attr (cdr mob-head))
+ (make-fun-symbol (gensym))
+ (mob-fun-symbol (gensym))
+ (params-symbol (gensym)))
+ `(define (,name . ,params-symbol)
+ (define ,make-fun-symbol
+ (lambda* ,(if (null? attr) '() `(#:key ,@attr))
+ (the-mob ,name (list ,@(map (lambda (a) `(cons ',(car a) ,(car a))) attr)))))
+ (define ,mob-fun-symbol
+ (define-mob-function ,attr ,@body))
+ (cond ((or (null? ,params-symbol) (keyword? (car ,params-symbol)))
+ (apply ,make-fun-symbol ,params-symbol))
+ (else
+ (apply ,mob-fun-symbol ,params-symbol))))))
+
+
+(define-macro (define-mesh name . mesh)
+ (let* ((make-fun-symbol (gensym))
+ (mesh-fun-symbol (gensym))
+ (params-symbol (gensym)))
+ `(define ,name
+ (let ((,make-fun-symbol
+ (lambda ()))
+ (,mesh-fun-symbol
+ (lambda ())))
+ (lambda (. ,params-symbol)
+ (cond ((or (null? ,params-symbol) (keyword? (car ,params-symbol)))
+ (apply ,make-fun-symbol ,params-symbol))
+ (else
+ (apply ,mesh-fun-symbol ,params-symbol))))))))
+
+
+(define-macro (define-primitives . symbols)