Merge git://factorcode.org/git/factor

db4
Eduardo Cavazos 2008-02-17 20:44:46 -06:00
commit 3d0e1c0b70
20 changed files with 74 additions and 51 deletions

View File

@ -78,7 +78,7 @@ nl
[ compiled-usages recompile ] recompile-hook set-global ; [ compiled-usages recompile ] recompile-hook set-global ;
: disable-compiler ( -- ) : disable-compiler ( -- )
[ [ f ] { } map>assoc modify-code-heap ] recompile-hook set-global ; [ default-recompile-hook ] recompile-hook set-global ;
enable-compiler enable-compiler

View File

@ -98,7 +98,7 @@ H{ } clone update-map set
[ [
over "type" word-prop dup over "type" word-prop dup
\ tag-mask get < \ tag \ type ? , , \ eq? , \ tag-mask get < \ tag \ type ? , , \ eq? ,
] [ ] make define-predicate ; ] [ ] make define-predicate* ;
: register-builtin ( class -- ) : register-builtin ( class -- )
dup "type" word-prop builtins get set-nth ; dup "type" word-prop builtins get set-nth ;

View File

@ -119,7 +119,7 @@ HELP: predicate-word
{ $values { "word" "a word" } { "predicate" "a predicate word" } } { $values { "word" "a word" } { "predicate" "a predicate word" } }
{ $description "Suffixes the word's name with \"?\" and creates a word with that name in the same vocabulary as the word itself." } ; { $description "Suffixes the word's name with \"?\" and creates a word with that name in the same vocabulary as the word itself." } ;
HELP: define-predicate HELP: define-predicate*
{ $values { "class" class } { "predicate" "a predicate word" } { "quot" "a quotation" } } { $values { "class" class } { "predicate" "a predicate word" } { "quot" "a quotation" } }
{ $description { $description
"Defines a predicate word. This is identical to a word definition associating " { $snippet "quot" } " with " { $snippet "predicate" } " with the added perk that three word properties are set:" "Defines a predicate word. This is identical to a word definition associating " { $snippet "quot" } " with " { $snippet "predicate" } " with the added perk that three word properties are set:"
@ -132,6 +132,13 @@ HELP: define-predicate
} }
$low-level-note ; $low-level-note ;
HELP: define-predicate
{ $values { "class" class } { "quot" "a quotation" } }
{ $description
"Defines a predicate word named " { $snippet "class?" } " with " { $link define-predicate* } "."
}
$low-level-note ;
HELP: superclass HELP: superclass
{ $values { "class" class } { "super" class } } { $values { "class" class } { "super" class } }
{ $description "Outputs the superclass of a class. All instances of this class are also instances of the superclass." } { $description "Outputs the superclass of a class. All instances of this class are also instances of the superclass." }

View File

@ -31,13 +31,16 @@ PREDICATE: class tuple-class
PREDICATE: word predicate "predicating" word-prop >boolean ; PREDICATE: word predicate "predicating" word-prop >boolean ;
: define-predicate ( class predicate quot -- ) : define-predicate* ( class predicate quot -- )
over [ over [
dupd predicate-effect define-declared dupd predicate-effect define-declared
2dup 1quotation "predicate" set-word-prop 2dup 1quotation "predicate" set-word-prop
swap "predicating" set-word-prop swap "predicating" set-word-prop
] [ ] [ 3drop ] if ;
3drop
: define-predicate ( class quot -- )
over "forgotten" word-prop [ 2drop ] [
>r dup predicate-word r> define-predicate*
] if ; ] if ;
: superclass ( class -- super ) : superclass ( class -- super )

2
core/classes/predicate/predicate.factor Normal file → Executable file
View File

@ -16,7 +16,7 @@ PREDICATE: class predicate-class
: define-predicate-class ( superclass class definition -- ) : define-predicate-class ( superclass class definition -- )
>r dup f roll predicate-class define-class r> >r dup f roll predicate-class define-class r>
dupd "predicate-definition" set-word-prop dupd "predicate-definition" set-word-prop
dup predicate-word over predicate-quot define-predicate ; dup predicate-quot define-predicate ;
M: predicate-class reset-class M: predicate-class reset-class
{ {

View File

@ -31,9 +31,7 @@ PREDICATE: class union-class
] if ; ] if ;
: define-union-predicate ( class -- ) : define-union-predicate ( class -- )
dup predicate-word dup members union-predicate-quot define-predicate ;
over members union-predicate-quot
define-predicate ;
M: union-class update-predicate define-union-predicate ; M: union-class update-predicate define-union-predicate ;

