summaryrefslogtreecommitdiff
path: root/modules/language/python/def.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/def.scm')
-rw-r--r--modules/language/python/def.scm46
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)))
+ '()))))))))
+