/
bestiary.rkt
40 lines (36 loc) · 1.62 KB
/
bestiary.rkt
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
32
33
34
35
36
37
38
39
40
#lang racket
(provide
#%app #%datum #%top #%top-interaction
(rename-out [mb #%module-begin]))
(require syntax/parse/define
frosthaven-manager/syntax/monsters
(for-syntax racket/syntax
frosthaven-manager/syntax/monsters))
;; e ::= '(import "path") | <monster-info> | listof <monster-ability>
(define-syntax-parser mb
[(_ e:expr ...)
#:with info-db (format-id this-syntax "info-db" #:source this-syntax)
#:with ability-db (format-id this-syntax "ability-db" #:source this-syntax)
#:with ((({~datum import} imports) ...)
(infos ...)
((actions ...) ...)
_)
(syntaxes->bestiary-parts (attribute e))
#:do [(define-values (imported-info-dbs imported-ability-dbs)
(imports->dbs (syntax->datum #'(imports ...))))]
#:fail-unless (check-monsters-have-abilities imported-info-dbs imported-ability-dbs
(syntax->datum #'(infos ...))
(syntax->datum #'(actions ... ...)))
(check-monsters-have-abilities-message imported-info-dbs imported-ability-dbs
(syntax->datum #'(infos ...))
(syntax->datum #'(actions ... ...)))
;;=>
(syntax/loc this-syntax
(#%module-begin
(make-dbs (provide info-db ability-db)
(import imports ...)
(info infos ...)
(ability (actions ...) ...))))])
(module reader frosthaven-manager/syntax/module-reader
frosthaven-manager/bestiary
[parse-bestiary from frosthaven-manager/parsers/monster])