Racket: macro expand inside match pattern

Is there a way to determine if a macro expands inside a pattern match?

Here is an example macro that I would like to write, but it does not work inside match-define:

#lang racket/base
(require racket/match (for-syntax racket/base syntax/parse))

(struct point (x y))

(define-syntax (friendly-point stx)
  (syntax-parse stx
   [(_ arg* ...)
    #'(begin (printf "Now making a point\n") (point arg* ...))]
   [_ #'(begin (printf "Hello point\n") point)]))

(define p (friendly-point 1 2))
 ;; Prints "Now making a point"

(match-define (friendly-point x y) p)
;; ERROR
+4
source share
2 answers

Yes. Instead of using a regular syntax transformer created with define-syntax, use define-match-expanderto create a macro that can work with match .

(require (for-syntax syntax/parse))

(define-match-expander positive
  (syntax-parser
    [(_ n)
     #'(? positive? n)]))

(match 3
  [(positive n) (~a n " is positive")])
; => "3 is positive"

define-match-expander : , match, , - , , , . "-" , , .

(require (for-syntax syntax/parse)
         (prefix-in base: racket/base))

(define-match-expander syntax
  (syntax-parser
    [(_ x)
     #'(? syntax? (app syntax->datum x))])
  (make-rename-transformer #'base:syntax))

(match (syntax (1 2 3))
  [(syntax n) (~a n " is a syntax list")])

, define-match-expander prop:match-expander. prop:procedure, , , , prop:rename-transformer, , .

+6

, , define-match-expander. , . ( , thunks, , , . ,

define-match-expander, . ( , , . .

, , , :

#lang racket/base

(require racket/match (for-syntax racket/base syntax/parse))

(struct point (x y))

(define-match-expander friendly-point
  (lambda (stx)
    (syntax-parse stx
      [(_ arg* ...)
       (printf "Now matching a point\n")
       #'(point arg* ...)]
      [_ #'point]))
  (lambda (stx)
    (syntax-parse stx
      [(_ args* ...)
       #'(begin (printf "Now making a point\n") (point args* ...))])))

(define p (friendly-point 1 2))
 ;; Prints "Now making a point"

(match-define (friendly-point x y) p)
;; Works fine now
+5

All Articles