FizzBuzz Macro
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.1KB

  1. #lang racket
  2. (define (skip s)
  3. s)
  4. (define (halt s)
  5. "")
  6. (define (myprint s x)
  7. (string-append s x))
  8. (define (base n)
  9. (lambda (k)
  10. (lambda (s)
  11. (k (myprint (number->string n) s)))))
  12. (define (mult n)
  13. (lambda (k) (= 0 (modulo k n))))
  14. (require (for-syntax syntax/parse racket/base))
  15. (begin-for-syntax
  16. (define-syntax-class fbline
  17. #:description "predicate string pair"
  18. (pattern (p:expr m:string))))
  19. (define-syntax (create-trigger stx)
  20. (syntax-parse stx
  21. [(_ p:expr m:string)
  22. #'(lambda (n)
  23. (lambda (k)
  24. (lambda (s)
  25. (if (p n)
  26. (myprint m (k (halt s)))
  27. (k s)))))]))
  28. (define-syntax (define-fizzbuzz stx)
  29. (syntax-parse stx
  30. [(_ name:identifier l:fbline ...)
  31. #'(define (name n)
  32. (((compose (base n)
  33. ((create-trigger l.p l.m) n) ...)
  34. skip) ""))]))
  35. (define-fizzbuzz fizzbuzz
  36. [(mult 3) "Fizz"]
  37. [(mult 5) "Buzz"])
  38. (provide mult define-fizzbuzz fizzbuzz)