factor/core/generic/standard/standard.factor

65 lines
2.0 KiB
Factor
Raw Normal View History

2009-04-24 21:43:01 -04:00
! Copyright (C) 2009 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2009-04-24 21:43:01 -04:00
USING: accessors definitions generic generic.single kernel
namespaces words math math.order combinators sequences
generic.single.private quotations kernel.private
assocs arrays layouts make ;
2007-09-20 18:09:08 -04:00
IN: generic.standard
ERROR: bad-dispatch-position # ;
2009-04-24 21:43:01 -04:00
TUPLE: standard-combination < single-combination # ;
2007-09-20 18:09:08 -04:00
: <standard-combination> ( # -- standard-combination )
dup 0 < [ bad-dispatch-position ] when
standard-combination boa ;
2007-09-20 18:09:08 -04:00
2008-04-02 03:44:10 -04:00
PREDICATE: standard-generic < generic
"combination" word-prop standard-combination? ;
2007-09-20 18:09:08 -04:00
2008-04-02 03:44:10 -04:00
PREDICATE: simple-generic < standard-generic
2009-04-24 21:43:01 -04:00
"combination" word-prop #>> 0 = ;
2007-09-20 18:09:08 -04:00
CONSTANT: simple-combination T{ standard-combination f 0 }
: define-simple-generic ( word effect -- )
[ simple-combination ] dip define-generic ;
2008-04-02 03:44:10 -04:00
2009-04-24 21:43:01 -04:00
: (picker) ( n -- quot )
{
{ 0 [ [ dup ] ] }
{ 1 [ [ over ] ] }
{ 2 [ [ pick ] ] }
[ 1 - (picker) [ dip swap ] curry ]
2009-04-24 21:43:01 -04:00
} case ;
2008-04-02 03:44:10 -04:00
2009-04-24 21:43:01 -04:00
M: standard-combination picker
combination get #>> (picker) ;
2007-09-20 18:09:08 -04:00
M: standard-combination dispatch# #>> ;
M: standard-generic effective-method
[ datastack ] dip [ "combination" word-prop #>> swap <reversed> nth ] keep
method-for-object ;
: inline-cache-quot ( word methods miss-word -- quot )
[ [ literalize , ] [ , ] [ combination get #>> , { } , , ] tri* ] [ ] make ;
M: standard-combination inline-cache-quots
#! Direct calls to the generic word (not tail calls or indirect calls)
#! will jump to the inline cache entry point instead of the megamorphic
#! dispatch entry point.
[ \ inline-cache-miss inline-cache-quot ]
[ \ inline-cache-miss-tail inline-cache-quot ]
2bi ;
: make-empty-cache ( -- array )
mega-cache-size get f <array> ;
M: standard-combination mega-cache-quot
combination get #>> make-empty-cache \ mega-cache-lookup [ ] 4sequence ;
M: standard-generic definer drop \ GENERIC# f ;
2008-01-06 11:13:44 -05:00
M: simple-generic definer drop \ GENERIC: f ;