PasteRack.org
Paste # 61417
2016-08-26 17:02:20

Fork as a new paste.

Paste viewed 411 times.


Embed:

define-dog

  1. #lang racket
  2. (require
  3.   (prefix-in - (only-in racket/base struct))
  4.   (for-syntax syntax/parse racket/syntax))
  5.  
  6. (define-syntax (struct stx)
  7.   (syntax-parse stx
  8.    [(_ name (field* ...) other-arg* ...)
  9.     #:with define-name (format-id stx "define-~a" (syntax-e #'name))
  10.     #:with (name-field ...) (for/list ([field (in-list (syntax-e #'(field* ...)))])
  11.                               (format-id stx "~a-~a" (syntax-e #'name) (syntax-e field)))
  12.     #'(begin (-struct name (field* ...) other-arg* ...)
  13.              (define-syntax (define-name stx)
  14.                (syntax-parse stx
  15.                 [(_ nm val* (... ...))
  16.                  #:with (nm.field* (... ...)) (for/list ([field (in-list (syntax-e #'(field* ...)))])
  17.                                                 (format-id stx "~a.~a" (syntax-e #'nm) (syntax-e field)))
  18.                  #'(begin
  19.                      (define nm (name val* (... ...)))
  20.                      (define nm.field* val*)
  21.                      (... ...))])))]))
  22.  
  23. (struct dog (name breed age))
  24. (define-dog my-dog "lassie" "collie" 5)
  25. my-dog.name

=>

"lassie"