factor/basis/compiler/tree/builder/builder.factor

63 lines
1.8 KiB
Factor
Raw Normal View History

2008-07-20 05:24:37 -04:00
! Copyright (C) 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2008-08-22 18:38:23 -04:00
USING: fry accessors quotations kernel sequences namespaces
assocs words arrays vectors hints combinators compiler.tree
stack-checker
stack-checker.state
stack-checker.errors
stack-checker.visitor
stack-checker.backend
stack-checker.recursive-state ;
2008-07-20 05:24:37 -04:00
IN: compiler.tree.builder
: with-tree-builder ( quot -- nodes )
2008-10-20 02:56:28 -04:00
'[ V{ } clone stack-visitor set @ ]
with-infer ; inline
: build-tree ( quot -- nodes )
#! Not safe to call from inference transforms.
[ f initial-recursive-state infer-quot ] with-tree-builder nip ;
: build-tree-with ( in-stack quot -- nodes out-stack )
#! Not safe to call from inference transforms.
[
[ >vector meta-d set ]
[ f initial-recursive-state infer-quot ] bi*
] with-tree-builder nip
unclip-last in-d>> ;
: build-sub-tree ( #call quot -- nodes )
2008-08-15 00:35:19 -04:00
[ [ out-d>> ] [ in-d>> ] bi ] dip build-tree-with
over ends-with-terminate?
[ drop swap [ f swap #push ] map append ]
[ rot #copy suffix ]
if ;
2008-08-15 00:35:19 -04:00
: (build-tree-from-word) ( word -- )
dup
[ "inline" word-prop ]
[ "recursive" word-prop ] bi and [
1quotation f initial-recursive-state infer-quot
2008-08-15 00:35:19 -04:00
] [
[ specialized-def ] [ initial-recursive-state ] bi
infer-quot
2008-08-15 00:35:19 -04:00
] if ;
: check-cannot-infer ( word -- )
2008-08-22 23:07:59 -04:00
dup "cannot-infer" word-prop [ cannot-infer-effect ] [ drop ] if ;
2008-08-15 00:35:19 -04:00
: check-no-compile ( word -- )
dup "no-compile" word-prop [ cannot-infer-effect ] [ drop ] if ;
: build-tree-from-word ( word -- effect nodes )
[
[
2008-08-15 00:35:19 -04:00
{
[ check-cannot-infer ]
[ check-no-compile ]
[ (build-tree-from-word) ]
[ finish-word ]
} cleave
] maybe-cannot-infer
] with-tree-builder ;