Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (define-syntax (define-command stx)
- (syntax-case stx (optional)
- [(_ com (pl (a b) ... optional (oa ob)) props body ...)
- #`(define (com pl . args)
- (cond
- [(< (length args) #,(length (syntax->datum #'(a ...))))
- (sendmsg #,(string-append "Not enough arguments for " (string-upcase (symbol->string (syntax-e #'com))) ".") pl)]
- [else
- (let/cc hop (let #,(letrec ((P (λ (ca cb n) (if (null? ca)
- #`((ob (#,(syntax-e #'oa) (list-ref? args #,n) pl hop)))
- #`((#,(car cb) (#,(car ca) (list-ref args #,n) pl hop)) #,@(P (cdr ca) (cdr cb) (+ n 1)))))))
- (P (syntax-e #'(a ...)) (syntax-e #'(b ...)) 0)) #,(if (syntax-e #'props) #`(act (λ () body ...) pl props ob) #`(begin body ...))))]
- ))]
- [(_ com (pl (a b) ... . m) props body ...)
- #`(define (com pl . args)
- (if (< (length args) #,(+ (length (syntax->datum #'(a ...))) (if (null? (syntax-e #'m)) 0 1)))
- (sendmsg #,(string-append "Not enough arguments for " (string-upcase (symbol->string (syntax-e #'com))) ".") pl)
- (let/cc hop (let #,(letrec ((P (λ (a b n) (if (null? a)
- (if (null? (syntax-e #'m)) #`() #`((m (string-join (list-tail args #,n)))))
- #`((#,(car b) (#,(car a) (list-ref args #,n) pl hop)) #,@(P (cdr a) (cdr b) (+ n 1)))))))
- (P (syntax-e #'(a ...)) (syntax-e #'(b ...)) 0)) #,(if (syntax-e #'props) #`(act (λ () body ...) pl props args) #`(begin body ...))))))]
- ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement