Thank you for your comment

Beau­tiful Racket / explainers

  1. (define-macro-cases num
      [(num 42) "match"]
      [else "nope"])
    (num 42) ; "match"
    (num 24) ; "nope"
    (num "foo") ; "nope"

    (define-macro-cases str
      [(str "foo") "match"]
      [else "nope"])
    (str "foo") ; "match"
    (str foo) ; "nope"
    (str "bar") ; "nope"

    (define-macro-cases sym
      [(sym 'foo) "match"]
      [else "nope"])
    (sym 'foo) ; "match"
    (sym 'bar) ; "nope"
    (sym "foo") ; "nope"

    (define-macro-cases id
      [(id foo) "match"]
      [else "nope"])
    (id foo) ; "match"
    (id bar) ; "nope"
    (id "foo") ; "nope"
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    (define-macro-cases num
      [(num 42) "match"]
      [else "nope"])
    (num 42) ; "match"
    (num 24) ; "nope"
    (num "foo") ; "nope"
    
    (define-macro-cases str
      [(str "foo") "match"]
      [else "nope"])
    (str "foo") ; "match"
    (str foo) ; "nope"
    (str "bar") ; "nope"
    
    (define-macro-cases sym
      [(sym 'foo) "match"]
      [else "nope"])
    (sym 'foo) ; "match"
    (sym 'bar) ; "nope"
    (sym "foo") ; "nope"
    
    (define-macro-cases id
      [(id foo) "match"]
      [else "nope"])
    (id foo) ; "match"
    (id bar) ; "nope"
    (id "foo") ; "nope"
    
    copy to clipboard
    (module mod br
      (define-macro-cases mac
        [(_ zeta) "match"]
        [else "nope"])
      (provide mac))
    (require (submod "." mod))

    (require math)
    (mac zeta) ; "nope"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    (module mod br
      (define-macro-cases mac
        [(_ zeta) "match"]
        [else "nope"])
      (provide mac))
    (require (submod "." mod))
    
    (require math)
    (mac zeta) ; "nope"
    
    copy to clipboard
    (module mod br
      (require math)
      (define-macro-cases mac
        [(_ zeta) "match"]
        [else "nope"])
      (provide mac))
    (require (submod "." mod))

    (require math)
    (mac zeta) ; "match"
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    (module mod br
      (require math)
      (define-macro-cases mac
        [(_ zeta) "match"]
        [else "nope"])
      (provide mac))
    (require (submod "." mod))
    
    (require math)
    (mac zeta) ; "match"
    
    copy to clipboard
  2. (define-macro (self ARG) #'ARG)
    (self "foo") ; "foo"
    (self (list 1 2 3)) ; '(1 2 3)

    (define-macro (add-three ARG) #'(+ ARG ARG ARG))
    (add-three 42) ; 126
    1
    2
    3
    4
    5
    6
    (define-macro (self ARG) #'ARG)
    (self "foo") ; "foo"
    (self (list 1 2 3)) ; '(1 2 3)
    
    (define-macro (add-three ARG) #'(+ ARG ARG ARG))
    (add-three 42) ; 126
    
    copy to clipboard
    (define-macro (odds FIRST _ THIRD _ FIFTH)
      #'(list FIRST THIRD FIFTH))
    (odds 1 2 3 4 5) ; '(1 3 5)
    1
    2
    3
    (define-macro (odds FIRST _ THIRD _ FIFTH)
      #'(list FIRST THIRD FIFTH))
    (odds 1 2 3 4 5) ; '(1 3 5)
    
    copy to clipboard
  3. (define-macro (m NUMS)
      (with-pattern ([(FIRST SECOND THIRD) #'NUMS])
        #'(list THIRD SECOND FIRST)))
    (m (1 2 3)) ; '(3 2 1)

    (define-macro (m2 (FIRST SECOND THIRD))
      #'(list THIRD SECOND FIRST))
    (m2 (1 2 3)) ; '(3 2 1)
    1
    2
    3
    4
    5
    6
    7
    8
    (define-macro (m NUMS)
      (with-pattern ([(FIRST SECOND THIRD) #'NUMS])
        #'(list THIRD SECOND FIRST)))
    (m (1 2 3)) ; '(3 2 1)
    
    (define-macro (m2 (FIRST SECOND THIRD))
      #'(list THIRD SECOND FIRST))
    (m2 (1 2 3)) ; '(3 2 1)
    
    copy to clipboard
    (define-macro (m2 (FIRST SECOND THIRD))
      #'(list THIRD SECOND FIRST))
    (m2 1 2 3) ; error: no match, because no sublist
    1
    2
    3
    (define-macro (m2 (FIRST SECOND THIRD))
      #'(list THIRD SECOND FIRST))
    (m2 1 2 3) ; error: no match, because no sublist
    
    copy to clipboard
  4. (define-macro (ellip ARG ...)
      #'(list ARG ...))

    (ellip 1 2 3) ; '(1 2 3)
    (ellip "a" "b") ; '("a" "b")
    (ellip) ; '()
    1
    2
    3
    4
    5
    6
    (define-macro (ellip ARG ...)
      #'(list ARG ...))
    
    (ellip 1 2 3) ; '(1 2 3)
    (ellip "a" "b") ; '("a" "b")
    (ellip) ; '()
    
    copy to clipboard
    (define-macro (bad-ellip ARG ...)
      #'(list ARG))
    (bad-ellip 1 2 3) ; error: missing ellipsis
    1
    2
    3
    (define-macro (bad-ellip ARG ...)
      #'(list ARG))
    (bad-ellip 1 2 3) ; error: missing ellipsis
    
    copy to clipboard
    ; OK: one ellipsis per sublist
    (define-macro (m (FOO ...) (BAR ...))
      #'(list FOO ... BAR ...))
    (m (1 2 3) (4 5 6)) ; '(1 2 3 4 5 6)

    ; not OK: two ellipses at top level
    (define-macro (m2 FOO ... BAR ...)
      #'(list FOO ... BAR ...))
    1
    2
    3
    4
    5
    6
    7
    8
    ; OK: one ellipsis per sublist
    (define-macro (m (FOO ...) (BAR ...))
      #'(list FOO ... BAR ...))
    (m (1 2 3) (4 5 6)) ; '(1 2 3 4 5 6)
    
    ; not OK: two ellipses at top level
    (define-macro (m2 FOO ... BAR ...)
      #'(list FOO ... BAR ...))
    
    copy to clipboard
  5. (define-macro (m . ARGS) #'ARGS)
    (m + 1 2 3) ; means #'(+ 1 2 3) = 6

    (define-macro (m2 . ARGS) #'(list . ARGS))
    (m2 1 2 3) ; means #'(list 1 2 3) = '(1 2 3)
    1
    2
    3
    4
    5
    (define-macro (m . ARGS) #'ARGS)
    (m + 1 2 3) ; means #'(+ 1 2 3) = 6
    
    (define-macro (m2 . ARGS) #'(list . ARGS))
    (m2 1 2 3) ; means #'(list 1 2 3) = '(1 2 3)
    
    copy to clipboard
    (define-macro (m ARG ...) #'(ARG ...))
    (m + 1 2 3) ; means #'(+ 1 2 3) = 6

    (define-macro (m2 ARG ...) #'(list ARG ...))
    (m2 1 2 3) ; means #'(list 1 2 3) = '(1 2 3)
    1
    2
    3
    4
    5
    (define-macro (m ARG ...) #'(ARG ...))
    (m + 1 2 3) ; means #'(+ 1 2 3) = 6
    
    (define-macro (m2 ARG ...) #'(list ARG ...))
    (m2 1 2 3) ; means #'(list 1 2 3) = '(1 2 3)
    
    copy to clipboard
← prev next →