Skip to content

Instantly share code, notes, and snippets.

@wilbowma
Last active October 9, 2022 00:28
Show Gist options
  • Save wilbowma/5fcf20feb13359ae9960c4b1ca7afb22 to your computer and use it in GitHub Desktop.
Save wilbowma/5fcf20feb13359ae9960c4b1ca7afb22 to your computer and use it in GitHub Desktop.
#lang racket
(require
(for-syntax
syntax/parse
racket/syntax))
;; unhygenic
(define-syntax (new-define-form syn)
(syntax-parse syn
[(_ name
(~seq #:arg-value v)
(~seq #:kw-args kw-e))
#:with arg (syntax-local-introduce (format-id #f "~a" 'arg))
#'(define (name)
(let ([arg v])
kw-e))]))
(new-define-form name
#:arg-value (+ 1 2)
#:kw-args (+ arg 2))
(name)
;; hygenic
(define-syntax (new-define-form^ syn)
(syntax-parse syn
[(_ name
(~seq #:arg-value arg v)
(~seq #:kw-args kw-e))
#'(define (name)
(let ([arg v])
kw-e))]))
(new-define-form^ name^
#:arg-value arg (+ 1 2)
#:kw-args (+ arg 2))
(name^)
;; syntax parameters
(require racket/stxparam)
(define-syntax-parameter the-arg (lambda (stx) #'(error "Cannot use outside new-define-form^^")))
(define-syntax (new-define-form^^ syn)
(syntax-parse syn
[(_ name
(~seq #:arg-value v)
(~seq #:kw-args kw-e))
#'(define (name)
(let ([arg v])
(syntax-parameterize ([the-arg (make-rename-transformer #'arg)])
kw-e)))]))
(new-define-form^^ name^^
#:arg-value (+ 1 2)
#:kw-args (+ the-arg 2))
(name^^)
the-arg
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment