1 USING: kernel generic.standard syntax words parser assocs
2 generic quotations sequences effects arrays classes definitions
3 prettyprint sorting prettyprint.backend shuffle ;
6 : define-visitor ( word -- )
7 dup dup reset-word define-simple-generic
8 dup H{ } clone "visitor-methods" set-word-prop
9 H{ } clone "visitors" set-word-prop ;
12 CREATE define-visitor ; parsing
14 : record-visitor ( top-class generic method-word -- )
15 swap "visitors" word-prop swapd set-at ;
17 : define-1generic ( word -- )
18 1 <standard-combination> define-generic ;
20 : copy-effect ( from to -- )
21 swap stack-effect "declared-effect" set-word-prop ;
23 : new-vmethod ( method bottom-class top-class generic -- )
24 gensym dup define-1generic
26 3dup 1quotation -rot define-method
27 [ record-visitor ] keep
30 : define-visitor-method ( method bottom-class top-class generic -- )
31 4dup >r 2array r> "visitor-methods" word-prop set-at
32 2dup "visitors" word-prop at
33 [ nip define-method ] [ new-vmethod ] ?if ;
36 ! syntax: V: bottom-class top-class generic body... ;
37 f set-word scan-word scan-word scan-word
38 parse-definition -roll define-visitor-method ; parsing
41 ! see must be redone because "methods" doesn't show methods
43 PREDICATE: standard-generic visitor "visitors" word-prop ;
44 PREDICATE: array triple length 3 = ;
45 PREDICATE: triple visitor-spec
46 first3 visitor? >r [ class? ] 2apply and r> and ;
48 M: visitor-spec definer drop \ V: \ ; ;
49 M: visitor definer drop \ VISITOR: f ;
51 M: visitor-spec synopsis*
52 ! same as method-spec#synopsis*
53 dup definer drop pprint-word
54 [ pprint-word ] each ;
56 M: visitor-spec definition
57 first3 >r 2array r> "visitor-methods" word-prop at ;
62 dup "visitor-methods" word-prop keys natural-sort swap
63 [ >r first2 r> 3array ] curry map see-all ;