macros2.scm 856 B

12345678910111213141516171819202122232425
  1. (defmacro whenx (cond exp . rest)
  2. `(if ,cond
  3. (begin ,exp . ,rest)))
  4. (define-for-syntax (alter-syntax-datum proc stx)
  5. (datum->syntax-object stx (proc (syntax-object->datum stx))))
  6. (define-syntax define-symbol-altering-macro
  7. (syntax-rules ()
  8. ((_ (macro-name arg) expr . exprs)
  9. (define-symbol-altering-macro macro-name (lambda (arg) expr . exprs)))
  10. ((_ macro-name proc)
  11. (define-syntax macro-name
  12. (lambda (stx)
  13. (syntax-case stx ()
  14. ((_ sym . args)
  15. (let ((new-sym (alter-syntax-datum proc (syntax sym))))
  16. #`(#,new-sym . args)))))))))
  17. (define-symbol-altering-macro (call-reversename sym)
  18. (string->symbol ;; OK: lambda2 BAD: lambda3
  19. (list->string
  20. (reverse
  21. (string->list
  22. (symbol->string sym))))))
  23. (display (call-reversename xam 3 2 7 6)) (newline)
  24. ;; Output: 7