PasteRack.org
Paste # 57573
2015-06-11 08:08:58

Fork as a new paste.

Paste viewed 200 times.


Embed:

decorators

  1. #lang racket
  2. (require syntax/parse/define)
  3. (require (for-syntax syntax/parse))
  4.  
  5. (define-syntax (define-wd stx)
  6.   (syntax-parse stx
  7.                 [(_ dec:id (fn:id args:id ...) body:expr ...+)
  8.                  #'(begin
  9.                      (define dec-evd (dec))
  10.                      (define (fn args ...)
  11.                        (dec-evd (lambda (args ...) body ...) args ...))
  12.                      (void))]))
  13.  
  14. (define (counter)
  15.   (define cnt 0)
  16.  
  17.   (define (decorator fn . args)
  18.     (set! cnt (add1 cnt))
  19.     (printf "counter: ~a\n" cnt)
  20.     (apply fn args))
  21.  
  22.   decorator)
  23.  
  24. (define-wd counter (sum3 x y z)
  25.   (+ x y z))
  26.  
  27. (sum3 1 2 3)
  28. (sum3 4 5 7)
  29.  
  30.  

=>

counter: 1

6

counter: 2

16