(define-syntax define-command (rsc-macro-transformer (lambda (form environment) (capture-syntactic-environment (lambda (instance-environment) (if (syntax-match? '(SYMBOL EXPRESSION EXPRESSION EXPRESSION) (cdr form)) (let ((name (list-ref form 1)) (description (list-ref form 2)) (interactive (list-ref form 3)) (procedure (list-ref form 4))) (let ((scheme-name (command-name->scheme-name name))) `(,(close-syntax 'DEFINE environment) ,scheme-name (,(close-syntax 'MAKE-COMMAND environment) ',name ,description ,interactive ,(if (and (pair? procedure) (identifier=? instance-environment (car procedure) environment 'LAMBDA) (pair? (cdr procedure))) `(,(close-syntax 'NAMED-LAMBDA environment) (,scheme-name ,@(cadr procedure)) ,@(cddr procedure)) procedure))))) (ill-formed-syntax form))))))) (define-syntax define-command (lambda (form rename compare) (if (not (= (length form) 5)) (syntax-error "DEFINE-COMMAND name description interactive procedure") (let* ((name (list-ref form 1)) (description (list-ref form 2)) (interactive (list-ref form 3)) (procedure (list-ref form 4)) (scheme-name (command-name->scheme-name name)) (%define (rename 'define)) (%make-command (rename 'make-command))) `(,%define ,scheme-name (,%make-command ',name ,description ,interactive ,procedure))))))