-
Notifications
You must be signed in to change notification settings - Fork 5
/
define-language-with-metapredicates.ss
31 lines (30 loc) · 1.17 KB
/
define-language-with-metapredicates.ss
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
28
29
30
31
;#lang scheme ; File define-language-with-metapredicate.ss
(require redex)
(provide define-language-with-metapredicates)
(define-syntax (define-language-with-metapredicates stx)
(syntax-case stx ()
((define-language-with-metapredicates language clause ...)
(letrec
((extract-language-clauses
(λ (clauses)
(map extract-language-clause (syntax->list clauses))))
(extract-language-clause
(λ (clause)
(syntax-case clause ()
((id pattern ... #:pred pred) #'(id pattern ...))
((id pattern ...) #'(id pattern ...)))))
(extract-predicates
(λ (clauses)
(filter (λ (x) x) (map extract-predicate (syntax->list clauses)))))
(extract-predicate
(λ (clause)
(syntax-case clause ()
((id pattern ... #:pred pred) #'(pred id))
((id pattern ...) #f)))))
(with-syntax
(((clause ...) (extract-language-clauses #'(clause ...)))
(((predicate id) ...) (extract-predicates #'(clause ...))))
#'(begin
(define-language language clause ...)
(define-metafunction language predicate : any -> any
((predicate id) #t) ((predicate any) #f)) ...))))))