PasteRack.org
Paste # 36851
2020-03-27 07:37:26

Fork as a new paste.

Paste viewed 221 times.


Embed:

need help with macros and keywords

  1. #lang racket/base
  2.  
  3. (require
  4.   (for-syntax racket/base
  5.               syntax/stx
  6.               syntax/parse
  7.               syntax/to-string))
  8.  
  9. (define-syntax (kwds stx)
  10.   (syntax-parse stx
  11.     [(_ name:id)
  12.      (if (not (identifier-binding #'name))
  13.          #`(#,(string->keyword (syntax->string #'(name))) name)
  14.          (raise-syntax-error 'defn
  15.                              (format "~a param name already bound" #'name)
  16.                              stx))]
  17.     [(_ name:id names:id ...)
  18.      #'((kwds name) (kwds (names ...)))]))
  19.  
  20.  
  21. (define-syntax (defn stx)
  22.   (syntax-parse stx
  23.     [(_ fname:id (kwargs:id ...) expr)
  24.      #`(define (fname (kwds kwargs ...))
  25.          expr)]))
  26.  
  27. (module+ test
  28.   (require rackunit)
  29.   (defn mew (two) two)
  30.   (check-equal? (mew #:two 2) 2))

=>