diff options
Diffstat (limited to 'modules/language/python/def.scm')
-rw-r--r-- | modules/language/python/def.scm | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/modules/language/python/def.scm b/modules/language/python/def.scm index 1b91f85..f0bb161 100644 --- a/modules/language/python/def.scm +++ b/modules/language/python/def.scm @@ -1,7 +1,8 @@ (define-module (language python def) + #:use-module (language python for) #:use-module (ice-9 match) #:use-module (srfi srfi-11) - #:export (def lam)) + #:export (def lam py-apply)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) (define (fold lam s l) @@ -99,6 +100,43 @@ code ...)))))))))))) (define-syntax-rule (def (f . args) code ...) (define f (lam args code ...))) - - - + + +(define (no x) + (and-map + (lambda (x) + (syntax-case x (* **) + ((* _) #f) + ((** _) #f) + (_ #t))) + x)) + +(define (mk-k x) + (if (keyword? x) + x + (symbol->keyword + (if (string? x) + (string->symbol x) + x)))) + +(define-syntax m* + (syntax-rules (* **) + ((_ (* a)) a) + ((_ (** kw)) + (for ((k v : kw)) ((l '())) + (cons* v (mk-k k) l) + + #:final (reverse l))) + ((_ a) (list a)))) + +(define-syntax py-apply + (lambda (x) + (syntax-case x () + ((_ f a ...) + (if (no #'(a ...)) + #'(apply f a ...) + #'(apply f (let lp ((l (list (m* a) ...))) + (if (pair? l) + (append (car l) (lp (cdr l))) + '())))))))) + |