File: coercion.rkt

package info (click to toggle)
racket 7.9%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 178,684 kB
  • sloc: ansic: 282,112; lisp: 234,887; pascal: 70,954; sh: 27,112; asm: 16,268; makefile: 4,613; cpp: 2,715; ada: 1,681; javascript: 1,244; cs: 879; exp: 499; csh: 422; python: 274; xml: 106; perl: 104
file content (25 lines) | stat: -rw-r--r-- 726 bytes parent folder | download | duplicates (11)
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
#lang racket/base
(require racket/contract
         racket/match
         (for-syntax racket/base))

(define (make-coerce-safe? coerce)
  (lambda (x)
    (with-handlers ([exn:fail? (lambda (x) #f)])
      (and (coerce x) #t))))

(define-syntax (define-coercion-match-expander stx)
  (syntax-case stx ()
    [(_ expander-id test? coerce)
     (syntax/loc stx
       (define-match-expander expander-id
         (lambda (stx)
           (syntax-case stx ()
             [(_ id) (identifier? #'id)
                     (syntax/loc stx
                       (? test? (app coerce id)))]))))]))

(provide/contract
 [make-coerce-safe? ((any/c . -> . any/c) . -> . (any/c . -> . boolean?))])
(provide
 define-coercion-match-expander)