PasteRack.org
Paste # 20972
2019-11-15 01:35:42

Fork as a new paste.

Paste viewed 572 times.


Embed:

it is not work

  1. #lang racket
  2. (require (for-syntax racket/syntax))
  3.  
  4. (define-syntax (define-tokens-ext stx)
  5.   (syntax-case stx ()
  6.     [(_ id (fields ...))
  7.      (quasisyntax/loc stx
  8.        (begin
  9.          #,@(map
  10.              (lambda (x)
  11.                (let* [(local-name (car (syntax->datum  x) ))
  12.                       (local-fields (append (list 'name 'lexeme)
  13.                                             (if (< 1 (length (syntax->list  x)))
  14.                                                 (cadr (syntax->list  x))
  15.                                                 null)))
  16.                       (local-define-name (string->symbol (format "ext-token-~a" local-name)))
  17.                       (struct-constructor-name (string->symbol (format "make-~a" local-name)))
  18.                       (local-args (append (list 'lexeme)
  19.                                           (if (< 1 (length (syntax->list  x)))
  20.                                               (cadr (syntax->list  x))
  21.                                               null)))
  22.                       ]
  23.                  #`(begin
  24.                      (define-struct #,local-name #,local-fields #:transparent)
  25.                      (define #,(cons  local-define-name local-args)
  26.                        (#,struct-constructor-name '#,local-name #,@local-args)))))
  27.  
  28.              (syntax->list (syntax (fields ...))))))]))
  29.  
  30. (define-tokens-ext DataTokens ((WS (BOS correct mixed))
  31.                                (COMMA )
  32.                                (ID (lang correct ))))

=>