View File

@ -55,7 +55,9 @@ IN: compiler
H{ } clone compiled set H{ } clone compiled set
[ queue-compile ] each [ queue-compile ] each
compile-queue get compile-loop compile-queue get compile-loop
compiled get >alist modify-code-heap compiled get >alist
dup [ drop crossref? ] assoc-contains?
modify-code-heap
] with-scope ; inline ] with-scope ; inline
: compile ( words -- ) : compile ( words -- )
@ -70,4 +72,4 @@ IN: compiler
[ all-words recompile ] with-compiler-errors ; [ all-words recompile ] with-compiler-errors ;
: decompile ( word -- ) : decompile ( word -- )
f 2array 1array modify-code-heap ; f 2array 1array t modify-code-heap ;

View File

@ -77,6 +77,11 @@ GENERIC: definitions-changed ( assoc obj -- )
[ ] cleanup [ ] cleanup
] with-scope ; inline ] with-scope ; inline
: default-recompile-hook
[ f ] { } map>assoc
dup [ drop crossref? ] assoc-contains?
modify-code-heap ;
recompile-hook global recompile-hook global
[ [ [ f ] { } map>assoc modify-code-heap ] or ] [ [ default-recompile-hook ] or ]
change-at change-at

View File

@ -1,11 +1,11 @@
! Copyright (C) 2004, 2007 Slava Pestov. ! Copyright (C) 2004, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays definitions generic hashtables inspector io kernel USING: arrays definitions generic hashtables inspector io kernel
math namespaces prettyprint sequences assocs sequences.private math namespaces prettyprint sequences assocs sequences.private
strings io.styles vectors words system splitting math.parser strings io.styles vectors words system splitting math.parser
tuples continuations continuations.private combinators tuples continuations continuations.private combinators
generic.math io.streams.duplex classes compiler.units generic.math io.streams.duplex classes compiler.units
generic.standard ; generic.standard vocabs ;
IN: debugger IN: debugger
GENERIC: error. ( error -- ) GENERIC: error. ( error -- )
@ -254,3 +254,6 @@ M: no-compilation-unit error.
"Attempting to define " write "Attempting to define " write
no-compilation-unit-definition pprint no-compilation-unit-definition pprint
" outside of a compilation unit" print ; " outside of a compilation unit" print ;
M: no-vocab summary
drop "Vocabulary does not exist" ;

View File

@ -82,16 +82,16 @@ M: method-body stack-effect
[ <method-word> ] 3keep f \ method construct-boa [ <method-word> ] 3keep f \ method construct-boa
dup method-word over "method" set-word-prop ; dup method-word over "method" set-word-prop ;
: redefine-method ( quot method -- ) : redefine-method ( quot class generic -- )
2dup set-method-def [ method set-method-def ] 3keep
method-word swap define ; [ make-method-def ] 2keep
method method-word swap define ;
: define-method ( quot class generic -- ) : define-method ( quot class generic -- )
>r bootstrap-word r> >r bootstrap-word r>
2dup method dup [ 2dup method [
2nip redefine-method redefine-method
] [ ] [
drop
[ <method> ] 2keep [ <method> ] 2keep
[ set-at ] with-methods [ set-at ] with-methods
] if ; ] if ;

View File

