Merge branch 'master' of git://github.com/slavapestov/factor

db4
erikc 2010-01-27 15:31:23 -08:00
commit a0e3f01a88
14 changed files with 139 additions and 35 deletions

View File

@ -53,3 +53,9 @@ IN: combinators.smart.tests
{ 2 0 } [ [ + ] nullary ] must-infer-as { 2 0 } [ [ + ] nullary ] must-infer-as
{ 2 2 } [ [ [ + ] nullary ] preserving ] must-infer-as { 2 2 } [ [ [ + ] nullary ] preserving ] must-infer-as
: smart-if-test ( a b -- b )
[ < ] [ swap - ] [ - ] smart-if ;
[ 7 ] [ 10 3 smart-if-test ] unit-test
[ 16 ] [ 25 41 smart-if-test ] unit-test

View File

@ -50,4 +50,4 @@ MACRO: nullary ( quot -- quot' )
dup outputs '[ @ _ ndrop ] ; dup outputs '[ @ _ ndrop ] ;
MACRO: smart-if ( pred true false -- ) MACRO: smart-if ( pred true false -- )
'[ _ preserving _ _ if ] ; inline '[ _ preserving _ _ if ] ;

View File

@ -1,4 +1,4 @@
! Copyright (C) 2004, 2009 Slava Pestov. ! Copyright (C) 2004, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: slots arrays definitions generic hashtables summary io kernel USING: slots arrays definitions generic hashtables summary io kernel
math namespaces make prettyprint prettyprint.config sequences assocs math namespaces make prettyprint prettyprint.config sequences assocs
@ -252,6 +252,8 @@ M: decode-error summary drop "Character decoding error" ;
M: bad-create summary drop "Bad parameters to create" ; M: bad-create summary drop "Bad parameters to create" ;
M: cannot-be-inline summary drop "This type of word cannot be inlined" ;
M: attempt-all-error summary drop "Nothing to attempt" ; M: attempt-all-error summary drop "Nothing to attempt" ;
M: already-disposed summary drop "Attempting to operate on disposed object" ; M: already-disposed summary drop "Attempting to operate on disposed object" ;

View File

@ -193,13 +193,12 @@ SYMBOL: interactive-vocabs
: with-interactive-vocabs ( quot -- ) : with-interactive-vocabs ( quot -- )
[ [
<manifest> manifest set
"scratchpad" set-current-vocab "scratchpad" set-current-vocab
interactive-vocabs get only-use-vocabs interactive-vocabs get only-use-vocabs
call call
] with-scope ; inline ] with-manifest ; inline
: listener ( -- ) : listener ( -- )
[ [ { } (listener) ] with-interactive-vocabs ] with-return ; [ [ { } (listener) ] with-return ] with-interactive-vocabs ;
MAIN: listener MAIN: listener

View File

@ -21,3 +21,5 @@ unit-test
[ ] [ "USING: macros stack-checker kernel ; IN: hanging-macro MACRO: c ( quot -- ) infer drop [ ] ; : a ( -- ) [ a ] c ;" eval( -- ) ] unit-test [ ] [ "USING: macros stack-checker kernel ; IN: hanging-macro MACRO: c ( quot -- ) infer drop [ ] ; : a ( -- ) [ a ] c ;" eval( -- ) ] unit-test
[ ] [ "IN: macros.tests USE: macros MACRO: foo ( -- x ) [ ] ;" eval( -- ) ] unit-test
[ "IN: macros.tests USE: macros MACRO: foo ( -- x ) [ ] ; inline" eval( -- ) ] must-fail

View File

@ -1,4 +1,4 @@
! Copyright (C) 2007, 2009 Slava Pestov. ! Copyright (C) 2007, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: parser kernel sequences words effects combinators assocs USING: parser kernel sequences words effects combinators assocs
definitions quotations namespaces memoize accessors definitions quotations namespaces memoize accessors
@ -23,6 +23,8 @@ SYNTAX: MACRO: (:) define-macro ;
PREDICATE: macro < word "macro" word-prop >boolean ; PREDICATE: macro < word "macro" word-prop >boolean ;
M: macro make-inline cannot-be-inline ;
M: macro definer drop \ MACRO: \ ; ; M: macro definer drop \ MACRO: \ ; ;
M: macro definition "macro" word-prop ; M: macro definition "macro" word-prop ;

View File

@ -1,4 +1,4 @@
! Copyright (C) 2008, 2009 Slava Pestov. ! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel layouts math math.order namespaces sequences USING: kernel layouts math math.order namespaces sequences
sequences.private accessors classes.tuple arrays ; sequences.private accessors classes.tuple arrays ;
@ -16,10 +16,8 @@ M: range length ( seq -- n ) length>> ; inline
M: range nth-unsafe ( n range -- obj ) [ step>> * ] keep from>> + ; inline M: range nth-unsafe ( n range -- obj ) [ step>> * ] keep from>> + ; inline
! For ranges with many elements, the default element-wise methods ! We want M\ tuple hashcode, not M\ sequence hashcode here!
! sequences define are unsuitable because they're O(n) ! sequences hashcode is O(n) in number of elements
M: range equal? over range? [ tuple= ] [ 2drop f ] if ;
M: range hashcode* tuple-hashcode ; M: range hashcode* tuple-hashcode ;
INSTANCE: range immutable-sequence INSTANCE: range immutable-sequence

View File

@ -443,14 +443,14 @@ TUPLE: redefinition-problem-2 ;
[ ] [ [ ] [
[ [
\ vocab tuple { "xxx" } "slots" get append \ vocab identity-tuple { "xxx" } "slots" get append
define-tuple-class define-tuple-class
] with-compilation-unit ] with-compilation-unit
all-words drop all-words drop
[ [
\ vocab tuple "slots" get \ vocab identity-tuple "slots" get
define-tuple-class define-tuple-class
] with-compilation-unit ] with-compilation-unit
] unit-test ] unit-test

View File

@ -282,3 +282,6 @@ M: growable call-next-hooker call-next-method "growable " prepend ;
[ "IN: generic.single.tests GENERIC# broken-generic# -1 ( a -- b )" eval( -- ) ] [ "IN: generic.single.tests GENERIC# broken-generic# -1 ( a -- b )" eval( -- ) ]
[ error>> bad-dispatch-position? ] [ error>> bad-dispatch-position? ]
must-fail-with must-fail-with
[ ] [ "IN: generic.single.tests GENERIC: foo ( -- x )" eval( -- ) ] unit-test
[ "IN: generic.single.tests GENERIC: foo ( -- x ) inline" eval( -- ) ] must-fail

View File

@ -1,4 +1,4 @@
! Copyright (C) 2009 Slava Pestov. ! Copyright (C) 2009, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays assocs classes classes.algebra USING: accessors arrays assocs classes classes.algebra
combinators definitions generic hashtables kernel combinators definitions generic hashtables kernel
@ -16,6 +16,8 @@ TUPLE: single-combination ;
PREDICATE: single-generic < generic PREDICATE: single-generic < generic
"combination" word-prop single-combination? ; "combination" word-prop single-combination? ;
M: single-generic make-inline cannot-be-inline ;
GENERIC: dispatch# ( word -- n ) GENERIC: dispatch# ( word -- n )
M: generic dispatch# "combination" word-prop dispatch# ; M: generic dispatch# "combination" word-prop dispatch# ;

View File

@ -111,11 +111,10 @@ SYMBOL: bootstrap-syntax
: with-file-vocabs ( quot -- ) : with-file-vocabs ( quot -- )
[ [
<manifest> manifest set
"syntax" use-vocab "syntax" use-vocab
bootstrap-syntax get [ use-words ] when* bootstrap-syntax get [ use-words ] when*
call call
] with-scope ; inline ] with-manifest ; inline
SYMBOL: print-use-hook SYMBOL: print-use-hook

View File

@ -1,5 +1,6 @@
IN: vocabs.parser.tests IN: vocabs.parser.tests
USING: vocabs.parser tools.test eval kernel accessors ; USING: vocabs.parser tools.test eval kernel accessors definitions
compiler.units words vocabs ;
[ "FROM: kernel => doesnotexist ;" eval( -- ) ] [ "FROM: kernel => doesnotexist ;" eval( -- ) ]
[ error>> T{ no-word-in-vocab { word "doesnotexist" } { vocab "kernel" } } = ] [ error>> T{ no-word-in-vocab { word "doesnotexist" } { vocab "kernel" } } = ]
@ -8,3 +9,43 @@ must-fail-with
[ "RENAME: doesnotexist kernel => newname" eval( -- ) ] [ "RENAME: doesnotexist kernel => newname" eval( -- ) ]
[ error>> T{ no-word-in-vocab { word "doesnotexist" } { vocab "kernel" } } = ] [ error>> T{ no-word-in-vocab { word "doesnotexist" } { vocab "kernel" } } = ]
must-fail-with must-fail-with
: aaa ( -- ) ;
[
[ ] [ "aaa" "vocabs.parser.tests" "uutt" add-renamed-word ] unit-test
[ ] [ "vocabs.parser.tests" dup add-qualified ] unit-test
[ aaa ] [ "uutt" search ] unit-test
[ aaa ] [ "vocabs.parser.tests:aaa" search ] unit-test
[ ] [ [ "bbb" "vocabs.parser.tests" create drop ] with-compilation-unit ] unit-test
[ "bbb" ] [ "vocabs.parser.tests:bbb" search name>> ] unit-test
[ ] [ [ \ aaa forget ] with-compilation-unit ] unit-test
[ ] [ [ "bbb" "vocabs.parser.tests" lookup forget ] with-compilation-unit ] unit-test
[ f ] [ "uutt" search ] unit-test
[ f ] [ "vocabs.parser.tests:aaa" search ] unit-test
[ ] [ "vocabs.parser.tests.foo" set-current-vocab ] unit-test
[ ] [ [ "bbb" current-vocab create drop ] with-compilation-unit ] unit-test
[ t ] [ "bbb" search >boolean ] unit-test
[ ] [ [ "vocabs.parser.tests.foo" forget-vocab ] with-compilation-unit ] unit-test
[ [ "bbb" current-vocab create drop ] with-compilation-unit ] [ error>> no-current-vocab? ] must-fail-with
[ begin-private ] [ error>> no-current-vocab? ] must-fail-with
[ end-private ] [ error>> no-current-vocab? ] must-fail-with
[ f ] [ "bbb" search >boolean ] unit-test
] with-manifest

View File

@ -1,9 +1,9 @@
! Copyright (C) 2007, 2009 Daniel Ehrenberg, Bruno Deferrari, ! Copyright (C) 2007, 2010 Daniel Ehrenberg, Bruno Deferrari,
! Slava Pestov. ! Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: assocs hashtables kernel namespaces sequences USING: assocs hashtables kernel namespaces sequences
sets strings vocabs sorting accessors arrays compiler.units sets strings vocabs sorting accessors arrays compiler.units
combinators vectors splitting continuations math combinators vectors splitting continuations math words
parser.notes ; parser.notes ;
IN: vocabs.parser IN: vocabs.parser
@ -26,7 +26,6 @@ current-vocab
{ search-vocab-names hashtable } { search-vocab-names hashtable }
{ search-vocabs vector } { search-vocabs vector }
{ qualified-vocabs vector } { qualified-vocabs vector }
{ extra-words vector }
{ auto-used vector } ; { auto-used vector } ;
: <manifest> ( -- manifest ) : <manifest> ( -- manifest )
@ -34,7 +33,6 @@ current-vocab
H{ } clone >>search-vocab-names H{ } clone >>search-vocab-names
V{ } clone >>search-vocabs V{ } clone >>search-vocabs
V{ } clone >>qualified-vocabs V{ } clone >>qualified-vocabs
V{ } clone >>extra-words
V{ } clone >>auto-used ; V{ } clone >>auto-used ;
M: manifest clone M: manifest clone
@ -42,7 +40,6 @@ M: manifest clone
[ clone ] change-search-vocab-names [ clone ] change-search-vocab-names
[ clone ] change-search-vocabs [ clone ] change-search-vocabs
[ clone ] change-qualified-vocabs [ clone ] change-qualified-vocabs
[ clone ] change-extra-words
[ clone ] change-auto-used ; [ clone ] change-auto-used ;
TUPLE: extra-words words ; TUPLE: extra-words words ;
@ -69,10 +66,16 @@ ERROR: no-word-in-vocab word vocab ;
: (from) ( vocab words -- vocab words words' vocab ) : (from) ( vocab words -- vocab words words' vocab )
2dup swap load-vocab ; 2dup swap load-vocab ;
: extract-words ( seq vocab -- assoc' ) : extract-words ( seq vocab -- assoc )
[ words>> extract-keys dup ] [ name>> ] bi [ words>> extract-keys dup ] [ name>> ] bi
[ swap [ 2drop ] [ no-word-in-vocab ] if ] curry assoc-each ; [ swap [ 2drop ] [ no-word-in-vocab ] if ] curry assoc-each ;
: excluding-words ( seq vocab -- assoc )
[ nip words>> ] [ extract-words ] 2bi assoc-diff ;
: qualified-words ( prefix vocab -- assoc )
words>> swap [ swap [ swap ":" glue ] dip ] curry assoc-map ;
: (lookup) ( name assoc -- word/f ) : (lookup) ( name assoc -- word/f )
at dup forward-reference? [ drop f ] when ; at dup forward-reference? [ drop f ] when ;
@ -83,8 +86,7 @@ PRIVATE>
: set-current-vocab ( name -- ) : set-current-vocab ( name -- )
create-vocab create-vocab
[ manifest get (>>current-vocab) ] [ manifest get (>>current-vocab) ] [ (add-qualified) ] bi ;
[ words>> <extra-words> (add-qualified) ] bi ;
: with-current-vocab ( name quot -- ) : with-current-vocab ( name quot -- )
manifest get clone manifest [ manifest get clone manifest [
@ -102,11 +104,11 @@ TUPLE: no-current-vocab ;
manifest get current-vocab>> [ no-current-vocab ] unless* ; manifest get current-vocab>> [ no-current-vocab ] unless* ;
: begin-private ( -- ) : begin-private ( -- )
manifest get current-vocab>> vocab-name ".private" ?tail current-vocab name>> ".private" ?tail
[ drop ] [ ".private" append set-current-vocab ] if ; [ drop ] [ ".private" append set-current-vocab ] if ;
: end-private ( -- ) : end-private ( -- )
manifest get current-vocab>> vocab-name ".private" ?tail current-vocab name>> ".private" ?tail
[ set-current-vocab ] [ drop ] if ; [ set-current-vocab ] [ drop ] if ;
: using-vocab? ( vocab -- ? ) : using-vocab? ( vocab -- ? )
@ -137,10 +139,7 @@ TUPLE: no-current-vocab ;
TUPLE: qualified vocab prefix words ; TUPLE: qualified vocab prefix words ;
: <qualified> ( vocab prefix -- qualified ) : <qualified> ( vocab prefix -- qualified )
2dup (from) qualified-words qualified boa ;
[ load-vocab words>> ] [ CHAR: : suffix ] bi*
[ swap [ prepend ] dip ] curry assoc-map
qualified boa ;
: add-qualified ( vocab prefix -- ) : add-qualified ( vocab prefix -- )
<qualified> (add-qualified) ; <qualified> (add-qualified) ;
@ -156,7 +155,7 @@ TUPLE: from vocab names words ;
TUPLE: exclude vocab names words ; TUPLE: exclude vocab names words ;
: <exclude> ( vocab words -- from ) : <exclude> ( vocab words -- from )
(from) [ nip words>> ] [ extract-words ] 2bi assoc-diff exclude boa ; (from) excluding-words exclude boa ;
: add-words-excluding ( vocab words -- ) : add-words-excluding ( vocab words -- )
<exclude> (add-qualified) ; <exclude> (add-qualified) ;
@ -207,3 +206,45 @@ PRIVATE>
: search ( name -- word/f ) : search ( name -- word/f )
manifest get search-manifest ; manifest get search-manifest ;
<PRIVATE
GENERIC: update ( search-path-elt -- valid? )
: trim-forgotten ( qualified-vocab -- valid? )
[ [ nip "forgotten" word-prop not ] assoc-filter ] change-words
words>> assoc-empty? not ;
M: from update trim-forgotten ;
M: rename update trim-forgotten ;
M: extra-words update trim-forgotten ;
M: exclude update trim-forgotten ;
M: qualified update
dup vocab>> vocab [
dup [ prefix>> ] [ vocab>> load-vocab ] bi qualified-words
>>words
] [ drop f ] if ;
M: vocab update dup name>> vocab eq? ;
: update-manifest ( manifest -- )
[ dup [ name>> vocab ] when ] change-current-vocab
[ [ drop vocab ] assoc-filter ] change-search-vocab-names
dup search-vocab-names>> keys [ vocab ] V{ } map-as >>search-vocabs
qualified-vocabs>> [ update ] filter! drop ;
M: manifest definitions-changed ( assoc manifest -- )
nip update-manifest ;
PRIVATE>
: with-manifest ( quot -- )
<manifest> manifest [
[ call ] [
[ manifest get add-definition-observer call ]
[ manifest get remove-definition-observer ]
[ ]
cleanup
] if-bootstrapping
] with-variable ; inline

View File

@ -87,7 +87,11 @@ M: word subwords drop f ;
: make-deprecated ( word -- ) : make-deprecated ( word -- )
t "deprecated" set-word-prop ; t "deprecated" set-word-prop ;
: make-inline ( word -- ) ERROR: cannot-be-inline word ;
GENERIC: make-inline ( word -- )
M: word make-inline
dup inline? [ drop ] [ dup inline? [ drop ] [
[ t "inline" set-word-prop ] [ t "inline" set-word-prop ]
[ changed-effect ] [ changed-effect ]
@ -155,7 +159,12 @@ ERROR: bad-create name vocab ;
: create ( name vocab -- word ) : create ( name vocab -- word )
check-create 2dup lookup check-create 2dup lookup
dup [ 2nip ] [ drop vocab-name <word> dup reveal ] if ; dup [ 2nip ] [
drop
vocab-name <word>
dup reveal
dup changed-definition
] if ;
: constructor-word ( name vocab -- word ) : constructor-word ( name vocab -- word )
[ "<" ">" surround ] dip create ; [ "<" ">" surround ] dip create ;