32 lines
815 B
Scheme
32 lines
815 B
Scheme
#lang scheme/base
|
|
|
|
(require scheme/stxparam
|
|
(for-syntax scheme/base))
|
|
|
|
(provide match-equality-test
|
|
exn:misc:match?
|
|
match:error
|
|
fail
|
|
matchable?
|
|
match-prompt-tag)
|
|
|
|
(define match-prompt-tag (make-continuation-prompt-tag 'match))
|
|
|
|
(define match-equality-test (make-parameter equal?))
|
|
|
|
(define-struct (exn:misc:match exn:fail) (value))
|
|
|
|
(define (match:error val)
|
|
(raise (make-exn:misc:match (format "match: no matching clause for ~e" val)
|
|
(current-continuation-marks)
|
|
val)))
|
|
|
|
(define-syntax-parameter fail
|
|
(lambda (stx)
|
|
(raise-syntax-error
|
|
#f "used out of context: not in match pattern" stx)))
|
|
|
|
;; can we pass this value to regexp-match?
|
|
(define (matchable? e)
|
|
(or (string? e) (bytes? e)))
|