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 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 ] ;
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.
USING: slots arrays definitions generic hashtables summary io kernel
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: cannot-be-inline summary drop "This type of word cannot be inlined" ;
M: attempt-all-error summary drop "Nothing to attempt" ;
M: already-disposed summary drop "Attempting to operate on disposed object" ;

View File

@ -193,13 +193,12 @@ SYMBOL: interactive-vocabs
: with-interactive-vocabs ( quot -- )
[
<manifest> manifest set
"scratchpad" set-current-vocab
interactive-vocabs get only-use-vocabs
call
] with-scope ; inline
] with-manifest ; inline
: listener ( -- )
[ [ { } (listener) ] with-interactive-vocabs ] with-return ;
[ [ { } (listener) ] with-return ] with-interactive-vocabs ;
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
[ ] [ "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.
USING: parser kernel sequences words effects combinators assocs
definitions quotations namespaces memoize accessors
@ -23,6 +23,8 @@ SYNTAX: MACRO: (:) define-macro ;
PREDICATE: macro < word "macro" word-prop >boolean ;
M: macro make-inline cannot-be-inline ;
M: macro definer drop \ MACRO: \ ; ;
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.
USING: kernel layouts math math.order namespaces sequences
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
! For ranges with many elements, the default element-wise methods
! sequences define are unsuitable because they're O(n)
M: range equal? over range? [ tuple= ] [ 2drop f ] if ;
! We want M\ tuple hashcode, not M\ sequence hashcode here!
! sequences hashcode is O(n) in number of elements
M: range hashcode* tuple-hashcode ;
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
] with-compilation-unit
all-words drop
[
\ vocab tuple "slots" get
\ vocab identity-tuple "slots" get
define-tuple-class
] with-compilation-unit
] 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( -- ) ]
[ error>> bad-dispatch-position? ]
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.
USING: accessors arrays assocs classes classes.algebra
combinators definitions generic hashtables kernel
@ -16,6 +16,8 @@ TUPLE: single-combination ;
PREDICATE: single-generic < generic
"combination" word-prop single-combination? ;
M: single-generic make-inline cannot-be-inline ;
GENERIC: dispatch# ( word -- n )
M: generic dispatch# "combination" word-prop dispatch# ;

View File

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

View File

@ -1,5 +1,6 @@
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( -- ) ]
[ error>> T{ no-word-in-vocab { word "doesnotexist" } { vocab "kernel" } } = ]
@ -7,4 +8,44 @@ must-fail-with
[ "RENAME: doesnotexist kernel => newname" eval( -- ) ]
[ 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.
! See http://factorcode.org/license.txt for BSD license.
USING: assocs hashtables kernel namespaces sequences
sets strings vocabs sorting accessors arrays compiler.units
combinators vectors splitting continuations math
combinators vectors splitting continuations math words
parser.notes ;
IN: vocabs.parser
@ -26,7 +26,6 @@ current-vocab
{ search-vocab-names hashtable }
{ search-vocabs vector }
{ qualified-vocabs vector }
{ extra-words vector }
{ auto-used vector } ;
: <manifest> ( -- manifest )
@ -34,7 +33,6 @@ current-vocab
H{ } clone >>search-vocab-names
V{ } clone >>search-vocabs
V{ } clone >>qualified-vocabs
V{ } clone >>extra-words
V{ } clone >>auto-used ;
M: manifest clone
@ -42,7 +40,6 @@ M: manifest clone
[ clone ] change-search-vocab-names
[ clone ] change-search-vocabs
[ clone ] change-qualified-vocabs
[ clone ] change-extra-words
[ clone ] change-auto-used ;
TUPLE: extra-words words ;
@ -69,10 +66,16 @@ ERROR: no-word-in-vocab word vocab ;
: (from) ( vocab words -- vocab words words' vocab )
2dup swap load-vocab ;
: extract-words ( seq vocab -- assoc' )
: extract-words ( seq vocab -- assoc )
[ words>> extract-keys dup ] [ name>> ] bi
[ 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 )
at dup forward-reference? [ drop f ] when ;
@ -83,8 +86,7 @@ PRIVATE>
: set-current-vocab ( name -- )
create-vocab
[ manifest get (>>current-vocab) ]
[ words>> <extra-words> (add-qualified) ] bi ;
[ manifest get (>>current-vocab) ] [ (add-qualified) ] bi ;
: with-current-vocab ( name quot -- )
manifest get clone manifest [
@ -102,11 +104,11 @@ TUPLE: no-current-vocab ;
manifest get current-vocab>> [ no-current-vocab ] unless* ;
: begin-private ( -- )
manifest get current-vocab>> vocab-name ".private" ?tail
current-vocab name>> ".private" ?tail
[ drop ] [ ".private" append set-current-vocab ] if ;
: end-private ( -- )
manifest get current-vocab>> vocab-name ".private" ?tail
current-vocab name>> ".private" ?tail
[ set-current-vocab ] [ drop ] if ;
: using-vocab? ( vocab -- ? )
@ -137,10 +139,7 @@ TUPLE: no-current-vocab ;
TUPLE: qualified vocab prefix words ;
: <qualified> ( vocab prefix -- qualified )
2dup
[ load-vocab words>> ] [ CHAR: : suffix ] bi*
[ swap [ prepend ] dip ] curry assoc-map
qualified boa ;
(from) qualified-words qualified boa ;
: add-qualified ( vocab prefix -- )
<qualified> (add-qualified) ;
@ -156,7 +155,7 @@ TUPLE: from vocab names words ;
TUPLE: exclude vocab names words ;
: <exclude> ( vocab words -- from )
(from) [ nip words>> ] [ extract-words ] 2bi assoc-diff exclude boa ;
(from) excluding-words exclude boa ;
: add-words-excluding ( vocab words -- )
<exclude> (add-qualified) ;
@ -207,3 +206,45 @@ PRIVATE>
: search ( name -- word/f )
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 -- )
t "deprecated" set-word-prop ;
: make-inline ( word -- )
ERROR: cannot-be-inline word ;
GENERIC: make-inline ( word -- )
M: word make-inline
dup inline? [ drop ] [
[ t "inline" set-word-prop ]
[ changed-effect ]
@ -155,7 +159,12 @@ ERROR: bad-create name vocab ;
: create ( name vocab -- word )
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 )
[ "<" ">" surround ] dip create ;