1 (define-module (language python def
)
2 #:use-module
(ice-9 pretty-print
)
3 #:use-module
(oop pf-objects
)
4 #:use-module
(language python exceptions
)
5 #:use-module
(ice-9 match
)
6 #:use-module
(srfi srfi-11
)
7 #:export
(def lam py-apply
))
9 (define e
(list 'error
))
10 (define-syntax-rule (aif it p x y
) (let ((it p
)) (if (not (eq? it e
)) x y
)))
11 (define (fold lam s l
)
13 (lam (car l
) (fold lam s
(cdr l
)))
16 (define-syntax-rule (take-1 pww ww
* kw s v
)
19 (aif it
(hash-ref kw s e
)
27 (values (cdr ww
*) (car ww
*)))
29 (aif it
(hash-ref kw s e
)
37 (let lp
((l l
) (args '()) (kw (make-hash-table)))
39 (((? keyword? k
) v . l
)
43 (lp l
(cons x args
) kw
))
45 (values (reverse args
) kw
)))))
47 (define hset
! hash-set
!)
52 (hset! h
(symbol->string
(keyword->symbol k
)) v
)
59 (define-syntax-rule (mk get-as
(k v s
) x y z w
)
62 (syntax-case a
(= * **)
75 (cons (cons #'k
#'v
) s
) s s s
)
77 (define (->kw x
) (symbol->keyword
(syntax->datum x
)))
80 ((_ (arg ...
) code ...
)
81 (let* ((as (fold get-as
'() #'(arg ...
)))
82 (kw (fold get-kw
'() #'(arg ...
)))
83 (ww- (fold get-ww
'() #'(arg ...
)))
84 (kv (fold get-kv
'() #'(arg ...
))))
85 (if (and-map null?
(list kw ww- kv
))
87 (lambda (#,@as . u12345678
)
88 (if (and (pair? u12345678
)
89 (not (keyword?
(car u12345678
))))
90 (raise (ArgumentError "too many arguments to function")))
92 (with-syntax ((kw (if (null? kw
)
93 (datum->syntax x
(gensym "kw"))
96 (datum->syntax x
(gensym "ww"))
98 ((k ...
) (map car kv
))
99 ((s ...
) (map -
>kw
(map car kv
)))
100 ((v ...
) (map cdr kv
)))
103 (call-with-values (lambda () (get-akw l
))
105 (let*-values
(((ww* k
) (take-1 #,(null? ww-
) ww
*
110 (let () code ...
))))))))))))))
112 (define-syntax-rule (def (f . args
) code ...
) (define f
(lam args code ...
)))
119 (syntax-case x
(* ** =)
134 (define (mkw kw
) (error "not implemented"))
137 (syntax-rules (* ** =)
139 (list (symbol->keyword
'a
) b
))
145 (define-syntax py-apply
149 (and (syntax-case #'op
(*)
153 (syntax-case q
(* ** =)
158 #'(if (or (null? x
) (pair? x
))
160 (apply f a ...
(to-list x
))))
165 #'(apply f
(let lp
((l (list (m* a
) ...
)))
167 (append (to-list (car l
)) (lp (cdr l
)))