@ -1,4 +1,4 @@
! Copyright (C) 2005, 2007 Slava Pestov. ! Copyright (C) 2005, 2008 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays assocs kernel kernel.private slots.private math USING: arrays assocs kernel kernel.private slots.private math
namespaces sequences vectors words quotations definitions namespaces sequences vectors words quotations definitions
@ -77,7 +77,6 @@ TUPLE: no-method object generic ;
class-predicates alist>quot ; class-predicates alist>quot ;
: small-generic ( methods -- def ) : small-generic ( methods -- def )
[ 1quotation ] assoc-map
object method-alist>quot ; object method-alist>quot ;
: hash-methods ( methods -- buckets ) : hash-methods ( methods -- buckets )
@ -110,7 +109,7 @@ TUPLE: no-method object generic ;
: build-type-vtable ( alist-seq -- alist-seq ) : build-type-vtable ( alist-seq -- alist-seq )
dup length [ dup length [
vtable-class vtable-class
swap [ word-def ] assoc-map simplify-alist swap simplify-alist
class-predicates alist>quot class-predicates alist>quot
] 2map ; ] 2map ;
@ -145,7 +144,8 @@ TUPLE: no-method object generic ;
] if ; ] if ;
: standard-methods ( word -- alist ) : standard-methods ( word -- alist )
dup methods swap default-method add* ; dup methods swap default-method add*
[ 1quotation ] assoc-map ;
M: standard-combination make-default-method M: standard-combination make-default-method
standard-combination-# (dispatch#) standard-combination-# (dispatch#)
@ -161,9 +161,6 @@ TUPLE: hook-combination var ;
C: <hook-combination> hook-combination C: <hook-combination> hook-combination
M: hook-combination method-prologue
2drop [ drop ] ;
: with-hook ( combination quot -- quot' ) : with-hook ( combination quot -- quot' )
0 (dispatch#) [ 0 (dispatch#) [
swap slip swap slip
@ -175,7 +172,11 @@ M: hook-combination make-default-method
[ error-method ] with-hook ; [ error-method ] with-hook ;
M: hook-combination perform-combination M: hook-combination perform-combination
[ standard-methods single-combination ] with-hook ; [
standard-methods
[ [ drop ] swap append ] assoc-map
single-combination
] with-hook ;
: define-simple-generic ( word -- ) : define-simple-generic ( word -- )
T{ standard-combination f 0 } define-generic ; T{ standard-combination f 0 } define-generic ;

View File

@ -10,7 +10,7 @@ namespaces.private parser prettyprint quotations
quotations.private sbufs sbufs.private sequences quotations.private sbufs sbufs.private sequences
sequences.private slots.private strings strings.private system sequences.private slots.private strings strings.private system
threads.private tuples tuples.private vectors vectors.private threads.private tuples tuples.private vectors vectors.private
words words.private assocs inspector ; words words.private assocs inspector compiler.units ;
IN: inference.known-words IN: inference.known-words
! Shuffle words ! Shuffle words
@ -598,3 +598,5 @@ set-primitive-effect
\ do-primitive [ \ do-primitive no-effect ] "infer" set-word-prop \ do-primitive [ \ do-primitive no-effect ] "infer" set-word-prop
\ dll-valid? { object } { object } <effect> set-primitive-effect \ dll-valid? { object } { object } <effect> set-primitive-effect
\ modify-code-heap { array object } { } <effect> set-primitive-effect

View File

@ -48,7 +48,14 @@ M: duplex-stream stream-read-quot
: listen ( -- ) : listen ( -- )
listener-hook get call prompt. listener-hook get call prompt.
[ read-quot [ call ] [ bye ] if* ] try ; [ read-quot [ try ] [ bye ] if* ]
[
dup parse-error? [
error-hook get call
] [
rethrow
] if
] recover ;
: until-quit ( -- ) : until-quit ( -- )
quit-flag get quit-flag get

View File

@ -63,6 +63,7 @@ DEFER: (flat-length)
: inline-standard-method ( node word -- node ) : inline-standard-method ( node word -- node )
2dup dispatching-class dup [ 2dup dispatching-class dup [
over +inlined+ depends-on
swap method method-word 1quotation f splice-quot swap method method-word 1quotation f splice-quot
] [ ] [
3drop t 3drop t

View File

@ -66,9 +66,7 @@ M: tuple-class tuple-size "slot-names" word-prop length 2 + ;
PRIVATE> PRIVATE>
: define-tuple-predicate ( class -- ) : define-tuple-predicate ( class -- )
dup predicate-word dup [ tuple-class-eq? ] curry define-predicate ;
over [ tuple-class-eq? ] curry
define-predicate ;
: delegate-slot-spec : delegate-slot-spec
T{ slot-spec f T{ slot-spec f

View File

@ -69,13 +69,6 @@ M: vocab-link vocab-root
vocab-tests % vocab-tests %
] { } make ; ] { } make ;
TUPLE: no-vocab name ;
: no-vocab ( name -- * )
vocab-name \ no-vocab construct-boa throw ;
M: no-vocab summary drop "Vocabulary does not exist" ;
SYMBOL: load-help? SYMBOL: load-help?
: source-was-loaded t swap set-vocab-source-loaded? ; : source-was-loaded t swap set-vocab-source-loaded? ;

View File

@ -1,4 +1,4 @@
! Copyright (C) 2007 Eduardo Cavazos, Slava Pestov. ! Copyright (C) 2007, 2008 Eduardo Cavazos, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: assocs strings kernel sorting namespaces sequences USING: assocs strings kernel sorting namespaces sequences
definitions ; definitions ;
@ -113,3 +113,8 @@ UNION: vocab-spec vocab vocab-link ;
vocab-name dictionary get delete-at ; vocab-name dictionary get delete-at ;
M: vocab-spec forget* forget-vocab ; M: vocab-spec forget* forget-vocab ;
TUPLE: no-vocab name ;
: no-vocab ( name -- * )
vocab-name \ no-vocab construct-boa throw ;

View File

@ -172,7 +172,9 @@ SYMBOL: changed-words
gensym dup rot define ; gensym dup rot define ;
: reveal ( word -- ) : reveal ( word -- )
dup word-name over word-vocabulary vocab-words set-at ; dup word-name over word-vocabulary dup vocab-words
[ ] [ no-vocab ] ?if
set-at ;
TUPLE: check-create name vocab ; TUPLE: check-create name vocab ;

View File

@ -7,7 +7,7 @@ IN: temporary
[ ] [ foo ] unit-test [ ] [ foo ] unit-test
! erg's bug ! erg's bug
GENERIC: some-generic GENERIC: some-generic ( a -- b )
M: integer some-generic 1+ ; M: integer some-generic 1+ ;

View File

@ -28,7 +28,7 @@ void *get_rel_symbol(F_REL *rel, CELL literals_start)
if(type_of(symbol) == BYTE_ARRAY_TYPE) if(type_of(symbol) == BYTE_ARRAY_TYPE)
{ {
F_CHAR *name = alien_offset(symbol); F_SYMBOL *name = alien_offset(symbol);
void *sym = ffi_dlsym(dll,name); void *sym = ffi_dlsym(dll,name);
if(sym) if(sym)
@ -40,7 +40,7 @@ void *get_rel_symbol(F_REL *rel, CELL literals_start)
F_ARRAY *names = untag_object(symbol); F_ARRAY *names = untag_object(symbol);
for(i = 0; i < array_capacity(names); i++) for(i = 0; i < array_capacity(names); i++)
{ {
F_CHAR *name = alien_offset(array_nth(names,i)); F_SYMBOL *name = alien_offset(array_nth(names,i));
void *sym = ffi_dlsym(dll,name); void *sym = ffi_dlsym(dll,name);
if(sym) if(sym)
@ -318,10 +318,9 @@ void default_word_code(F_WORD *word, bool relocate)
DEFINE_PRIMITIVE(modify_code_heap) DEFINE_PRIMITIVE(modify_code_heap)
{ {
bool rescan_code_heap = to_boolean(dpop());
F_ARRAY *alist = untag_array(dpop()); F_ARRAY *alist = untag_array(dpop());
bool rescan_code_heap = false;
CELL count = untag_fixnum_fast(alist->capacity); CELL count = untag_fixnum_fast(alist->capacity);
CELL i; CELL i;
for(i = 0; i < count; i++) for(i = 0; i < count; i++)
@ -330,9 +329,6 @@ DEFINE_PRIMITIVE(modify_code_heap)
F_WORD *word = untag_word(array_nth(pair,0)); F_WORD *word = untag_word(array_nth(pair,0));
if(word->vocabulary != F)
rescan_code_heap = true;
CELL data = array_nth(pair,1); CELL data = array_nth(pair,1);
if(data == F) if(data == F)