factor/basis/inference/transforms/transforms.factor

81 lines
2.0 KiB
Factor
Raw Normal View History

2008-01-18 17:09:45 -05:00
! Copyright (C) 2007, 2008 Slava Pestov.
2007-09-20 18:09:08 -04:00
! See http://factorcode.org/license.txt for BSD license.
2008-06-30 02:44:58 -04:00
USING: accessors arrays kernel words sequences generic math
2008-07-18 20:22:59 -04:00
namespaces quotations assocs combinators
2008-06-30 02:44:58 -04:00
inference.backend inference.dataflow inference.state
2008-07-02 01:20:01 -04:00
classes.tuple classes.tuple.private effects summary hashtables
2008-06-30 02:44:58 -04:00
classes generic sets definitions generic.standard slots.private ;
2007-09-20 18:09:08 -04:00
IN: inference.transforms
: pop-literals ( n -- rstate seq )
2007-10-10 01:53:55 -04:00
dup zero? [
drop recursive-state get { }
] [
dup ensure-values
f swap [ 2drop pop-literal ] map reverse
] if ;
2007-09-20 18:09:08 -04:00
: transform-quot ( quot n -- newquot )
[ pop-literals [ ] each ] curry
swap
[ swap infer-quot ] 3compose ;
2007-09-20 18:09:08 -04:00
: define-transform ( word quot n -- )
transform-quot "infer" set-word-prop ;
2007-09-27 04:50:24 -04:00
! Combinators
2007-09-20 18:09:08 -04:00
\ cond [
cond>quot
] 1 define-transform
\ case [
dup empty? [
drop [ no-case ]
] [
dup peek quotation? [
2008-05-07 02:38:34 -04:00
dup peek swap but-last
2007-09-20 18:09:08 -04:00
] [
[ no-case ] swap
] if case>quot
2007-09-20 18:09:08 -04:00
] if
] 1 define-transform
2008-03-29 00:38:03 -04:00
\ cleave [ cleave>quot ] 1 define-transform
\ 2cleave [ 2cleave>quot ] 1 define-transform
2008-04-01 02:40:12 -04:00
\ 3cleave [ 3cleave>quot ] 1 define-transform
2008-03-29 00:38:03 -04:00
\ spread [ spread>quot ] 1 define-transform
2007-09-20 18:09:08 -04:00
! Tuple operations
: [get-slots] ( slots -- quot )
[ [ 1quotation , \ keep , ] each \ drop , ] [ ] make ;
\ get-slots [ [get-slots] ] 1 define-transform
2008-03-20 16:00:49 -04:00
ERROR: duplicated-slots-error names ;
M: duplicated-slots-error summary
drop "Calling set-slots with duplicate slot setters" ;
\ set-slots [
dup all-unique?
[ <reversed> [get-slots] ] [ duplicated-slots-error ] if
] 1 define-transform
2007-09-20 18:09:08 -04:00
\ boa [
dup tuple-class? [
dup +inlined+ depends-on
2008-06-30 02:44:58 -04:00
[ "boa-check" word-prop ]
[ tuple-layout [ <tuple-boa> ] curry ]
bi append
] [
2008-06-30 02:44:58 -04:00
\ boa \ no-method boa time-bomb
] if
2008-01-18 17:09:45 -05:00
] 1 define-transform
\ (call-next-method) [
[ [ +inlined+ depends-on ] bi@ ] [ next-method-quot ] 2bi
] 2 define-transform