1 ! Copyright (C) 2005, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays generic hashtables kernel kernel.private math
4 namespaces make sequences words quotations layouts combinators
5 sequences.private classes classes.builtin classes.algebra
6 definitions math.order math.private ;
9 PREDICATE: math-class < class
10 dup null bootstrap-word eq? [
13 number bootstrap-word class<=
16 : last/first ( seq -- pair ) [ peek ] [ first ] bi 2array ;
18 : math-precedence ( class -- pair )
20 { [ dup null class<= ] [ drop { -1 -1 } ] }
21 { [ dup math-class? ] [ class-types last/first ] }
25 : math-class<=> ( class1 class2 -- class )
26 [ math-precedence ] compare +gt+ eq? ;
28 : math-class-max ( class1 class2 -- class )
29 [ math-class<=> ] most ;
31 : math-class-min ( class1 class2 -- class )
32 [ swap math-class<=> ] most ;
34 : (math-upgrade) ( max class -- quot )
35 dupd = [ drop [ ] ] [ "coercer" word-prop [ ] or ] if ;
37 : math-upgrade ( class1 class2 -- quot )
38 [ math-class-max ] 2keep
39 [ over ] dip (math-upgrade) [
41 dup empty? [ [ dip ] curry [ ] like ] unless
44 ERROR: no-math-method left right generic ;
46 : default-math-method ( generic -- quot )
47 [ no-math-method ] curry [ ] like ;
49 : applicable-method ( generic class -- quot )
52 [ default-math-method ] ?if ;
54 : object-method ( generic -- quot )
55 object bootstrap-word applicable-method ;
57 : math-method ( word class1 class2 -- quot )
60 [ math-class-max over order min-class applicable-method ] dip
68 : math-vtable ( picker quot -- quot )
71 picker get , [ tag 0 eq? ] %
72 num-tags get swap [ bootstrap-type>class ] prepose map
75 picker get , [ tag 1 fixnum-fast ] % , \ dispatch ,
79 TUPLE: math-combination ;
81 M: math-combination make-default-method
82 drop default-math-method ;
84 M: math-combination perform-combination
89 \ dup [ [ 2dup ] dip math-method ] math-vtable
93 ] math-vtable nip define ;
95 PREDICATE: math-generic < generic ( word -- ? )
96 "combination" word-prop math-combination? ;
98 M: math-generic definer drop \ MATH: f ;