Advertisement
Guest User

Untitled

a guest
May 20th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 1.75 KB | None | 0 0
  1. (define-syntax (define-command stx)
  2.   (syntax-case stx (optional)
  3.     [(_ com (pl (a b) ... optional (oa ob)) props body ...)
  4.      #`(define (com pl . args)
  5.         (cond
  6.            [(< (length args) #,(length (syntax->datum #'(a ...))))
  7.             (sendmsg #,(string-append "Not enough arguments for " (string-upcase (symbol->string (syntax-e #'com))) ".") pl)]
  8.            [else
  9.             (let/cc hop (let #,(letrec ((P (λ (ca cb n) (if (null? ca)
  10.                                                            #`((ob (#,(syntax-e #'oa) (list-ref? args #,n) pl hop)))
  11.                                                            #`((#,(car cb) (#,(car ca) (list-ref args #,n) pl hop)) #,@(P (cdr ca) (cdr cb) (+ n 1)))))))
  12.                                   (P (syntax-e #'(a ...)) (syntax-e #'(b ...)) 0)) #,(if (syntax-e #'props) #`(act (λ () body ...) pl props ob) #`(begin body ...))))]
  13.            
  14.  
  15.          ))]
  16.     [(_ com (pl (a b) ... . m) props body ...)
  17.      #`(define (com pl . args)
  18.          (if (< (length args) #,(+ (length (syntax->datum #'(a ...))) (if (null? (syntax-e #'m)) 0 1)))
  19.              (sendmsg #,(string-append "Not enough arguments for " (string-upcase (symbol->string (syntax-e #'com))) ".") pl)
  20.              (let/cc hop (let #,(letrec ((P (λ (a b n) (if (null? a)
  21.                                                            (if (null? (syntax-e #'m)) #`() #`((m (string-join (list-tail args #,n)))))
  22.                                                            #`((#,(car b) (#,(car a) (list-ref args #,n) pl hop)) #,@(P (cdr a) (cdr b) (+ n 1)))))))
  23.                                   (P (syntax-e #'(a ...)) (syntax-e #'(b ...)) 0)) #,(if (syntax-e #'props) #`(act (λ () body ...) pl props args) #`(begin body ...))))))]
  24.    
  25.     ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement