TUPLE: map from to ;
TUPLE: union members ;
TUPLE: struct fields ;
-TUPLE: user name type ;
TUPLE: schema types ;
! errors
check-duplicate-keys check-entries
dup [ check-void 2drop ] assoc-each struct boa ;
-C: <user> user
-
: <schema> ( types -- schema )
check-entries schema boa ;
! XXX: M: union write-bare
-M: user write-bare type>> write-bare ;
-
M: struct write-bare
fields>> [ [ dupd of ] [ write-bare ] bi* ] assoc-each drop ;
[ uint read-bare ] dip members>> ?value-at
[ read-bare ] [ invalid-union ] if ;
-M: user read-bare type>> read-bare ;
-
M: struct read-bare
fields>> [ read-bare ] assoc-map ;
user-type-name = (alpha|digit)+ => [[ >string ]]
user-type = "type"~ ws user-type-name ws any-type
- => [[ first2 [ <user> dup ] 2keep drop user-types [ ?set-at ] change ]]
+ => [[ first2 [ 2array ] 2keep swap user-types [ ?set-at ] change ]]
user-types = user-type (ws user-type)* => [[ first2 swap prefix ]]
schema = ws user-types ws => [[ <schema> ]]
utf8 file-contents parse-schema ;
: define-schema ( schema -- )
+ ! XXX: define user types as tuples with bare-fields word-prop?
types>> [
- [ name>> create-word-in dup reset-generic ]
- [ type>> define-constant ] bi
- ] each ;
+ [ create-word-in dup reset-generic ]
+ [ define-constant ] bi*
+ ] assoc-each ;
SYNTAX: SCHEMA: scan-object parse-schema define-schema ;