#lang racket ;; ----------------------------------------------------------------------------- ;; library module
;; syntax def ;; definition = ... | (struct/kw name (field ...) options ...) ;; meaning: (struct name (field ...) options ...) ;; plus keyword-based constructor: name/kw ;; warning: the introduction of name/kw is non-hygienic (define-syntax (struct/kw stx) (syntax-case stx () [(_ name (field ...) . stuff) (let* ([symbol-to-keyword-parameter (lambda (s) `(,(string->keyword (symbol->string (syntax-e s))) ,s))] [args (map symbol-to-keyword-parameter (syntax->list #'(field ...)))] [name/kw (datum->syntax stx (string->symbol (string-append (symbol->string (syntax-e #'name)) "/kw")))]) #`(begin (struct name (field ...) . stuff) (define (#,name/kw #,@(foldl append '[] args)) (name field ...))))])) ;; ----------------------------------------------------------------------------- ;; usage example (could be separate module) (struct/kw book (author title)) (define book1 (book/kw #:title "The Client" #:author "John Grisham" )) (string=? (book-author book1) "John Grisham") _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users