First stage of stack effect declaration implementation

slava 2006-08-15 07:01:24 +00:00
parent fbddcdcca0
commit 56e19dbf14
104 changed files with 794 additions and 702 deletions

View File

@ -16,17 +16,13 @@
- the invalid recursion form case needs to be fixed, for inlines too - the invalid recursion form case needs to be fixed, for inlines too
- graphical module manager tool - graphical module manager tool
- see if alien calls can be made faster - see if alien calls can be made faster
========================================================================
+ ui:
- fix ui listener delay
- doc front page: document stack effect notation - doc front page: document stack effect notation
- better doc for accumulate, link from tree - better doc for accumulate, link from tree
+ 0.85:
- fix ui listener delay
- we have trouble drawing rectangles - we have trouble drawing rectangles
- the UI listener has a shitty design. perhaps it should not call out
to the real listener.
- remaining walker tasks: - remaining walker tasks:
- integrate walker with listener - integrate walker with listener
- <input> handled by walker itself - <input> handled by walker itself
@ -35,6 +31,32 @@
- error handling is still screwy - error handling is still screwy
- continuation handling is also screwy - continuation handling is also screwy
- keyboard commands - keyboard commands
- editor:
- only redraw visible lines
- more efficient multi-line inserts
- editor should support stream output protocol
- slider needs to be modelized
- listener tab completion
- track individual method usages
- modularize core
- track module files and modification times, and a list of assets loaded
from that file
- 'changes' word, asks if files changed on disk from loaded modules
should be reloaded -- do this in the right order
- more compact relocation info
- UI dataflow visualizer
- loading the image should not exhaust nursery space
- problem if major gc happens during relocation
- in fact relocation should not cons at all
========================================================================
+ ui:
- figure out what goes in the .app and what doesn't
- should be possible to drop an image file on the .app to run it
- the UI listener has a shitty design. perhaps it should not call out
to the real listener.
- add-gadget, model-changed, set-model should compile - add-gadget, model-changed, set-model should compile
- shortcuts: - shortcuts:
- find a listener - find a listener
@ -50,9 +72,6 @@
- autoscroll - autoscroll
- page up/down - page up/down
- search and replace - search and replace
- only redraw visible lines
- more efficient multi-line inserts
- editor should support stream output protocol
- cocoa: windows are not updated while resizing - cocoa: windows are not updated while resizing
- grid slows down with 2000 lines - grid slows down with 2000 lines
- ui uses too much cpu time idling - ui uses too much cpu time idling
@ -64,31 +83,22 @@
- horizontal wheel scrolling - horizontal wheel scrolling
- polish OS X menu bar code - polish OS X menu bar code
- variable width word wrap - variable width word wrap
- slider needs to be modelized
- structure editor - structure editor
- listener tab completion - loading space invaders slows the UI down
+ module system: + module system:
- generic 'define ( asset def -- )' - generic 'define ( asset def -- )'
- track individual method usages
- C types should be words - C types should be words
- TYPEDEF: float { ... } { ... } ; ==> \ float T{ c-type ... } "c-type" swp - TYPEDEF: float { ... } { ... } ; ==> \ float T{ c-type ... } "c-type" swp
- TYPEDEF: float FTFloat ; ==> \ float \ FTFloat "c-type" swp - TYPEDEF: float FTFloat ; ==> \ float \ FTFloat "c-type" swp
- make typedef aliasing explicit - make typedef aliasing explicit
- seeing a C struct word should show its def - seeing a C struct word should show its def
- modularize core
- TUPLE: module files tests articles article main ; - TUPLE: module files tests articles article main ;
- file out - file out
- track module files and modification times, and a list of assets loaded
from that file
- 'changes' word, asks if files changed on disk from loaded modules
should be reloaded -- do this in the right order
+ compiler/ffi: + compiler/ffi:
- more compact relocation info
- UI dataflow visualizer
- ppc64 backend - ppc64 backend
- we need to optimize [ dup array? [ array? ] [ array? ] if ] - we need to optimize [ dup array? [ array? ] [ array? ] if ]
- mac intel: struct returns from objc methods - mac intel: struct returns from objc methods
@ -105,10 +115,8 @@
+ misc: + misc:
- loading the image should not exhaust nursery space - compiler tests are not as reliable now because of try-compile usage
- compiler tests are not as reliable now - we can just do [ t ] [ \ foo compiled? ] unit-test
- problem if major gc happens during relocation
- in fact relocation should not cons at all
- growable data heap - growable data heap
- incremental GC - incremental GC
- UDP - UDP
@ -124,5 +132,6 @@
[ 1 2 3 4 5 6 7 8 9 10 10 10 10 10 10 10 10 10 10 11 11 11 113 [ 1 2 3 4 5 6 7 8 9 10 10 10 10 10 10 10 10 10 10 11 11 11 113
] ]
- prettier printing of hashtable literals, alists, cond, ...
- httpd search tools - httpd search tools
- remaining HTML issues need fixing - remaining HTML issues need fixing

View File

@ -129,13 +129,13 @@ GENERIC: ' ( obj -- ptr )
dup length 1+ emit-fixnum dup length 1+ emit-fixnum
swap emit emit-seq ; swap emit emit-seq ;
M: bignum ' ( bignum -- tagged ) M: bignum '
#! This can only emit 0, -1 and 1. #! This can only emit 0, -1 and 1.
bignum-tag bignum-tag [ emit-bignum ] emit-object ; bignum-tag bignum-tag [ emit-bignum ] emit-object ;
( Fixnums ) ( Fixnums )
M: fixnum ' ( n -- tagged ) M: fixnum '
#! When generating a 32-bit image on a 64-bit system, #! When generating a 32-bit image on a 64-bit system,
#! some fixnums should be bignums. #! some fixnums should be bignums.
dup most-negative-fixnum most-positive-fixnum between? dup most-negative-fixnum most-positive-fixnum between?
@ -143,7 +143,7 @@ M: fixnum ' ( n -- tagged )
( Floats ) ( Floats )
M: float ' ( float -- tagged ) M: float '
float-tag float-tag [ float-tag float-tag [
align-here double>bits emit-64 align-here double>bits emit-64
] emit-object ; ] emit-object ;
@ -154,7 +154,7 @@ M: float ' ( float -- tagged )
: t, t t-offset fixup ; : t, t t-offset fixup ;
M: f ' ( obj -- ptr ) M: f '
#! f is #define F RETAG(0,OBJECT_TYPE) #! f is #define F RETAG(0,OBJECT_TYPE)
drop object-tag ; drop object-tag ;
@ -183,7 +183,7 @@ M: f ' ( obj -- ptr )
word-tag word-tag [ emit-seq ] emit-object word-tag word-tag [ emit-seq ] emit-object
swap objects get set-hash ; swap objects get set-hash ;
: word-error ( word msg -- ) : word-error ( word msg -- * )
[ % dup word-vocabulary % " " % word-name % ] "" make throw ; [ % dup word-vocabulary % " " % word-name % ] "" make throw ;
: transfer-word ( word -- word ) : transfer-word ( word -- word )
@ -197,11 +197,11 @@ M: f ' ( obj -- ptr )
: fixup-words ( -- ) : fixup-words ( -- )
image get [ dup word? [ fixup-word ] when ] inject ; image get [ dup word? [ fixup-word ] when ] inject ;
M: word ' ( word -- pointer ) ; M: word ' ;
( Wrappers ) ( Wrappers )
M: wrapper ' ( wrapper -- pointer ) M: wrapper '
wrapped ' wrapper-tag wrapper-tag [ emit ] emit-object ; wrapped ' wrapper-tag wrapper-tag [ emit ] emit-object ;
( Ratios and complexes ) ( Ratios and complexes )
@ -209,10 +209,10 @@ M: wrapper ' ( wrapper -- pointer )
: emit-pair : emit-pair
[ [ emit ] 2apply ] emit-object ; [ [ emit ] 2apply ] emit-object ;
M: ratio ' ( c -- tagged ) M: ratio '
>fraction [ ' ] 2apply ratio-tag ratio-tag emit-pair ; >fraction [ ' ] 2apply ratio-tag ratio-tag emit-pair ;
M: complex ' ( c -- tagged ) M: complex '
>rect [ ' ] 2apply complex-tag complex-tag emit-pair ; >rect [ ' ] 2apply complex-tag complex-tag emit-pair ;
( Strings ) ( Strings )
@ -231,7 +231,7 @@ M: complex ' ( c -- tagged )
pack-string emit-chars pack-string emit-chars
] emit-object ; ] emit-object ;
M: string ' ( string -- pointer ) M: string '
#! We pool strings so that each string is only written once #! We pool strings so that each string is only written once
#! to the image #! to the image
objects get [ emit-string ] cache ; objects get [ emit-string ] cache ;
@ -249,24 +249,24 @@ M: string ' ( string -- pointer )
dup first transfer-word 0 pick set-nth dup first transfer-word 0 pick set-nth
>tuple ; >tuple ;
M: tuple ' ( tuple -- pointer ) M: tuple '
transfer-tuple transfer-tuple
objects get [ tuple>array tuple-type emit-array ] cache ; objects get [ tuple>array tuple-type emit-array ] cache ;
M: array ' ( array -- pointer ) M: array '
array-type emit-array ; array-type emit-array ;
M: quotation ' ( array -- pointer ) M: quotation '
quotation-type emit-array ; quotation-type emit-array ;
M: vector ' ( vector -- pointer ) M: vector '
dup underlying ' swap length dup underlying ' swap length
vector-type object-tag [ vector-type object-tag [
emit-fixnum ( length ) emit-fixnum ( length )
emit ( array ptr ) emit ( array ptr )
] emit-object ; ] emit-object ;
M: sbuf ' ( sbuf -- pointer ) M: sbuf '
dup underlying ' swap length dup underlying ' swap length
sbuf-type object-tag [ sbuf-type object-tag [
emit-fixnum ( length ) emit-fixnum ( length )
@ -275,7 +275,7 @@ M: sbuf ' ( sbuf -- pointer )
( Hashes ) ( Hashes )
M: hashtable ' ( hashtable -- pointer ) M: hashtable '
[ hash-array ' ] keep [ hash-array ' ] keep
hashtable-type object-tag [ hashtable-type object-tag [
dup hash-count emit-fixnum dup hash-count emit-fixnum

View File

@ -21,12 +21,12 @@ M: byte-array clone (clone) ;
M: byte-array length array-capacity ; M: byte-array length array-capacity ;
M: byte-array resize resize-array ; M: byte-array resize resize-array ;
: 1array ( x -- { x } ) 1 swap <array> ; : 1array ( x -- array ) 1 swap <array> ;
: 2array ( x y -- { x y } ) : 2array ( x y -- array )
2 swap <array> [ 0 swap set-array-nth ] keep ; 2 swap <array> [ 0 swap set-array-nth ] keep ;
: 3array ( x y z -- { x y z } ) : 3array ( x y z -- array )
3 swap <array> 3 swap <array>
[ 1 swap set-array-nth ] keep [ 1 swap set-array-nth ] keep
[ 0 swap set-array-nth ] keep ; [ 0 swap set-array-nth ] keep ;

View File

@ -31,7 +31,7 @@ GENERIC: set-fill
TUPLE: bounds-error index seq ; TUPLE: bounds-error index seq ;
: bounds-error <bounds-error> throw ; : bounds-error ( n seq -- * ) <bounds-error> throw ;
: growable-check ( n seq -- n seq ) : growable-check ( n seq -- n seq )
over 0 < [ bounds-error ] when ; inline over 0 < [ bounds-error ] when ; inline

View File

@ -30,7 +30,7 @@ TUPLE: tombstone ;
: key@ ( key hash -- n ) : key@ ( key hash -- n )
hash-array 2dup hash@ (key@) ; inline hash-array 2dup hash@ (key@) ; inline
: if-key ( key hash true false -- | true: index key hash -- ) : if-key ( key hash true false -- ) | true ( index key hash -- )
>r >r [ key@ ] 2keep pick -1 > r> r> if ; inline >r >r [ key@ ] 2keep pick -1 > r> r> if ; inline
: <hash-array> ( n -- array ) : <hash-array> ( n -- array )
@ -75,10 +75,9 @@ TUPLE: tombstone ;
: (set-hash) ( value key hash -- ) : (set-hash) ( value key hash -- )
2dup new-key@ swap 2dup new-key@ swap
[ hash-array 2dup array-nth ] keep [ hash-array 2dup array-nth ] keep
( value key n hash-array old hash )
swap change-size set-nth-pair ; inline swap change-size set-nth-pair ; inline
: (each-pair) ( quot array i -- | quot: k v -- ) : (each-pair) ( quot array i -- ) | quot ( k v -- )
over array-capacity over eq? [ over array-capacity over eq? [
3drop 3drop
] [ ] [
@ -88,10 +87,10 @@ TUPLE: tombstone ;
] 3keep 2 fixnum+fast (each-pair) ] 3keep 2 fixnum+fast (each-pair)
] if ; inline ] if ; inline
: each-pair ( array quot -- | quot: k v -- ) : each-pair ( array quot -- ) | quot ( k v -- )
swap 0 (each-pair) ; inline swap 0 (each-pair) ; inline
: (all-pairs?) ( quot array i -- ? | quot: k v -- ? ) : (all-pairs?) ( quot array i -- ? ) | quot ( k v -- ? )
over array-capacity over eq? [ over array-capacity over eq? [
3drop t 3drop t
] [ ] [
@ -106,7 +105,7 @@ TUPLE: tombstone ;
] if ] if
] if ; inline ] if ; inline
: all-pairs? ( array quot -- ? | quot: k v -- ? ) : all-pairs? ( array quot -- ? ) | quot ( k v -- ? )
swap 0 (all-pairs?) ; inline swap 0 (all-pairs?) ; inline
: hash>seq ( i hash -- seq ) : hash>seq ( i hash -- seq )
@ -189,17 +188,17 @@ IN: hashtables
[ length <hashtable> ] keep [ length <hashtable> ] keep
[ first2 swap pick (set-hash) ] each ; [ first2 swap pick (set-hash) ] each ;
: hash-each ( hash quot -- | quot: k v -- ) : hash-each ( hash quot -- ) | quot ( k v -- )
>r hash-array r> each-pair ; inline >r hash-array r> each-pair ; inline
: hash-each-with ( obj hash quot -- | quot: obj k v -- ) : hash-each-with ( obj hash quot -- ) | quot ( obj k v -- )
swap [ 2swap [ >r -rot r> call ] 2keep ] hash-each 2drop ; swap [ 2swap [ >r -rot r> call ] 2keep ] hash-each 2drop ;
inline inline
: hash-all? ( hash quot -- | quot: k v -- ? ) : hash-all? ( hash quot -- ) | quot ( k v -- ? )
>r hash-array r> all-pairs? ; inline >r hash-array r> all-pairs? ; inline
: hash-all-with? ( obj hash quot -- | quot: obj k v -- ? ) : hash-all-with? ( obj hash quot -- ) | quot ( obj k v -- ? )
swap swap
[ 2swap [ >r -rot r> call ] 2keep rot ] hash-all? 2nip ; [ 2swap [ >r -rot r> call ] 2keep rot ] hash-all? 2nip ;
inline inline
@ -209,7 +208,7 @@ IN: hashtables
>r swap hash* [ r> = ] [ r> 2drop f ] if >r swap hash* [ r> = ] [ r> 2drop f ] if
] hash-all-with? ; ] hash-all-with? ;
: hash-subset ( hash quot -- hash | quot: k v -- ? ) : hash-subset ( hash quot -- hash ) | quot ( k v -- ? )
over hash-size <hashtable> rot [ over hash-size <hashtable> rot [
2swap [ 2swap [
>r pick pick >r >r call [ >r pick pick >r >r call [
@ -220,18 +219,18 @@ IN: hashtables
] 2keep ] 2keep
] hash-each nip ; inline ] hash-each nip ; inline
: hash-subset-with ( obj hash quot -- hash | quot: obj { k v } -- ? ) : hash-subset-with ( obj hash quot -- hash ) | quot ( obj pair -- ? )
swap swap
[ 2swap [ >r -rot r> call ] 2keep rot ] hash-subset 2nip ; [ 2swap [ >r -rot r> call ] 2keep rot ] hash-subset 2nip ;
inline inline
M: hashtable clone ( hash -- hash ) M: hashtable clone
(clone) dup hash-array clone over set-hash-array ; (clone) dup hash-array clone over set-hash-array ;
: hashtable= ( hash hash -- ? ) : hashtable= ( hash hash -- ? )
2dup subhash? >r swap subhash? r> and ; 2dup subhash? >r swap subhash? r> and ;
M: hashtable equal? ( obj hash -- ? ) M: hashtable equal?
{ {
{ [ over hashtable? not ] [ 2drop f ] } { [ over hashtable? not ] [ 2drop f ] }
{ [ 2dup [ hash-size ] 2apply number= not ] [ 2drop f ] } { [ 2dup [ hash-size ] 2apply number= not ] [ 2drop f ] }
@ -243,7 +242,7 @@ M: hashtable equal? ( obj hash -- ? )
hashcode >r hashcode -1 shift r> bitxor bitxor hashcode >r hashcode -1 shift r> bitxor bitxor
] hash-each ; ] hash-each ;
M: hashtable hashcode ( hash -- n ) M: hashtable hashcode
dup hash-size 1 number= dup hash-size 1 number=
[ hashtable-hashcode ] [ hash-size ] if ; [ hashtable-hashcode ] [ hash-size ] if ;
@ -293,14 +292,14 @@ IN: hashtables
: remove-all ( hash seq -- seq ) : remove-all ( hash seq -- seq )
[ swap hash-member? not ] subset-with ; [ swap hash-member? not ] subset-with ;
: cache ( key hash quot -- value | quot: key -- value ) : cache ( key hash quot -- value ) | quot ( key -- value )
pick pick hash [ pick pick hash [
>r 3drop r> >r 3drop r>
] [ ] [
pick rot >r >r call dup r> r> set-hash pick rot >r >r call dup r> r> set-hash
] if* ; inline ] if* ; inline
: map>hash ( seq quot -- hash | quot: key -- key value ) : map>hash ( seq quot -- hash ) | quot ( key -- key value )
over length <hashtable> rot over length <hashtable> rot
[ -rot [ >r call swap r> set-hash ] 2keep ] each nip ; [ -rot [ >r call swap r> set-hash ] 2keep ] each nip ;
inline inline

View File

@ -4,8 +4,8 @@ IN: kernel-internals
USING: vectors sequences ; USING: vectors sequences ;
: namestack* ( -- ns ) 3 getenv { vector } declare ; inline : namestack* ( -- ns ) 3 getenv { vector } declare ; inline
: >n ( namespace -- n:namespace ) namestack* push ; : >n ( namespace -- ) namestack* push ;
: n> ( n:namespace -- namespace ) namestack* pop ; : n> ( -- namespace ) namestack* pop ;
IN: namespaces IN: namespaces
USING: arrays hashtables kernel kernel-internals math strings USING: arrays hashtables kernel kernel-internals math strings
@ -14,7 +14,7 @@ words ;
: namestack ( -- ns ) namestack* clone ; inline : namestack ( -- ns ) namestack* clone ; inline
: set-namestack ( ns -- ) >vector 3 setenv ; inline : set-namestack ( ns -- ) >vector 3 setenv ; inline
: namespace ( -- namespace ) namestack* peek ; : namespace ( -- namespace ) namestack* peek ;
: ndrop ( n:namespace -- ) namestack* pop* ; : ndrop ( -- ) namestack* pop* ;
: global ( -- g ) 4 getenv { hashtable } declare ; inline : global ( -- g ) 4 getenv { hashtable } declare ; inline
: get ( variable -- value ) namestack* hash-stack ; : get ( variable -- value ) namestack* hash-stack ;
: set ( value variable -- ) namespace set-hash ; inline : set ( value variable -- ) namespace set-hash ; inline

View File

@ -34,7 +34,7 @@ C: queue ( -- queue ) ;
] if ; ] if ;
TUPLE: empty-queue ; TUPLE: empty-queue ;
: empty-queue <empty-queue> throw ; : empty-queue ( -- * ) <empty-queue> throw ;
: deque ( queue -- obj ) : deque ( queue -- obj )
dup queue-empty? [ dup queue-empty? [

View File

@ -4,13 +4,13 @@ IN: sequences
USING: arrays errors generic kernel kernel-internals math USING: arrays errors generic kernel kernel-internals math
sequences-internals strings vectors words ; sequences-internals strings vectors words ;
: first2 ( { x y } -- x y ) : first2 ( seq -- x y )
1 swap bounds-check nip first2-unsafe ; 1 swap bounds-check nip first2-unsafe ;
: first3 ( { x y z } -- x y z ) : first3 ( seq -- x y z )
2 swap bounds-check nip first3-unsafe ; 2 swap bounds-check nip first3-unsafe ;
: first4 ( { x y z w } -- x y z w ) : first4 ( seq -- x y z w )
3 swap bounds-check nip first4-unsafe ; 3 swap bounds-check nip first4-unsafe ;
M: object like drop ; M: object like drop ;
@ -129,21 +129,21 @@ M: object like drop ;
2dup [ length ] 2apply tuck number= 2dup [ length ] 2apply tuck number=
[ (mismatch) -1 number= ] [ 3drop f ] if ; inline [ (mismatch) -1 number= ] [ 3drop f ] if ; inline
M: array equal? ( obj seq -- ? ) M: array equal?
over array? [ sequence= ] [ 2drop f ] if ; over array? [ sequence= ] [ 2drop f ] if ;
M: quotation equal? ( obj seq -- ? ) M: quotation equal?
over quotation? [ sequence= ] [ 2drop f ] if ; over quotation? [ sequence= ] [ 2drop f ] if ;
M: sbuf equal? ( obj seq -- ? ) M: sbuf equal?
over sbuf? [ sequence= ] [ 2drop f ] if ; over sbuf? [ sequence= ] [ 2drop f ] if ;
M: vector equal? ( obj seq -- ? ) M: vector equal?
over vector? [ sequence= ] [ 2drop f ] if ; over vector? [ sequence= ] [ 2drop f ] if ;
UNION: sequence array string sbuf vector quotation ; UNION: sequence array string sbuf vector quotation ;
M: sequence hashcode ( hash -- n ) M: sequence hashcode
dup empty? [ drop 0 ] [ first hashcode ] if ; dup empty? [ drop 0 ] [ first hashcode ] if ;
IN: kernel IN: kernel
@ -155,7 +155,7 @@ M: object <=>
: depth ( -- n ) datastack length ; : depth ( -- n ) datastack length ;
TUPLE: no-cond ; TUPLE: no-cond ;
: no-cond <no-cond> throw ; : no-cond ( -- * ) <no-cond> throw ;
: cond ( conditions -- ) : cond ( conditions -- )
[ first call ] find nip dup [ second call ] [ no-cond ] if ; [ first call ] find nip dup [ second call ] [ no-cond ] if ;

View File

@ -6,7 +6,7 @@ USING: errors generic kernel math math-internals strings vectors ;
GENERIC: length ( sequence -- n ) GENERIC: length ( sequence -- n )
GENERIC: set-length ( n sequence -- ) GENERIC: set-length ( n sequence -- )
GENERIC: nth ( n sequence -- obj ) GENERIC: nth ( n sequence -- obj )
GENERIC: set-nth ( value n sequence -- obj ) GENERIC: set-nth ( value n sequence -- )
GENERIC: thaw ( seq -- mutable-seq ) GENERIC: thaw ( seq -- mutable-seq )
GENERIC: like ( seq seq -- seq ) GENERIC: like ( seq seq -- seq )
@ -33,8 +33,8 @@ IN: sequences-internals
GENERIC: resize ( n seq -- seq ) GENERIC: resize ( n seq -- seq )
! Unsafe sequence protocol for inner loops ! Unsafe sequence protocol for inner loops
GENERIC: nth-unsafe GENERIC: nth-unsafe ( n sequence -- elt )
GENERIC: set-nth-unsafe GENERIC: set-nth-unsafe ( elt n sequence -- )
M: object nth-unsafe nth ; M: object nth-unsafe nth ;
M: object set-nth-unsafe set-nth ; M: object set-nth-unsafe set-nth ;

View File

@ -4,7 +4,7 @@ IN: strings
USING: generic kernel kernel-internals math sequences USING: generic kernel kernel-internals math sequences
sequences-internals ; sequences-internals ;
M: string equal? ( obj str -- ? ) M: string equal?
over string? [ over string? [
over hashcode over hashcode number= over hashcode over hashcode number=
[ sequence= ] [ 2drop f ] if [ sequence= ] [ 2drop f ] if
@ -66,5 +66,5 @@ UNION: alpha Letter digit ;
M: string thaw drop SBUF" " clone ; M: string thaw drop SBUF" " clone ;
M: string like ( seq sbuf -- string ) M: string like
drop dup string? [ >string ] unless ; drop dup string? [ >string ] unless ;

View File

@ -4,17 +4,17 @@ IN: vectors
USING: arrays errors generic kernel kernel-internals math USING: arrays errors generic kernel kernel-internals math
math-internals sequences sequences-internals words ; math-internals sequences sequences-internals words ;
M: vector set-length ( len vec -- ) M: vector set-length
grow-length ; grow-length ;
M: vector nth-unsafe ( n vec -- obj ) underlying nth-unsafe ; M: vector nth-unsafe underlying nth-unsafe ;
M: vector nth ( n vec -- obj ) bounds-check nth-unsafe ; M: vector nth bounds-check nth-unsafe ;
M: vector set-nth-unsafe ( obj n vec -- ) M: vector set-nth-unsafe
underlying set-nth-unsafe ; underlying set-nth-unsafe ;
M: vector set-nth ( obj n vec -- ) M: vector set-nth
growable-check 2dup ensure set-nth-unsafe ; growable-check 2dup ensure set-nth-unsafe ;
: >vector ( seq -- vector ) : >vector ( seq -- vector )
@ -22,7 +22,7 @@ M: vector set-nth ( obj n vec -- )
M: object thaw drop V{ } clone ; M: object thaw drop V{ } clone ;
M: vector clone ( vector -- vector ) clone-growable ; M: vector clone clone-growable ;
M: vector like M: vector like
drop dup vector? [ drop dup vector? [

View File

@ -8,20 +8,20 @@ TUPLE: reversed seq ;
: reversed@ reversed-seq [ length swap - 1- ] keep ; inline : reversed@ reversed-seq [ length swap - 1- ] keep ; inline
M: reversed length ( seq -- n ) reversed-seq length ; M: reversed length reversed-seq length ;
M: reversed nth ( n seq -- elt ) reversed@ nth ; M: reversed nth reversed@ nth ;
M: reversed nth-unsafe ( n seq -- elt ) reversed@ nth-unsafe ; M: reversed nth-unsafe reversed@ nth-unsafe ;
M: reversed set-nth ( elt n seq -- ) reversed@ set-nth ; M: reversed set-nth reversed@ set-nth ;
M: reversed set-nth-unsafe ( elt n seq -- ) M: reversed set-nth-unsafe
reversed@ set-nth-unsafe ; reversed@ set-nth-unsafe ;
M: reversed like ( seq reversed -- seq ) reversed-seq like ; M: reversed like reversed-seq like ;
M: reversed thaw ( seq -- seq ) reversed-seq thaw ; M: reversed thaw reversed-seq thaw ;
: reverse ( seq -- seq ) [ <reversed> ] keep like ; : reverse ( seq -- seq ) [ <reversed> ] keep like ;
@ -32,7 +32,7 @@ TUPLE: slice seq from to ;
dup slice-from swap slice-seq >r tuck + >r + r> r> ; dup slice-from swap slice-seq >r tuck + >r + r> r> ;
TUPLE: slice-error reason ; TUPLE: slice-error reason ;
: slice-error ( str -- ) <slice-error> throw ; : slice-error ( str -- * ) <slice-error> throw ;
: check-slice ( from to seq -- ) : check-slice ( from to seq -- )
pick 0 < [ "start < 0" slice-error ] when pick 0 < [ "start < 0" slice-error ] when
@ -47,20 +47,20 @@ C: slice ( from to seq -- seq )
[ set-slice-to ] keep [ set-slice-to ] keep
[ set-slice-from ] keep ; [ set-slice-from ] keep ;
M: slice length ( range -- n ) M: slice length
dup slice-to swap slice-from - ; dup slice-to swap slice-from - ;
: slice@ ( n slice -- n seq ) : slice@ ( n slice -- n seq )
[ slice-from + ] keep slice-seq ; inline [ slice-from + ] keep slice-seq ; inline
M: slice nth ( n slice -- obj ) slice@ nth ; M: slice nth slice@ nth ;
M: slice nth-unsafe ( n slice -- obj ) slice@ nth-unsafe ; M: slice nth-unsafe slice@ nth-unsafe ;
M: slice set-nth ( obj n slice -- ) slice@ set-nth ; M: slice set-nth slice@ set-nth ;
M: slice set-nth-unsafe ( n slice -- obj ) slice@ set-nth-unsafe ; M: slice set-nth-unsafe slice@ set-nth-unsafe ;
M: slice like ( seq slice -- seq ) slice-seq like ; M: slice like slice-seq like ;
M: slice thaw ( seq -- seq ) slice-seq thaw ; M: slice thaw slice-seq thaw ;

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: alien IN: alien
USING: compiler errors generic hashtables inference inspector USING: compiler errors generic hashtables inference inspector
kernel namespaces sequences strings words ; kernel namespaces sequences strings words parser ;
TUPLE: alien-callback return parameters quot xt ; TUPLE: alien-callback return parameters quot xt ;
C: alien-callback make-node ; C: alien-callback make-node ;
@ -15,7 +15,7 @@ TUPLE: alien-callback-error ;
: callback-bottom ( node -- ) : callback-bottom ( node -- )
alien-callback-xt [ word-xt <alien> ] curry infer-quot ; alien-callback-xt [ word-xt <alien> ] curry infer-quot ;
\ alien-callback [ [ string object quotation ] [ alien ] ] \ alien-callback [ string object quotation ] [ alien ] <effect>
"infer-effect" set-word-prop "infer-effect" set-word-prop
\ alien-callback [ \ alien-callback [
@ -55,7 +55,7 @@ TUPLE: alien-callback-error ;
%return %return
] generate-1 ; ] generate-1 ;
M: alien-callback generate-node ( node -- ) M: alien-callback generate-node
end-basic-block compile-gc generate-callback iterate-next ; end-basic-block compile-gc generate-callback iterate-next ;
M: alien-callback stack-reserve* M: alien-callback stack-reserve*

View File

@ -4,7 +4,7 @@ IN: alien
USING: arrays assembler compiler compiler USING: arrays assembler compiler compiler
errors generic hashtables inference inspector errors generic hashtables inference inspector
io kernel kernel-internals math namespaces parser io kernel kernel-internals math namespaces parser
prettyprint sequences strings words ; prettyprint sequences strings words parser ;
TUPLE: alien-invoke library function return parameters ; TUPLE: alien-invoke library function return parameters ;
C: alien-invoke make-node ; C: alien-invoke make-node ;
@ -22,7 +22,7 @@ TUPLE: alien-invoke-error library symbol ;
: alien-invoke ( ... return library function parameters -- ... ) : alien-invoke ( ... return library function parameters -- ... )
pick pick <alien-invoke-error> throw ; pick pick <alien-invoke-error> throw ;
\ alien-invoke [ [ string object string object ] [ ] ] \ alien-invoke [ string object string object ] [ ] <effect>
"infer-effect" set-word-prop "infer-effect" set-word-prop
\ alien-invoke [ \ alien-invoke [
@ -60,7 +60,7 @@ TUPLE: alien-invoke-error library symbol ;
alien-invoke-parameters stack-space %cleanup alien-invoke-parameters stack-space %cleanup
] if ; ] if ;
M: alien-invoke generate-node ( node -- ) M: alien-invoke generate-node
end-basic-block compile-gc end-basic-block compile-gc
dup alien-invoke-parameters objects>registers dup alien-invoke-parameters objects>registers
dup alien-invoke-dlsym %alien-invoke dup alien-invoke-dlsym %alien-invoke

View File

@ -8,7 +8,7 @@ sequences ;
UNION: c-ptr byte-array alien ; UNION: c-ptr byte-array alien ;
M: alien equal? ( obj obj -- ? ) M: alien equal?
over alien? [ over alien? [
2dup [ expired? ] 2apply 2dup or [ 2dup [ expired? ] 2apply 2dup or [
2swap 2drop 2swap 2drop

View File

@ -119,7 +119,8 @@ H{ } clone objc-methods set-global
\ (send) [ pop-literal nip infer-send ] "infer" set-word-prop \ (send) [ pop-literal nip infer-send ] "infer" set-word-prop
\ (send) [ [ object object ] [ ] ] "infer-effect" set-word-prop \ (send) [ object object ] [ ] <effect>
"infer-effect" set-word-prop
: send ( ... selector -- ... ) f (send) ; inline : send ( ... selector -- ... ) f (send) ; inline

View File

@ -66,14 +66,14 @@ GENERIC: generate-node ( node -- )
[ [ generate-nodes ] with-node-iterator ] generate-1 ; [ [ generate-nodes ] with-node-iterator ] generate-1 ;
! node ! node
M: node generate-node ( node -- next ) drop iterate-next ; M: node generate-node drop iterate-next ;
! #label ! #label
: generate-call ( label -- next ) : generate-call ( label -- next )
end-basic-block end-basic-block
tail-call? [ %jump f ] [ %call iterate-next ] if ; tail-call? [ %jump f ] [ %call iterate-next ] if ;
M: #label generate-node ( node -- next ) M: #label generate-node
dup node-param dup generate-call >r dup node-param dup generate-call >r
swap node-child generate r> ; swap node-child generate r> ;
@ -87,7 +87,7 @@ M: #label generate-node ( node -- next )
r> r> end-false-branch resolve-label generate-nodes r> r> end-false-branch resolve-label generate-nodes
] keep resolve-label iterate-next ; ] keep resolve-label iterate-next ;
M: #if generate-node ( node -- next ) M: #if generate-node
[ [
end-basic-block end-basic-block
<label> dup %jump-t <label> dup %jump-t
@ -123,7 +123,7 @@ M: #if generate-node ( node -- next )
drop r> if>boolean-intrinsic iterate-next drop r> if>boolean-intrinsic iterate-next
] if ; ] if ;
M: #call generate-node ( node -- next ) M: #call generate-node
{ {
{ [ dup if-intrinsic ] [ do-if-intrinsic ] } { [ dup if-intrinsic ] [ do-if-intrinsic ] }
{ [ dup intrinsic ] [ intrinsic call iterate-next ] } { [ dup intrinsic ] [ intrinsic call iterate-next ] }
@ -131,7 +131,7 @@ M: #call generate-node ( node -- next )
} cond ; } cond ;
! #call-label ! #call-label
M: #call-label generate-node ( node -- next ) M: #call-label generate-node
node-param generate-call ; node-param generate-call ;
! #dispatch ! #dispatch
@ -150,7 +150,7 @@ M: #call-label generate-node ( node -- next )
dup %jump-label dup %jump-label
] each resolve-label ; ] each resolve-label ;
M: #dispatch generate-node ( node -- next ) M: #dispatch generate-node
#! The parameter is a list of nodes, each one is a branch to #! The parameter is a list of nodes, each one is a branch to
#! take in case the top of stack has that type. #! take in case the top of stack has that type.
dispatch-head dispatch-body iterate-next ; dispatch-head dispatch-body iterate-next ;
@ -164,7 +164,7 @@ UNION: immediate fixnum POSTPONE: f ;
[ f spec>vreg [ load-literal ] keep ] map [ f spec>vreg [ load-literal ] keep ] map
phantom-d get phantom-append ; phantom-d get phantom-append ;
M: #push generate-node ( #push -- ) M: #push generate-node
generate-push iterate-next ; generate-push iterate-next ;
! #shuffle ! #shuffle
@ -193,7 +193,7 @@ M: #push generate-node ( #push -- )
[ shuffle* ] keep adjust-shuffle [ shuffle* ] keep adjust-shuffle
(template-outputs) ; (template-outputs) ;
M: #shuffle generate-node ( #shuffle -- ) M: #shuffle generate-node
node-shuffle phantom-shuffle iterate-next ; node-shuffle phantom-shuffle iterate-next ;
! #return ! #return

View File

@ -87,7 +87,7 @@ M: phantom-callstack finalize-height
GENERIC: cut-phantom ( n phantom -- seq ) GENERIC: cut-phantom ( n phantom -- seq )
M: phantom-stack cut-phantom ( n phantom -- seq ) M: phantom-stack cut-phantom
[ delegate cut* swap ] keep set-delegate ; [ delegate cut* swap ] keep set-delegate ;
SYMBOL: phantom-d SYMBOL: phantom-d

View File

@ -21,8 +21,7 @@ C: label ( -- label ) ;
SYMBOL: compiled-xts SYMBOL: compiled-xts
: save-xt ( word xt -- ) : save-xt ( word xt -- )
over changed-words get remove-hash swap dup unchanged-word compiled-xts get set-hash ;
swap compiled-xts get set-hash ;
SYMBOL: literal-table SYMBOL: literal-table
@ -82,7 +81,7 @@ SYMBOL: label-table
: compiling? ( word -- ? ) : compiling? ( word -- ? )
{ {
{ [ dup compiled-xts get hash-member? ] [ drop t ] } { [ dup compiled-xts get hash-member? ] [ drop t ] }
{ [ dup changed-words get hash-member? ] [ drop f ] } { [ dup word-changed? ] [ drop f ] }
{ [ t ] [ compiled? ] } { [ t ] [ compiled? ] }
} cond ; } cond ;

View File

@ -28,9 +28,9 @@ M: node equal? eq? ;
: set-node-out-r node-shuffle set-shuffle-out-r ; : set-node-out-r node-shuffle set-shuffle-out-r ;
: empty-node f { } { } { } { } ; : empty-node f { } { } { } { } ;
: param-node ( label) { } { } { } { } ; : param-node { } { } { } { } ;
: in-node ( inputs) >r f r> { } { } { } ; : in-node >r f r> { } { } { } ;
: out-node ( outputs) >r f { } r> { } { } ; : out-node >r f { } r> { } { } ;
: meta-d-node meta-d get clone in-node ; : meta-d-node meta-d get clone in-node ;
: d-tail ( n -- list ) : d-tail ( n -- list )

View File

@ -11,11 +11,11 @@ SYMBOL: base-case-continuation
TUPLE: inference-error message rstate data-stack call-stack ; TUPLE: inference-error message rstate data-stack call-stack ;
: inference-error ( msg -- ) : inference-error ( msg -- * )
recursive-state get meta-d get meta-r get recursive-state get meta-d get meta-r get
<inference-error> throw ; <inference-error> throw ;
M: object value-literal ( value -- ) M: object value-literal
"A literal value was expected where a computed value was found" inference-error ; "A literal value was expected where a computed value was found" inference-error ;
! Word properties that affect inference: ! Word properties that affect inference:
@ -42,7 +42,7 @@ SYMBOL: d-in
: ensure-values ( n -- ) : ensure-values ( n -- )
meta-d [ add-inputs ] change d-in [ + ] change ; meta-d [ add-inputs ] change d-in [ + ] change ;
: effect ( -- { in# out# } ) : short-effect ( -- { in# out# } )
#! After inference is finished, collect information. #! After inference is finished, collect information.
d-in get meta-d get length 2array ; d-in get meta-d get length 2array ;
@ -50,6 +50,13 @@ SYMBOL: d-in
! stack height is irrelevant and the branch will always unify? ! stack height is irrelevant and the branch will always unify?
SYMBOL: terminated? SYMBOL: terminated?
: current-effect ( -- effect )
#! After inference is finished, collect information.
d-in get meta-d get length <effect>
terminated? get over set-effect-terminated? ;
SYMBOL: recorded
: init-inference ( recursive-state -- ) : init-inference ( recursive-state -- )
terminated? off terminated? off
V{ } clone meta-r set V{ } clone meta-r set
@ -76,9 +83,9 @@ M: wrapper apply-object wrapped apply-literal ;
GENERIC: infer-quot GENERIC: infer-quot
M: f infer-quot ( f -- ) drop ; M: f infer-quot drop ;
M: quotation infer-quot ( quot -- ) M: quotation infer-quot
#! Recursive calls to this word are made for nested #! Recursive calls to this word are made for nested
#! quotations. #! quotations.
[ apply-object terminated? get not ] all? drop ; [ apply-object terminated? get not ] all? drop ;
@ -97,16 +104,22 @@ M: quotation infer-quot ( quot -- )
: with-infer ( quot -- ) : with-infer ( quot -- )
[ [
base-case-continuation off [
{ } recursive-state set base-case-continuation off
f init-inference { } recursive-state set
call V{ } clone recorded set
check-return f init-inference
call
check-return
] [
recorded get dup . [ f "infer-effect" set-word-prop ] each
rethrow
] recover
] with-scope ; ] with-scope ;
: infer ( quot -- effect ) : infer ( quot -- effect )
#! Stack effect of a quotation. #! Stack effect of a quotation.
[ infer-quot effect ] with-infer ; [ infer-quot short-effect ] with-infer ;
: (dataflow) ( quot -- dataflow ) : (dataflow) ( quot -- dataflow )
infer-quot f #return node, dataflow-graph get ; infer-quot f #return node, dataflow-graph get ;

View File

@ -10,49 +10,49 @@ sequences strings vectors words prettyprint ;
dup #declare [ >r length d-tail r> set-node-in-d ] keep dup #declare [ >r length d-tail r> set-node-in-d ] keep
node, node,
] "infer" set-word-prop ] "infer" set-word-prop
\ declare [ [ object ] [ ] ] "infer-effect" set-word-prop \ declare { object } { } <effect> "infer-effect" set-word-prop
\ fixnum< [ [ fixnum fixnum ] [ object ] ] "infer-effect" set-word-prop \ fixnum< { fixnum fixnum } { object } <effect> "infer-effect" set-word-prop
\ fixnum< t "foldable" set-word-prop \ fixnum< t "foldable" set-word-prop
\ fixnum<= [ [ fixnum fixnum ] [ object ] ] "infer-effect" set-word-prop \ fixnum<= { fixnum fixnum } { object } <effect> "infer-effect" set-word-prop
\ fixnum<= t "foldable" set-word-prop \ fixnum<= t "foldable" set-word-prop
\ fixnum> [ [ fixnum fixnum ] [ object ] ] "infer-effect" set-word-prop \ fixnum> { fixnum fixnum } { object } <effect> "infer-effect" set-word-prop
\ fixnum> t "foldable" set-word-prop \ fixnum> t "foldable" set-word-prop
\ fixnum>= [ [ fixnum fixnum ] [ object ] ] "infer-effect" set-word-prop \ fixnum>= { fixnum fixnum } { object } <effect> "infer-effect" set-word-prop
\ fixnum>= t "foldable" set-word-prop \ fixnum>= t "foldable" set-word-prop
\ eq? [ [ object object ] [ object ] ] "infer-effect" set-word-prop \ eq? { object object } { object } <effect> "infer-effect" set-word-prop
\ eq? t "foldable" set-word-prop \ eq? t "foldable" set-word-prop
! Primitive combinators ! Primitive combinators
\ call [ [ object ] [ ] ] "infer-effect" set-word-prop \ call { object } { } <effect> "infer-effect" set-word-prop
\ call [ pop-literal infer-quot-value ] "infer" set-word-prop \ call [ pop-literal infer-quot-value ] "infer" set-word-prop
\ execute [ [ word ] [ ] ] "infer-effect" set-word-prop \ execute { word } { } <effect> "infer-effect" set-word-prop
\ execute [ \ execute [
pop-literal unit infer-quot-value pop-literal unit infer-quot-value
] "infer" set-word-prop ] "infer" set-word-prop
\ if [ [ object object object ] [ ] ] "infer-effect" set-word-prop \ if { object object object } { } <effect> "infer-effect" set-word-prop
\ if [ \ if [
2 #drop node, pop-d pop-d swap 2array 2 #drop node, pop-d pop-d swap 2array
#if pop-d drop infer-branches #if pop-d drop infer-branches
] "infer" set-word-prop ] "infer" set-word-prop
\ cond [ [ object ] [ ] ] "infer-effect" set-word-prop \ cond { object } { } <effect> "infer-effect" set-word-prop
\ cond [ \ cond [
pop-literal <reversed> pop-literal <reversed>
[ no-cond ] swap alist>quot infer-quot-value [ no-cond ] swap alist>quot infer-quot-value
] "infer" set-word-prop ] "infer" set-word-prop
\ dispatch [ [ fixnum array ] [ ] ] "infer-effect" set-word-prop \ dispatch { fixnum array } { } <effect> "infer-effect" set-word-prop
\ dispatch [ \ dispatch [
pop-literal nip [ <value> ] map pop-literal nip [ <value> ] map
@ -60,343 +60,340 @@ sequences strings vectors words prettyprint ;
] "infer" set-word-prop ] "infer" set-word-prop
! Non-standard control flow ! Non-standard control flow
\ throw [ [ object ] [ ] ] "infer-effect" set-word-prop \ throw { object } { } <effect>
t over set-effect-terminated?
\ throw [ "infer-effect" set-word-prop
\ throw dup "infer-effect" word-prop consume/produce
terminate
] "infer" set-word-prop
! Stack effects for all primitives ! Stack effects for all primitives
\ <vector> [ [ integer ] [ vector ] ] "infer-effect" set-word-prop \ <vector> { integer } { vector } <effect> "infer-effect" set-word-prop
\ rehash-string [ [ string ] [ ] ] "infer-effect" set-word-prop \ rehash-string { string } { } <effect> "infer-effect" set-word-prop
\ <sbuf> [ [ integer ] [ sbuf ] ] "infer-effect" set-word-prop \ <sbuf> { integer } { sbuf } <effect> "infer-effect" set-word-prop
\ >fixnum [ [ real ] [ fixnum ] ] "infer-effect" set-word-prop \ >fixnum { real } { fixnum } <effect> "infer-effect" set-word-prop
\ >fixnum t "foldable" set-word-prop \ >fixnum t "foldable" set-word-prop
\ >bignum [ [ real ] [ bignum ] ] "infer-effect" set-word-prop \ >bignum { real } { bignum } <effect> "infer-effect" set-word-prop
\ >bignum t "foldable" set-word-prop \ >bignum t "foldable" set-word-prop
\ >float [ [ real ] [ float ] ] "infer-effect" set-word-prop \ >float { real } { float } <effect> "infer-effect" set-word-prop
\ >float t "foldable" set-word-prop \ >float t "foldable" set-word-prop
\ (fraction>) [ [ integer integer ] [ rational ] ] "infer-effect" set-word-prop \ (fraction>) { integer integer } { rational } <effect> "infer-effect" set-word-prop
\ (fraction>) t "foldable" set-word-prop \ (fraction>) t "foldable" set-word-prop
\ string>float [ [ string ] [ float ] ] "infer-effect" set-word-prop \ string>float { string } { float } <effect> "infer-effect" set-word-prop
\ string>float t "foldable" set-word-prop \ string>float t "foldable" set-word-prop
\ float>string [ [ float ] [ string ] ] "infer-effect" set-word-prop \ float>string { float } { string } <effect> "infer-effect" set-word-prop
\ float>string t "foldable" set-word-prop \ float>string t "foldable" set-word-prop
\ float>bits [ [ real ] [ integer ] ] "infer-effect" set-word-prop \ float>bits { real } { integer } <effect> "infer-effect" set-word-prop
\ float>bits t "foldable" set-word-prop \ float>bits t "foldable" set-word-prop
\ double>bits [ [ real ] [ integer ] ] "infer-effect" set-word-prop \ double>bits { real } { integer } <effect> "infer-effect" set-word-prop
\ double>bits t "foldable" set-word-prop \ double>bits t "foldable" set-word-prop
\ bits>float [ [ integer ] [ float ] ] "infer-effect" set-word-prop \ bits>float { integer } { float } <effect> "infer-effect" set-word-prop
\ bits>float t "foldable" set-word-prop \ bits>float t "foldable" set-word-prop
\ bits>double [ [ integer ] [ float ] ] "infer-effect" set-word-prop \ bits>double { integer } { float } <effect> "infer-effect" set-word-prop
\ bits>double t "foldable" set-word-prop \ bits>double t "foldable" set-word-prop
\ <complex> [ [ real real ] [ number ] ] "infer-effect" set-word-prop \ <complex> { real real } { number } <effect> "infer-effect" set-word-prop
\ <complex> t "foldable" set-word-prop \ <complex> t "foldable" set-word-prop
\ fixnum+ [ [ fixnum fixnum ] [ integer ] ] "infer-effect" set-word-prop \ fixnum+ { fixnum fixnum } { integer } <effect> "infer-effect" set-word-prop
\ fixnum+ t "foldable" set-word-prop \ fixnum+ t "foldable" set-word-prop
\ fixnum+fast [ [ fixnum fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum+fast { fixnum fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum+fast t "foldable" set-word-prop \ fixnum+fast t "foldable" set-word-prop
\ fixnum- [ [ fixnum fixnum ] [ integer ] ] "infer-effect" set-word-prop \ fixnum- { fixnum fixnum } { integer } <effect> "infer-effect" set-word-prop
\ fixnum- t "foldable" set-word-prop \ fixnum- t "foldable" set-word-prop
\ fixnum-fast [ [ fixnum fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum-fast { fixnum fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum-fast t "foldable" set-word-prop \ fixnum-fast t "foldable" set-word-prop
\ fixnum* [ [ fixnum fixnum ] [ integer ] ] "infer-effect" set-word-prop \ fixnum* { fixnum fixnum } { integer } <effect> "infer-effect" set-word-prop
\ fixnum* t "foldable" set-word-prop \ fixnum* t "foldable" set-word-prop
\ fixnum/i [ [ fixnum fixnum ] [ integer ] ] "infer-effect" set-word-prop \ fixnum/i { fixnum fixnum } { integer } <effect> "infer-effect" set-word-prop
\ fixnum/i t "foldable" set-word-prop \ fixnum/i t "foldable" set-word-prop
\ fixnum/f [ [ fixnum fixnum ] [ float ] ] "infer-effect" set-word-prop \ fixnum/f { fixnum fixnum } { float } <effect> "infer-effect" set-word-prop
\ fixnum/f t "foldable" set-word-prop \ fixnum/f t "foldable" set-word-prop
\ fixnum-mod [ [ fixnum fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum-mod { fixnum fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum-mod t "foldable" set-word-prop \ fixnum-mod t "foldable" set-word-prop
\ fixnum/mod [ [ fixnum fixnum ] [ integer fixnum ] ] "infer-effect" set-word-prop \ fixnum/mod { fixnum fixnum } { integer fixnum } <effect> "infer-effect" set-word-prop
\ fixnum/mod t "foldable" set-word-prop \ fixnum/mod t "foldable" set-word-prop
\ fixnum-bitand [ [ fixnum fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum-bitand { fixnum fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum-bitand t "foldable" set-word-prop \ fixnum-bitand t "foldable" set-word-prop
\ fixnum-bitor [ [ fixnum fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum-bitor { fixnum fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum-bitor t "foldable" set-word-prop \ fixnum-bitor t "foldable" set-word-prop
\ fixnum-bitxor [ [ fixnum fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum-bitxor { fixnum fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum-bitxor t "foldable" set-word-prop \ fixnum-bitxor t "foldable" set-word-prop
\ fixnum-bitnot [ [ fixnum ] [ fixnum ] ] "infer-effect" set-word-prop \ fixnum-bitnot { fixnum } { fixnum } <effect> "infer-effect" set-word-prop
\ fixnum-bitnot t "foldable" set-word-prop \ fixnum-bitnot t "foldable" set-word-prop
\ fixnum-shift [ [ fixnum fixnum ] [ integer ] ] "infer-effect" set-word-prop \ fixnum-shift { fixnum fixnum } { integer } <effect> "infer-effect" set-word-prop
\ fixnum-shift t "foldable" set-word-prop \ fixnum-shift t "foldable" set-word-prop
\ bignum= [ [ bignum bignum ] [ object ] ] "infer-effect" set-word-prop \ bignum= { bignum bignum } { object } <effect> "infer-effect" set-word-prop
\ bignum= t "foldable" set-word-prop \ bignum= t "foldable" set-word-prop
\ bignum+ [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum+ { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum+ t "foldable" set-word-prop \ bignum+ t "foldable" set-word-prop
\ bignum- [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum- { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum- t "foldable" set-word-prop \ bignum- t "foldable" set-word-prop
\ bignum* [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum* { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum* t "foldable" set-word-prop \ bignum* t "foldable" set-word-prop
\ bignum/i [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum/i { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum/i t "foldable" set-word-prop \ bignum/i t "foldable" set-word-prop
\ bignum/f [ [ bignum bignum ] [ float ] ] "infer-effect" set-word-prop \ bignum/f { bignum bignum } { float } <effect> "infer-effect" set-word-prop
\ bignum/f t "foldable" set-word-prop \ bignum/f t "foldable" set-word-prop
\ bignum-mod [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum-mod { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum-mod t "foldable" set-word-prop \ bignum-mod t "foldable" set-word-prop
\ bignum/mod [ [ bignum bignum ] [ bignum bignum ] ] "infer-effect" set-word-prop \ bignum/mod { bignum bignum } { bignum bignum } <effect> "infer-effect" set-word-prop
\ bignum/mod t "foldable" set-word-prop \ bignum/mod t "foldable" set-word-prop
\ bignum-bitand [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum-bitand { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum-bitand t "foldable" set-word-prop \ bignum-bitand t "foldable" set-word-prop
\ bignum-bitor [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum-bitor { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum-bitor t "foldable" set-word-prop \ bignum-bitor t "foldable" set-word-prop
\ bignum-bitxor [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum-bitxor { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum-bitxor t "foldable" set-word-prop \ bignum-bitxor t "foldable" set-word-prop
\ bignum-bitnot [ [ bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum-bitnot { bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum-bitnot t "foldable" set-word-prop \ bignum-bitnot t "foldable" set-word-prop
\ bignum-shift [ [ bignum bignum ] [ bignum ] ] "infer-effect" set-word-prop \ bignum-shift { bignum bignum } { bignum } <effect> "infer-effect" set-word-prop
\ bignum-shift t "foldable" set-word-prop \ bignum-shift t "foldable" set-word-prop
\ bignum< [ [ bignum bignum ] [ object ] ] "infer-effect" set-word-prop \ bignum< { bignum bignum } { object } <effect> "infer-effect" set-word-prop
\ bignum< t "foldable" set-word-prop \ bignum< t "foldable" set-word-prop
\ bignum<= [ [ bignum bignum ] [ object ] ] "infer-effect" set-word-prop \ bignum<= { bignum bignum } { object } <effect> "infer-effect" set-word-prop
\ bignum<= t "foldable" set-word-prop \ bignum<= t "foldable" set-word-prop
\ bignum> [ [ bignum bignum ] [ object ] ] "infer-effect" set-word-prop \ bignum> { bignum bignum } { object } <effect> "infer-effect" set-word-prop
\ bignum> t "foldable" set-word-prop \ bignum> t "foldable" set-word-prop
\ bignum>= [ [ bignum bignum ] [ object ] ] "infer-effect" set-word-prop \ bignum>= { bignum bignum } { object } <effect> "infer-effect" set-word-prop
\ bignum>= t "foldable" set-word-prop \ bignum>= t "foldable" set-word-prop
\ float+ [ [ float float ] [ float ] ] "infer-effect" set-word-prop \ float+ { float float } { float } <effect> "infer-effect" set-word-prop
\ float+ t "foldable" set-word-prop \ float+ t "foldable" set-word-prop
\ float- [ [ float float ] [ float ] ] "infer-effect" set-word-prop \ float- { float float } { float } <effect> "infer-effect" set-word-prop
\ float- t "foldable" set-word-prop \ float- t "foldable" set-word-prop
\ float* [ [ float float ] [ float ] ] "infer-effect" set-word-prop \ float* { float float } { float } <effect> "infer-effect" set-word-prop
\ float* t "foldable" set-word-prop \ float* t "foldable" set-word-prop
\ float/f [ [ float float ] [ float ] ] "infer-effect" set-word-prop \ float/f { float float } { float } <effect> "infer-effect" set-word-prop
\ float/f t "foldable" set-word-prop \ float/f t "foldable" set-word-prop
\ float< [ [ float float ] [ object ] ] "infer-effect" set-word-prop \ float< { float float } { object } <effect> "infer-effect" set-word-prop
\ float< t "foldable" set-word-prop \ float< t "foldable" set-word-prop
\ float-mod [ [ float float ] [ float ] ] "infer-effect" set-word-prop \ float-mod { float float } { float } <effect> "infer-effect" set-word-prop
\ float-mod t "foldable" set-word-prop \ float-mod t "foldable" set-word-prop
\ float<= [ [ float float ] [ object ] ] "infer-effect" set-word-prop \ float<= { float float } { object } <effect> "infer-effect" set-word-prop
\ float<= t "foldable" set-word-prop \ float<= t "foldable" set-word-prop
\ float> [ [ float float ] [ object ] ] "infer-effect" set-word-prop \ float> { float float } { object } <effect> "infer-effect" set-word-prop
\ float> t "foldable" set-word-prop \ float> t "foldable" set-word-prop
\ float>= [ [ float float ] [ object ] ] "infer-effect" set-word-prop \ float>= { float float } { object } <effect> "infer-effect" set-word-prop
\ float>= t "foldable" set-word-prop \ float>= t "foldable" set-word-prop
\ facos [ [ real ] [ float ] ] "infer-effect" set-word-prop \ facos { real } { float } <effect> "infer-effect" set-word-prop
\ facos t "foldable" set-word-prop \ facos t "foldable" set-word-prop
\ fasin [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fasin { real } { float } <effect> "infer-effect" set-word-prop
\ fasin t "foldable" set-word-prop \ fasin t "foldable" set-word-prop
\ fatan [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fatan { real } { float } <effect> "infer-effect" set-word-prop
\ fatan t "foldable" set-word-prop \ fatan t "foldable" set-word-prop
\ fatan2 [ [ real real ] [ float ] ] "infer-effect" set-word-prop \ fatan2 { real real } { float } <effect> "infer-effect" set-word-prop
\ fatan2 t "foldable" set-word-prop \ fatan2 t "foldable" set-word-prop
\ fcos [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fcos { real } { float } <effect> "infer-effect" set-word-prop
\ fcos t "foldable" set-word-prop \ fcos t "foldable" set-word-prop
\ fexp [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fexp { real } { float } <effect> "infer-effect" set-word-prop
\ fexp t "foldable" set-word-prop \ fexp t "foldable" set-word-prop
\ fcosh [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fcosh { real } { float } <effect> "infer-effect" set-word-prop
\ fcosh t "foldable" set-word-prop \ fcosh t "foldable" set-word-prop
\ flog [ [ real ] [ float ] ] "infer-effect" set-word-prop \ flog { real } { float } <effect> "infer-effect" set-word-prop
\ flog t "foldable" set-word-prop \ flog t "foldable" set-word-prop
\ fpow [ [ real real ] [ float ] ] "infer-effect" set-word-prop \ fpow { real real } { float } <effect> "infer-effect" set-word-prop
\ fpow t "foldable" set-word-prop \ fpow t "foldable" set-word-prop
\ fsin [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fsin { real } { float } <effect> "infer-effect" set-word-prop
\ fsin t "foldable" set-word-prop \ fsin t "foldable" set-word-prop
\ fsinh [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fsinh { real } { float } <effect> "infer-effect" set-word-prop
\ fsinh t "foldable" set-word-prop \ fsinh t "foldable" set-word-prop
\ fsqrt [ [ real ] [ float ] ] "infer-effect" set-word-prop \ fsqrt { real } { float } <effect> "infer-effect" set-word-prop
\ fsqrt t "foldable" set-word-prop \ fsqrt t "foldable" set-word-prop
\ (word) [ [ object object ] [ word ] ] "infer-effect" set-word-prop \ (word) { object object } { word } <effect> "infer-effect" set-word-prop
\ update-xt [ [ word ] [ ] ] "infer-effect" set-word-prop \ update-xt { word } { } <effect> "infer-effect" set-word-prop
\ compiled? [ [ word ] [ object ] ] "infer-effect" set-word-prop \ compiled? { word } { object } <effect> "infer-effect" set-word-prop
\ getenv [ [ fixnum ] [ object ] ] "infer-effect" set-word-prop \ getenv { fixnum } { object } <effect> "infer-effect" set-word-prop
\ setenv [ [ object fixnum ] [ ] ] "infer-effect" set-word-prop \ setenv { object fixnum } { } <effect> "infer-effect" set-word-prop
\ stat [ [ string ] [ object ] ] "infer-effect" set-word-prop \ stat { string } { object } <effect> "infer-effect" set-word-prop
\ (directory) [ [ string ] [ array ] ] "infer-effect" set-word-prop \ (directory) { string } { array } <effect> "infer-effect" set-word-prop
\ gc [ [ integer ] [ ] ] "infer-effect" set-word-prop \ gc { integer } { } <effect> "infer-effect" set-word-prop
\ gc-time [ [ ] [ integer ] ] "infer-effect" set-word-prop \ gc-time { } { integer } <effect> "infer-effect" set-word-prop
\ save-image [ [ string ] [ ] ] "infer-effect" set-word-prop \ save-image { string } { } <effect> "infer-effect" set-word-prop
\ exit [ [ integer ] [ ] ] "infer-effect" set-word-prop \ exit { integer } { } <effect> "infer-effect" set-word-prop
\ room [ [ ] [ integer integer integer integer array ] ] "infer-effect" set-word-prop \ room { } { integer integer integer integer array } <effect> "infer-effect" set-word-prop
\ os-env [ [ string ] [ object ] ] "infer-effect" set-word-prop \ os-env { string } { object } <effect> "infer-effect" set-word-prop
\ millis [ [ ] [ integer ] ] "infer-effect" set-word-prop \ millis { } { integer } <effect> "infer-effect" set-word-prop
\ type [ [ object ] [ fixnum ] ] "infer-effect" set-word-prop \ type { object } { fixnum } <effect> "infer-effect" set-word-prop
\ type t "foldable" set-word-prop \ type t "foldable" set-word-prop
\ tag [ [ object ] [ fixnum ] ] "infer-effect" set-word-prop \ tag { object } { fixnum } <effect> "infer-effect" set-word-prop
\ tag t "foldable" set-word-prop \ tag t "foldable" set-word-prop
\ cwd [ [ ] [ string ] ] "infer-effect" set-word-prop \ cwd { } { string } <effect> "infer-effect" set-word-prop
\ cd [ [ string ] [ ] ] "infer-effect" set-word-prop \ cd { string } { } <effect> "infer-effect" set-word-prop
\ add-compiled-block [ [ vector vector vector integer ] [ integer ] ] "infer-effect" set-word-prop \ add-compiled-block { vector vector vector integer } { integer } <effect> "infer-effect" set-word-prop
\ dlopen [ [ string ] [ dll ] ] "infer-effect" set-word-prop \ dlopen { string } { dll } <effect> "infer-effect" set-word-prop
\ dlsym [ [ string object ] [ integer ] ] "infer-effect" set-word-prop \ dlsym { string object } { integer } <effect> "infer-effect" set-word-prop
\ dlclose [ [ dll ] [ ] ] "infer-effect" set-word-prop \ dlclose { dll } { } <effect> "infer-effect" set-word-prop
\ <byte-array> [ [ integer ] [ byte-array ] ] "infer-effect" set-word-prop \ <byte-array> { integer } { byte-array } <effect> "infer-effect" set-word-prop
\ <displaced-alien> [ [ integer c-ptr ] [ c-ptr ] ] "infer-effect" set-word-prop \ <displaced-alien> { integer c-ptr } { c-ptr } <effect> "infer-effect" set-word-prop
\ alien-signed-cell [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-signed-cell { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-signed-cell [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-signed-cell { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-unsigned-cell [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-unsigned-cell { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-unsigned-cell [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-unsigned-cell { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-signed-8 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-signed-8 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-signed-8 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-signed-8 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-unsigned-8 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-unsigned-8 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-unsigned-8 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-unsigned-8 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-signed-4 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-signed-4 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-signed-4 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-signed-4 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-unsigned-4 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-unsigned-4 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-unsigned-4 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-unsigned-4 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-signed-2 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-signed-2 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-signed-2 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-signed-2 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-unsigned-2 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-unsigned-2 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-unsigned-2 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-unsigned-2 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-signed-1 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-signed-1 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-signed-1 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-signed-1 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-unsigned-1 [ [ c-ptr integer ] [ integer ] ] "infer-effect" set-word-prop \ alien-unsigned-1 { c-ptr integer } { integer } <effect> "infer-effect" set-word-prop
\ set-alien-unsigned-1 [ [ integer c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-unsigned-1 { integer c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-float [ [ c-ptr integer ] [ float ] ] "infer-effect" set-word-prop \ alien-float { c-ptr integer } { float } <effect> "infer-effect" set-word-prop
\ set-alien-float [ [ float c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-float { float c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-float [ [ c-ptr integer ] [ float ] ] "infer-effect" set-word-prop \ alien-float { c-ptr integer } { float } <effect> "infer-effect" set-word-prop
\ set-alien-double [ [ float c-ptr integer ] [ ] ] "infer-effect" set-word-prop \ set-alien-double { float c-ptr integer } { } <effect> "infer-effect" set-word-prop
\ alien-double [ [ c-ptr integer ] [ float ] ] "infer-effect" set-word-prop \ alien-double { c-ptr integer } { float } <effect> "infer-effect" set-word-prop
\ alien>char-string [ [ c-ptr ] [ string ] ] "infer-effect" set-word-prop \ alien>char-string { c-ptr } { string } <effect> "infer-effect" set-word-prop
\ string>char-alien [ [ string ] [ byte-array ] ] "infer-effect" set-word-prop \ string>char-alien { string } { byte-array } <effect> "infer-effect" set-word-prop
\ alien>u16-string [ [ c-ptr ] [ string ] ] "infer-effect" set-word-prop \ alien>u16-string { c-ptr } { string } <effect> "infer-effect" set-word-prop
\ string>u16-alien [ [ string ] [ byte-array ] ] "infer-effect" set-word-prop \ string>u16-alien { string } { byte-array } <effect> "infer-effect" set-word-prop
\ string>memory [ [ string integer ] [ ] ] "infer-effect" set-word-prop \ string>memory { string integer } { } <effect> "infer-effect" set-word-prop
\ memory>string [ [ integer integer ] [ string ] ] "infer-effect" set-word-prop \ memory>string { integer integer } { string } <effect> "infer-effect" set-word-prop
\ alien-address [ [ alien ] [ integer ] ] "infer-effect" set-word-prop \ alien-address { alien } { integer } <effect> "infer-effect" set-word-prop
\ slot [ [ object fixnum ] [ object ] ] "infer-effect" set-word-prop \ slot { object fixnum } { object } <effect> "infer-effect" set-word-prop
\ set-slot [ [ object object fixnum ] [ ] ] "infer-effect" set-word-prop \ set-slot { object object fixnum } { } <effect> "infer-effect" set-word-prop
\ integer-slot [ [ object fixnum ] [ integer ] ] "infer-effect" set-word-prop \ integer-slot { object fixnum } { integer } <effect> "infer-effect" set-word-prop
\ set-integer-slot [ [ integer object fixnum ] [ ] ] "infer-effect" set-word-prop \ set-integer-slot { integer object fixnum } { } <effect> "infer-effect" set-word-prop
\ char-slot [ [ fixnum object ] [ fixnum ] ] "infer-effect" set-word-prop \ char-slot { fixnum object } { fixnum } <effect> "infer-effect" set-word-prop
\ set-char-slot [ [ fixnum fixnum object ] [ ] ] "infer-effect" set-word-prop \ set-char-slot { fixnum fixnum object } { } <effect> "infer-effect" set-word-prop
\ resize-array [ [ integer array ] [ array ] ] "infer-effect" set-word-prop \ resize-array { integer array } { array } <effect> "infer-effect" set-word-prop
\ resize-string [ [ integer string ] [ string ] ] "infer-effect" set-word-prop \ resize-string { integer string } { string } <effect> "infer-effect" set-word-prop
\ (hashtable) [ [ ] [ hashtable ] ] "infer-effect" set-word-prop \ (hashtable) { } { hashtable } <effect> "infer-effect" set-word-prop
\ <array> [ [ integer object ] [ array ] ] "infer-effect" set-word-prop \ <array> { integer object } { array } <effect> "infer-effect" set-word-prop
\ <tuple> [ [ integer word ] [ tuple ] ] "infer-effect" set-word-prop \ <tuple> { integer word } { tuple } <effect> "infer-effect" set-word-prop
\ begin-scan [ [ ] [ ] ] "infer-effect" set-word-prop \ begin-scan { } { } <effect> "infer-effect" set-word-prop
\ next-object [ [ ] [ object ] ] "infer-effect" set-word-prop \ next-object { } { object } <effect> "infer-effect" set-word-prop
\ end-scan [ [ ] [ ] ] "infer-effect" set-word-prop \ end-scan { } { } <effect> "infer-effect" set-word-prop
\ size [ [ object ] [ fixnum ] ] "infer-effect" set-word-prop \ size { object } { fixnum } <effect> "infer-effect" set-word-prop
\ die [ [ ] [ ] ] "infer-effect" set-word-prop \ die { } { } <effect> "infer-effect" set-word-prop
\ fopen [ [ string string ] [ alien ] ] "infer-effect" set-word-prop \ fopen { string string } { alien } <effect> "infer-effect" set-word-prop
\ fgetc [ [ alien ] [ object ] ] "infer-effect" set-word-prop \ fgetc { alien } { object } <effect> "infer-effect" set-word-prop
\ fwrite [ [ string alien ] [ ] ] "infer-effect" set-word-prop \ fwrite { string alien } { } <effect> "infer-effect" set-word-prop
\ fflush [ [ alien ] [ ] ] "infer-effect" set-word-prop \ fflush { alien } { } <effect> "infer-effect" set-word-prop
\ fclose [ [ alien ] [ ] ] "infer-effect" set-word-prop \ fclose { alien } { } <effect> "infer-effect" set-word-prop
\ expired? [ [ object ] [ object ] ] "infer-effect" set-word-prop \ expired? { object } { object } <effect> "infer-effect" set-word-prop
\ <wrapper> [ [ object ] [ wrapper ] ] "infer-effect" set-word-prop \ <wrapper> { object } { wrapper } <effect> "infer-effect" set-word-prop
\ <wrapper> t "foldable" set-word-prop \ <wrapper> t "foldable" set-word-prop
\ (clone) [ [ object ] [ object ] ] "infer-effect" set-word-prop \ (clone) { object } { object } <effect> "infer-effect" set-word-prop
\ array>tuple [ [ array ] [ tuple ] ] "infer-effect" set-word-prop \ array>tuple { array } { tuple } <effect> "infer-effect" set-word-prop
\ tuple>array [ [ tuple ] [ array ] ] "infer-effect" set-word-prop \ tuple>array { tuple } { array } <effect> "infer-effect" set-word-prop
\ array>vector [ [ array ] [ vector ] ] "infer-effect" set-word-prop \ array>vector { array } { vector } <effect> "infer-effect" set-word-prop
\ finalize-compile [ [ array ] [ ] ] "infer-effect" set-word-prop \ finalize-compile { array } { } <effect> "infer-effect" set-word-prop
\ <string> [ [ integer integer ] [ string ] ] "infer-effect" set-word-prop \ <string> { integer integer } { string } <effect> "infer-effect" set-word-prop
\ <quotation> [ [ integer ] [ quotation ] ] "infer-effect" set-word-prop \ <quotation> { integer } { quotation } <effect> "infer-effect" set-word-prop

View File

@ -51,7 +51,7 @@ TUPLE: shuffle in-d in-r out-d out-r ;
#! the shuffle. #! the shuffle.
[ split-shuffle ] keep shuffle* join-shuffle ; [ split-shuffle ] keep shuffle* join-shuffle ;
M: shuffle clone ( shuffle -- shuffle ) M: shuffle clone
[ shuffle-in-d clone ] keep [ shuffle-in-d clone ] keep
[ shuffle-in-r clone ] keep [ shuffle-in-r clone ] keep
[ shuffle-out-d clone ] keep [ shuffle-out-d clone ] keep

View File

@ -1,6 +1,6 @@
IN: inference IN: inference
USING: arrays generic interpreter kernel math namespaces USING: arrays generic interpreter kernel math namespaces
sequences words ; sequences words parser ;
: infer-shuffle-inputs ( shuffle node -- ) : infer-shuffle-inputs ( shuffle node -- )
>r dup shuffle-in-d length swap shuffle-in-r length r> >r dup shuffle-in-d length swap shuffle-in-r length r>
@ -22,8 +22,7 @@ sequences words ;
node, ; node, ;
: shuffle>effect ( shuffle -- effect ) : shuffle>effect ( shuffle -- effect )
dup shuffle-in-d [ drop object ] map dup shuffle-in-d swap shuffle-out-d <effect> ;
swap shuffle-out-d [ drop object ] map 2array ;
: define-shuffle ( word shuffle -- ) : define-shuffle ( word shuffle -- )
[ shuffle>effect "infer-effect" set-word-prop ] 2keep [ shuffle>effect "infer-effect" set-word-prop ] 2keep

View File

@ -18,16 +18,16 @@ IN: inference
#! Add a node to the dataflow graph that consumes and #! Add a node to the dataflow graph that consumes and
#! produces a number of values. #! produces a number of values.
swap #call swap #call
over first length over consume-values over effect-in length over consume-values
swap second length over produce-values over effect-out length over produce-values
node, ; node, effect-terminated? [ terminate ] when ;
: no-effect ( word -- ) : no-effect ( word -- )
"Stack effect inference of the word " swap word-name "Stack effect inference of the word " swap word-name
" was already attempted, and failed" append3 " was already attempted, and failed" append3
inference-error ; inference-error ;
TUPLE: rstate label base-case? ; TUPLE: rstate label count ;
: nest-node ( -- ) #entry node, ; : nest-node ( -- ) #entry node, ;
@ -35,10 +35,10 @@ TUPLE: rstate label base-case? ;
dup node-param #return node, dup node-param #return node,
dataflow-graph get 1array over set-node-children ; dataflow-graph get 1array over set-node-children ;
: add-recursive-state ( word label base-case -- ) : add-recursive-state ( word label count -- )
<rstate> 2array recursive-state [ swap add ] change ; <rstate> 2array recursive-state [ swap add ] change ;
: inline-block ( word base-case -- node-block variables ) : inline-block ( word count -- node-block variables )
[ [
copy-inference nest-node copy-inference nest-node
>r gensym 2dup r> add-recursive-state >r gensym 2dup r> add-recursive-state
@ -52,9 +52,9 @@ TUPLE: rstate label base-case? ;
GENERIC: collect-recursion* ( label node -- ) GENERIC: collect-recursion* ( label node -- )
M: node collect-recursion* ( label node -- ) 2drop ; M: node collect-recursion* 2drop ;
M: #call-label collect-recursion* ( label node -- ) M: #call-label collect-recursion*
tuck node-param eq? [ node-in-d , ] [ drop ] if ; tuck node-param eq? [ node-in-d , ] [ drop ] if ;
: collect-recursion ( #label -- seq ) : collect-recursion ( #label -- seq )
@ -84,15 +84,15 @@ M: #call-label collect-recursion* ( label node -- )
#! closure under recursive value substitution. #! closure under recursive value substitution.
#! If the block does not call itself, there is no point in #! If the block does not call itself, there is no point in
#! having the block node in the IR. Just add its contents. #! having the block node in the IR. Just add its contents.
dup f inline-block over recursive-label? [ dup 0 inline-block over recursive-label? [
meta-d get >r meta-d get >r
drop join-values f inline-block apply-infer drop join-values 0 inline-block apply-infer
r> over set-node-in-d node, r> over set-node-in-d node,
] [ ] [
apply-infer node-child node-successor splice-node drop apply-infer node-child node-successor splice-node drop
] if ; ] if ;
: infer-compound ( word base-case -- terminates? effect ) : infer-compound ( word count -- effect )
#! Infer a word's stack effect in a separate inferencer #! Infer a word's stack effect in a separate inferencer
#! instance. Outputs a true boolean if the word terminates #! instance. Outputs a true boolean if the word terminates
#! control flow by throwing an exception or restoring a #! control flow by throwing an exception or restoring a
@ -100,22 +100,29 @@ M: #call-label collect-recursion* ( label node -- )
[ [
recursive-state get init-inference recursive-state get init-inference
over >r inline-block nip over >r inline-block nip
[ terminated? get effect ] bind r> [ current-effect ] bind r>
] with-scope over consume/produce over [ terminate ] when ; ] with-scope over consume/produce ;
GENERIC: apply-word GENERIC: apply-word
M: object apply-word ( word -- ) M: object apply-word
#! A primitive with an unknown stack effect. #! A primitive with an unknown stack effect.
no-effect ; no-effect ;
: save-effect ( word terminates effect prop -- ) TUPLE: effect-error word effect ;
rot [ 3drop ] [ set-word-prop ] if ;
M: compound apply-word ( word -- ) : effect-error ( -- * ) <effect-error> throw ;
: check-effect ( word effect -- )
over recorded get push
dup pick "declared-effect" word-prop dup
[ effect<= [ effect-error ] unless ] [ 2drop ] if
"infer-effect" set-word-prop ;
M: compound apply-word
#! Infer a compound word's stack effect. #! Infer a compound word's stack effect.
[ [
dup f infer-compound "infer-effect" save-effect dup 0 infer-compound check-effect
] [ ] [
swap t "no-effect" set-word-prop rethrow swap t "no-effect" set-word-prop rethrow
] recover ; ] recover ;
@ -124,7 +131,7 @@ M: compound apply-word ( word -- )
dup "no-effect" word-prop [ no-effect ] when dup "no-effect" word-prop [ no-effect ] when
dup "infer-effect" word-prop [ dup "infer-effect" word-prop [
over "infer" word-prop [ over "infer" word-prop [
swap first length ensure-values call drop swap effect-in length ensure-values call drop
] [ ] [
consume/produce consume/produce
] if* ] if*
@ -132,46 +139,28 @@ M: compound apply-word ( word -- )
apply-word apply-word
] if* ; ] if* ;
M: word apply-object ( word -- ) M: word apply-object apply-default ;
apply-default ;
M: symbol apply-object ( word -- ) M: symbol apply-object apply-literal ;
apply-literal ;
: inline-base-case ( word label -- ) : declared-effect ( word -- effect )
meta-d get clone >r over t inline-block apply-infer drop dup "declared-effect" word-prop [ ] [
[ #call-label ] [ #call ] ?if r> over set-node-in-d node, ; "The recursive word " swap word-name
" does not declare a stack effect" append3
inference-error
] ?if ;
: base-case ( word label -- ) : recursive-effect ( word -- effect )
over "inline" word-prop [
inline-base-case
] [
drop dup t infer-compound "base-case" save-effect
] if ;
: recursive-word ( word rstate -- )
#! Handle a recursive call, by either applying a previously #! Handle a recursive call, by either applying a previously
#! inferred base case, or raising an error. If the recursive #! inferred base case, or raising an error. If the recursive
#! call is to a local block, emit a label call node. #! call is to a local block, emit a label call node.
over "infer-effect" word-prop [ dup "infer-effect" word-prop [ ] [ declared-effect ] if ;
nip consume/produce
] [
over "base-case" word-prop [
nip consume/produce
] [
dup rstate-base-case? [
notify-base-case
] [
rstate-label base-case
] if
] if*
] if* ;
M: compound apply-object ( word -- ) M: compound apply-object
#! Apply the word's stack effect to the inferencer state. #! Apply the word's stack effect to the inferencer state.
dup recursive-state get <reversed> assoc [ dup recursive-state get <reversed> assoc [
recursive-word dup recursive-effect consume/produce
] [ ] [
dup "inline" word-prop dup "inline" word-prop
[ inline-closure ] [ apply-default ] if [ inline-closure ] [ apply-default ] if
] if* ; ] if ;

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: optimizer IN: optimizer
USING: arrays errors generic hashtables inference kernel USING: arrays errors generic hashtables inference kernel
math math-internals sequences words ; math math-internals sequences words parser ;
! A system for associating dataflow optimizers with words. ! A system for associating dataflow optimizers with words.
@ -58,7 +58,8 @@ math math-internals sequences words ;
: useless-coerce? ( node -- ) : useless-coerce? ( node -- )
dup 0 node-class# dup 0 node-class#
swap node-param "infer-effect" word-prop second first eq? ; swap node-param "infer-effect" word-prop effect-out first
eq? ;
{ >fixnum >bignum >float } [ { >fixnum >bignum >float } [
{ {
@ -171,7 +172,7 @@ SYMBOL: @
{ { @ @ } [ 2drop t ] } { { @ @ } [ 2drop t ] }
} define-identities } define-identities
M: #call optimize-node* ( node -- node/t ) M: #call optimize-node*
{ {
{ [ dup partial-eval? ] [ partial-eval ] } { [ dup partial-eval? ] [ partial-eval ] }
{ [ dup find-identity nip ] [ apply-identities ] } { [ dup find-identity nip ] [ apply-identities ] }

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
IN: optimizer IN: optimizer
USING: arrays generic hashtables inference kernel USING: arrays generic hashtables inference kernel
kernel-internals math namespaces sequences words ; kernel-internals math namespaces sequences words parser ;
! Infer possible classes of values in a dataflow IR. ! Infer possible classes of values in a dataflow IR.
: node-class# ( node n -- class ) : node-class# ( node n -- class )
@ -21,7 +21,7 @@ SYMBOL: ties
GENERIC: apply-tie ( tie -- ) GENERIC: apply-tie ( tie -- )
M: f apply-tie ( f -- ) drop ; M: f apply-tie drop ;
TUPLE: class-tie value class ; TUPLE: class-tie value class ;
@ -29,7 +29,7 @@ TUPLE: class-tie value class ;
2dup swap <class-tie> ties get hash [ apply-tie ] when* 2dup swap <class-tie> ties get hash [ apply-tie ] when*
value-classes get set-hash ; value-classes get set-hash ;
M: class-tie apply-tie ( tie -- ) M: class-tie apply-tie
dup class-tie-class swap class-tie-value dup class-tie-class swap class-tie-value
set-value-class* ; set-value-class* ;
@ -40,18 +40,18 @@ TUPLE: literal-tie value literal ;
2dup swap <literal-tie> ties get hash [ apply-tie ] when* 2dup swap <literal-tie> ties get hash [ apply-tie ] when*
value-literals get set-hash ; value-literals get set-hash ;
M: literal-tie apply-tie ( tie -- ) M: literal-tie apply-tie
dup literal-tie-literal swap literal-tie-value dup literal-tie-literal swap literal-tie-value
set-value-literal* ; set-value-literal* ;
GENERIC: infer-classes* ( node -- ) GENERIC: infer-classes* ( node -- )
M: node infer-classes* ( node -- ) drop ; M: node infer-classes* drop ;
! For conditionals, a map of child node # --> possibility ! For conditionals, a map of child node # --> possibility
GENERIC: child-ties ( node -- seq ) GENERIC: child-ties ( node -- seq )
M: node child-ties ( node -- seq ) M: node child-ties
node-children length f <array> ; node-children length f <array> ;
: value-class* ( value -- class ) : value-class* ( value -- class )
@ -119,27 +119,27 @@ M: node child-ties ( node -- seq )
dup node-param "output-classes" word-prop [ dup node-param "output-classes" word-prop [
call call
] [ ] [
node-param "infer-effect" word-prop second node-param "infer-effect" word-prop effect-out
dup integer? [ drop f ] when dup [ word? ] all? [ drop f ] unless
] if* ; ] if* ;
M: #call infer-classes* ( node -- ) M: #call infer-classes*
dup create-ties dup output-classes dup create-ties dup output-classes
[ swap node-out-d intersect-classes ] [ drop ] if* ; [ swap node-out-d intersect-classes ] [ drop ] if* ;
M: #push infer-classes* ( node -- ) M: #push infer-classes*
node-out-d node-out-d
[ [ value-literal ] keep set-value-literal* ] each ; [ [ value-literal ] keep set-value-literal* ] each ;
M: #if child-ties ( node -- seq ) M: #if child-ties
node-in-d first dup general-t <class-tie> node-in-d first dup general-t <class-tie>
swap f <literal-tie> 2array ; swap f <literal-tie> 2array ;
M: #dispatch child-ties ( node -- seq ) M: #dispatch child-ties
dup node-in-d first dup node-in-d first
swap node-children length [ <literal-tie> ] map-with ; swap node-children length [ <literal-tie> ] map-with ;
M: #declare infer-classes* ( node -- ) M: #declare infer-classes*
dup node-param swap node-in-d [ set-value-class* ] 2each ; dup node-param swap node-in-d [ set-value-class* ] 2each ;
DEFER: (infer-classes) DEFER: (infer-classes)

View File

@ -34,16 +34,16 @@ GENERIC: live-values* ( node -- seq )
dup live-values over literals hash-diff swap kill-node ; dup live-values over literals hash-diff swap kill-node ;
! Generic nodes ! Generic nodes
M: node literals* ( node -- ) drop { } ; M: node literals* drop { } ;
M: node live-values* ( node -- seq ) M: node live-values*
node-in-d [ value? ] subset ; node-in-d [ value? ] subset ;
! #push ! #push
M: #push literals* ( node -- seq ) node-out-d ; M: #push literals* node-out-d ;
! #return ! #return
M: #return live-values* ( node -- seq ) M: #return live-values*
#! Values returned by local labels can be killed. #! Values returned by local labels can be killed.
dup node-param [ drop { } ] [ delegate live-values* ] if ; dup node-param [ drop { } ] [ delegate live-values* ] if ;
@ -51,7 +51,7 @@ M: #return live-values* ( node -- seq )
UNION: #killable UNION: #killable
#push #shuffle #call-label #merge #values #entry ; #push #shuffle #call-label #merge #values #entry ;
M: #killable live-values* ( node -- seq ) drop { } ; M: #killable live-values* drop { } ;
: purge-invariants ( stacks -- seq ) : purge-invariants ( stacks -- seq )
#! Output a sequence of values which are not present in the #! Output a sequence of values which are not present in the
@ -59,14 +59,14 @@ M: #killable live-values* ( node -- seq ) drop { } ;
unify-lengths flip [ all-eq? not ] subset concat ; unify-lengths flip [ all-eq? not ] subset concat ;
! #label ! #label
M: #label live-values* ( node -- seq ) M: #label live-values*
dup node-child node-in-d over node-in-d 2array dup node-child node-in-d over node-in-d 2array
swap collect-recursion append purge-invariants ; swap collect-recursion append purge-invariants ;
! branching ! branching
UNION: #branch #if #dispatch ; UNION: #branch #if #dispatch ;
M: #branch live-values* ( node -- ) M: #branch live-values*
#! This assumes that the last element of each branch is a #! This assumes that the last element of each branch is a
#! #return node. #! #return node.
dup delegate live-values* >r dup delegate live-values* >r

View File

@ -31,18 +31,18 @@ GENERIC: optimize-node* ( node -- node/t )
! Generic nodes ! Generic nodes
M: f optimize-node* drop t ; M: f optimize-node* drop t ;
M: node optimize-node* ( node -- t ) drop t ; M: node optimize-node* drop t ;
! #shuffle ! #shuffle
M: #shuffle optimize-node* ( node -- node/t ) M: #shuffle optimize-node*
[ node-values empty? ] prune-if ; [ node-values empty? ] prune-if ;
! #push ! #push
M: #push optimize-node* ( node -- node/t ) M: #push optimize-node*
[ node-out-d empty? ] prune-if ; [ node-out-d empty? ] prune-if ;
! #return ! #return
M: #return optimize-node* ( node -- node/t ) M: #return optimize-node*
node-successor [ node-successor ] [ t ] if* ; node-successor [ node-successor ] [ t ] if* ;
! Some utilities for splicing in dataflow IR subtrees ! Some utilities for splicing in dataflow IR subtrees
@ -96,12 +96,12 @@ M: #return optimize-node* ( node -- node/t )
} cond } cond
] if ; ] if ;
M: #if optimize-node* ( node -- node/t ) M: #if optimize-node*
dup dup node-in-d first known-boolean-value? dup dup node-in-d first known-boolean-value?
[ 0 1 ? fold-branch ] [ 2drop t ] if ; [ 0 1 ? fold-branch ] [ 2drop t ] if ;
! #dispatch ! #dispatch
M: #dispatch optimize-node* ( node -- node/t ) M: #dispatch optimize-node*
dup dup node-in-d first 2dup node-literal? [ dup dup node-in-d first 2dup node-literal? [
node-literal fold-branch node-literal fold-branch
] [ ] [

View File

@ -9,7 +9,7 @@ GENERIC: node>quot ( node -- )
TUPLE: comment node text ; TUPLE: comment node text ;
M: comment pprint* ( ann -- ) M: comment pprint*
"( " over comment-text " )" append3 "( " over comment-text " )" append3
swap comment-node presented associate swap comment-node presented associate
styled-text ; styled-text ;
@ -36,10 +36,10 @@ M: comment pprint* ( ann -- )
" r: " swap node-out-r values% " r: " swap node-out-r values%
] "" make 1 tail ; ] "" make 1 tail ;
M: #shuffle node>quot ( ? node -- ) M: #shuffle node>quot
>r drop t r> dup effect-str "#shuffle: " swap append comment, ; >r drop t r> dup effect-str "#shuffle: " swap append comment, ;
M: #push node>quot ( ? node -- ) nip >#push< % ; M: #push node>quot nip >#push< % ;
DEFER: dataflow>quot DEFER: dataflow>quot
@ -47,26 +47,26 @@ DEFER: dataflow>quot
dup node-param dup dup node-param dup
[ , dup effect-str comment, ] [ 3drop ] if ; [ , dup effect-str comment, ] [ 3drop ] if ;
M: #call node>quot ( ? node -- ) #call>quot ; M: #call node>quot #call>quot ;
M: #call-label node>quot ( ? node -- ) #call>quot ; M: #call-label node>quot #call>quot ;
M: #label node>quot ( ? node -- ) M: #label node>quot
[ "#label: " over node-param word-name append comment, ] 2keep [ "#label: " over node-param word-name append comment, ] 2keep
node-child swap dataflow>quot , \ call , ; node-child swap dataflow>quot , \ call , ;
M: #if node>quot ( ? node -- ) M: #if node>quot
[ "#if" comment, ] 2keep [ "#if" comment, ] 2keep
node-children [ swap dataflow>quot ] map-with % \ if , ; node-children [ swap dataflow>quot ] map-with % \ if , ;
M: #dispatch node>quot ( ? node -- ) M: #dispatch node>quot
[ "#dispatch" comment, ] 2keep [ "#dispatch" comment, ] 2keep
node-children [ swap dataflow>quot ] map-with , \ dispatch , ; node-children [ swap dataflow>quot ] map-with , \ dispatch , ;
M: #return node>quot ( ? node -- ) M: #return node>quot
dup node-param unparse "#return " swap append comment, ; dup node-param unparse "#return " swap append comment, ;
M: object node>quot ( ? node -- ) dup class word-name comment, ; M: object node>quot dup class word-name comment, ;
: (dataflow>quot) ( ? node -- ) : (dataflow>quot) ( ? node -- )
dup [ dup [

View File

@ -30,10 +30,10 @@ GENERIC: loc>operand
M: ds-loc loc>operand ds-loc-n cells neg 14 swap ; M: ds-loc loc>operand ds-loc-n cells neg 14 swap ;
M: cs-loc loc>operand cs-loc-n cells neg 15 swap ; M: cs-loc loc>operand cs-loc-n cells neg 15 swap ;
M: immediate load-literal ( literal vreg -- ) M: immediate load-literal
[ v>operand ] 2apply LOAD ; [ v>operand ] 2apply LOAD ;
M: object load-literal ( literal vreg -- ) M: object load-literal
v>operand v>operand
[ 0 swap LOAD32 rel-absolute-2/2 rel-literal ] keep [ 0 swap LOAD32 rel-absolute-2/2 rel-literal ] keep
dup 0 LWZ ; dup 0 LWZ ;
@ -91,14 +91,14 @@ M: object load-literal ( literal vreg -- )
: compile-dlsym ( symbol dll register -- ) : compile-dlsym ( symbol dll register -- )
0 swap LOAD32 rel-absolute-2/2 rel-dlsym ; 0 swap LOAD32 rel-absolute-2/2 rel-dlsym ;
M: int-regs (%peek) ( vreg loc -- ) M: int-regs (%peek)
drop >r v>operand r> loc>operand LWZ ; drop >r v>operand r> loc>operand LWZ ;
M: float-regs (%peek) ( vreg loc -- ) M: float-regs (%peek)
drop fp-scratch v>operand swap loc>operand LWZ drop fp-scratch v>operand swap loc>operand LWZ
fp-scratch [ v>operand ] 2apply float-offset LFD ; fp-scratch [ v>operand ] 2apply float-offset LFD ;
M: int-regs (%replace) ( vreg loc -- ) M: int-regs (%replace)
drop >r v>operand r> loc>operand STW ; drop >r v>operand r> loc>operand STW ;
: %move-int>int ( dst src -- ) : %move-int>int ( dst src -- )
@ -124,7 +124,7 @@ M: int-regs (%replace) ( vreg loc -- )
r> call 12 12 \ size get call ADDI r> call 12 12 \ size get call ADDI
] bind save-allot-ptr ; inline ] bind save-allot-ptr ; inline
M: float-regs (%replace) ( vreg loc reg-class -- ) M: float-regs (%replace)
drop swap drop swap
[ v>operand 12 8 STFD ] [ v>operand 12 8 STFD ]
[ 11 swap loc>operand STW ] H{ [ 11 swap loc>operand STW ] H{

View File

@ -87,13 +87,13 @@ M: float-regs store-return-reg load/store-float-return FSTP ;
: prepare-division CDQ ; inline : prepare-division CDQ ; inline
M: immediate load-literal ( literal vreg -- ) M: immediate load-literal
v>operand swap v>operand MOV ; v>operand swap v>operand MOV ;
: load-indirect ( literal reg -- ) : load-indirect ( literal reg -- )
0 [] MOV rel-absolute-cell rel-literal ; 0 [] MOV rel-absolute-cell rel-literal ;
M: object load-literal ( literal vreg -- ) M: object load-literal
v>operand load-indirect ; v>operand load-indirect ;
: (%call) ( label -- label ) : (%call) ( label -- label )
@ -150,6 +150,6 @@ M: int-regs (%replace) drop swap %move-int>int ;
: %inc-r ( n -- ) cs-reg (%inc) ; : %inc-r ( n -- ) cs-reg (%inc) ;
M: object %stack>freg ( n reg reg-class -- ) 3drop ; M: object %stack>freg 3drop ;
M: object %freg>stack ( n reg reg-class -- ) 3drop ; M: object %freg>stack 3drop ;

View File

@ -140,7 +140,7 @@ C: indirect ( base index scale displacement -- indirect )
GENERIC: sib-present? GENERIC: sib-present?
M: indirect sib-present? ( indirect -- ? ) M: indirect sib-present?
dup indirect-base { ESP RSP } memq? dup indirect-base { ESP RSP } memq?
over indirect-index rot indirect-scale or or ; over indirect-index rot indirect-scale or or ;
@ -148,11 +148,11 @@ M: register sib-present? drop f ;
GENERIC: r/m GENERIC: r/m
M: indirect r/m ( indirect -- r/m ) M: indirect r/m
dup sib-present? dup sib-present?
[ drop ESP reg-code ] [ indirect-base* ] if ; [ drop ESP reg-code ] [ indirect-base* ] if ;
M: register r/m ( reg -- r/m ) reg-code ; M: register r/m reg-code ;
: byte? -128 127 between? ; : byte? -128 127 between? ;
@ -299,8 +299,8 @@ M: operand CALL BIN: 010 t HEX: ff 1-operand ;
G: JUMPcc ( addr opcode -- ) 1 standard-combination ; G: JUMPcc ( addr opcode -- ) 1 standard-combination ;
: (JUMPcc) HEX: 0f , , 0 4, rel-relative ; : (JUMPcc) HEX: 0f , , 0 4, rel-relative ;
M: callable JUMPcc ( addr opcode -- ) (JUMPcc) rel-word ; M: callable JUMPcc (JUMPcc) rel-word ;
M: label JUMPcc ( addr opcode -- ) (JUMPcc) rel-label ; M: label JUMPcc (JUMPcc) rel-label ;
: JO HEX: 80 JUMPcc ; : JO HEX: 80 JUMPcc ;
: JNO HEX: 81 JUMPcc ; : JNO HEX: 81 JUMPcc ;

View File

@ -4,7 +4,7 @@ USING: alien arrays assembler generic kernel kernel-internals
math math-internals memory namespaces sequences words ; math math-internals memory namespaces sequences words ;
IN: compiler IN: compiler
M: float-regs (%peek) ( vreg loc reg-class -- ) M: float-regs (%peek)
drop drop
fp-scratch swap %move-int>int fp-scratch swap %move-int>int
fp-scratch %move-int>float ; fp-scratch %move-int>float ;
@ -32,7 +32,7 @@ M: float-regs (%peek) ( vreg loc reg-class -- )
alloc-tmp-reg POP alloc-tmp-reg POP
] bind ; inline ] bind ; inline
M: float-regs (%replace) ( vreg loc reg-class -- ) M: float-regs (%replace)
drop drop
[ alloc-tmp-reg 8 [+] rot v>operand MOVSD ] [ alloc-tmp-reg 8 [+] rot v>operand MOVSD ]
[ v>operand alloc-tmp-reg MOV ] H{ [ v>operand alloc-tmp-reg MOV ] H{

View File

@ -123,7 +123,6 @@ SYMBOL: class<cache
: define-class ( class -- ) : define-class ( class -- )
dup t "class" set-word-prop dup t "class" set-word-prop
dup H{ } clone "class<" set-word-prop
dup flatten-class typemap get set-hash ; dup flatten-class typemap get set-hash ;
! Predicate classes for generalized predicate dispatch. ! Predicate classes for generalized predicate dispatch.

View File

@ -41,8 +41,8 @@ math namespaces sequences words ;
TUPLE: no-math-method left right generic ; TUPLE: no-math-method left right generic ;
: no-math-method ( left right generic -- ) : no-math-method ( left right generic -- * )
3dup <no-math-method> throw ; <no-math-method> throw ;
: applicable-method ( generic class -- quot ) : applicable-method ( generic class -- quot )
over method [ ] [ [ no-math-method ] curry ] ?if ; over method [ ] [ [ no-math-method ] curry ] ?if ;

View File

@ -9,21 +9,29 @@ parser sequences strings words ;
over define-generic -rot define-method ; over define-generic -rot define-method ;
: define-slot-word ( class slot word quot -- ) : define-slot-word ( class slot word quot -- )
over [ rot >fixnum add* define-typecheck ;
rot >fixnum add* define-typecheck
: reader-effect 1 1 <effect> ; inline
: define-reader ( class slot decl reader -- )
dup [
dup reader-effect "declared-effect" set-word-prop
[ slot ] rot dup object eq?
[ drop ] [ 1array [ declare ] swap add* append ] if
define-slot-word
] [ ] [
2drop 2drop 2drop 2drop
] if ; ] if ;
: define-reader ( class slot decl reader -- ) : writer-effect 2 0 <effect> ; inline
[ slot ] rot dup object eq? [
drop
] [
1array [ declare ] swap add* append
] if define-slot-word ;
: define-writer ( class slot writer -- ) : define-writer ( class slot writer -- )
[ set-slot ] define-slot-word ; dup [
dup writer-effect "declared-effect" set-word-prop
[ set-slot ] define-slot-word
] [
3drop
] if ;
: define-slot ( class slot decl reader writer -- ) : define-slot ( class slot decl reader writer -- )
>r >r >r 2dup r> r> define-reader r> define-writer ; >r >r >r 2dup r> r> define-reader r> define-writer ;

View File

@ -12,7 +12,7 @@ IN: generic
TUPLE: no-method object generic ; TUPLE: no-method object generic ;
: no-method ( object generic -- ) <no-method> throw ; : no-method ( object generic -- * ) <no-method> throw ;
: error-method ( dispatch# word -- method ) : error-method ( dispatch# word -- method )
>r picker r> [ no-method ] curry append ; >r picker r> [ no-method ] curry append ;

View File

@ -77,12 +77,12 @@ TUPLE: check-tuple class ;
dup r> tuple-slots dup r> tuple-slots
default-constructor ; default-constructor ;
M: tuple clone ( tuple -- tuple ) M: tuple clone
(clone) dup delegate clone over set-delegate ; (clone) dup delegate clone over set-delegate ;
M: tuple hashcode ( tuple -- n ) 2 slot hashcode ; M: tuple hashcode 2 slot hashcode ;
M: tuple equal? ( obj tuple -- ? ) M: tuple equal?
over tuple? [ tuple= ] [ 2drop f ] if ; over tuple? [ tuple= ] [ 2drop f ] if ;
: (delegates) ( obj -- ) : (delegates) ( obj -- )

View File

@ -13,7 +13,7 @@ SYMBOL: articles
TUPLE: article title content loc ; TUPLE: article title content loc ;
TUPLE: no-article name ; TUPLE: no-article name ;
: no-article ( name -- ) <no-article> throw ; : no-article ( name -- * ) <no-article> throw ;
: article ( name -- article ) : article ( name -- article )
dup articles get hash [ ] [ no-article ] ?if ; dup articles get hash [ ] [ no-article ] ?if ;

View File

@ -11,19 +11,19 @@ USING: errors kernel kernel-internals namespaces io strings ;
TUPLE: c-stream in out ; TUPLE: c-stream in out ;
M: c-stream stream-write1 ( char stream -- ) M: c-stream stream-write1
>r ch>string r> stream-write ; >r ch>string r> stream-write ;
M: c-stream stream-write ( str stream -- ) M: c-stream stream-write
c-stream-out fwrite ; c-stream-out fwrite ;
M: c-stream stream-read1 ( stream -- char/f ) M: c-stream stream-read1
c-stream-in dup [ fgetc ] when ; c-stream-in dup [ fgetc ] when ;
M: c-stream stream-flush ( stream -- ) M: c-stream stream-flush
c-stream-out [ fflush ] when* ; c-stream-out [ fflush ] when* ;
M: c-stream stream-close ( stream -- ) M: c-stream stream-close
dup c-stream-in [ fclose ] when* dup c-stream-in [ fclose ] when*
c-stream-out [ fclose ] when* ; c-stream-out [ fclose ] when* ;
@ -47,7 +47,7 @@ IN: io
TUPLE: client-stream host port ; TUPLE: client-stream host port ;
TUPLE: c-stream-error ; TUPLE: c-stream-error ;
: c-stream-error <c-stream-error> throw ; : c-stream-error ( -- * ) <c-stream-error> throw ;
: <client> c-stream-error ; : <client> c-stream-error ;
: <server> c-stream-error ; : <server> c-stream-error ;

View File

@ -26,11 +26,11 @@ C: line-reader ( stream -- line ) [ set-delegate ] keep ;
2drop 2drop
] if ; ] if ;
M: line-reader stream-readln ( line -- string ) M: line-reader stream-readln
[ f swap (readln) ] "" make [ f swap (readln) ] "" make
dup empty? [ f ? ] [ nip ] if ; dup empty? [ f ? ] [ nip ] if ;
M: line-reader stream-read ( count line -- string ) M: line-reader stream-read
[ delegate stream-read ] keep dup cr> [ [ delegate stream-read ] keep dup cr> [
over empty? [ over empty? [
drop drop

View File

@ -31,7 +31,7 @@ M: nested-style-stream stream-write1
3array >quotation 3array >quotation
r> r> do-nested-style ; r> r> do-nested-style ;
M: nested-style-stream with-stream-style ( quot style stream -- ) M: nested-style-stream with-stream-style
do-nested-style with-stream-style ; do-nested-style with-stream-style ;
M: nested-style-stream with-nested-stream M: nested-style-stream with-nested-stream

View File

@ -10,11 +10,11 @@ C: plain-writer ( stream -- stream ) [ set-delegate ] keep ;
M: plain-writer stream-terpri CHAR: \n swap stream-write1 ; M: plain-writer stream-terpri CHAR: \n swap stream-write1 ;
M: plain-writer stream-format ( string style stream -- ) M: plain-writer stream-format
highlight rot hash [ >r >upper r> ] when stream-write ; highlight rot hash [ >r >upper r> ] when stream-write ;
M: plain-writer with-nested-stream ( quot style stream -- ) M: plain-writer with-nested-stream
nip swap with-stream* ; nip swap with-stream* ;
M: plain-writer with-stream-style ( quot style stream -- ) M: plain-writer with-stream-style
(with-stream-style) ; (with-stream-style) ;

View File

@ -26,7 +26,7 @@ M: sbuf stream-flush drop ;
swap dup length <reversed> swap dup length <reversed>
[ zero? rot [ call ] keep swap ] 2map nip ; inline [ zero? rot [ call ] keep swap ] 2map nip ; inline
M: plain-writer with-stream-table ( grid quot style stream -- ) M: plain-writer with-stream-table
[ [
drop swap drop swap
[ [ swap string-out ] map-with ] map-with [ [ swap string-out ] map-with ] map-with
@ -36,10 +36,10 @@ M: plain-writer with-stream-table ( grid quot style stream -- )
] with-stream* ; ] with-stream* ;
! Reversed string buffers support the stream input protocol. ! Reversed string buffers support the stream input protocol.
M: sbuf stream-read1 ( sbuf -- char/f ) M: sbuf stream-read1
dup empty? [ drop f ] [ pop ] if ; dup empty? [ drop f ] [ pop ] if ;
M: sbuf stream-read ( count sbuf -- string ) M: sbuf stream-read
dup empty? [ dup empty? [
2drop f 2drop f
] [ ] [

View File

@ -35,7 +35,7 @@ SYMBOL: write-tasks
! Some general stuff ! Some general stuff
: file-mode OCT: 0600 ; : file-mode OCT: 0600 ;
: (io-error) err_no strerror throw ; : (io-error) ( -- * ) err_no strerror throw ;
: check-null ( n -- ) zero? [ (io-error) ] when ; : check-null ( n -- ) zero? [ (io-error) ] when ;
@ -69,7 +69,7 @@ C: port ( handle buffer -- port )
dup port-timeout dup zero? dup port-timeout dup zero?
[ 2drop ] [ millis + swap set-port-cutoff ] if ; [ 2drop ] [ millis + swap set-port-cutoff ] if ;
M: port set-timeout ( timeout port -- ) M: port set-timeout
[ set-port-timeout ] keep touch-port ; [ set-port-timeout ] keep touch-port ;
: buffered-port 32768 <buffer> <port> ; : buffered-port 32768 <buffer> <port> ;
@ -183,7 +183,7 @@ TUPLE: read1-task ;
C: read1-task ( port -- task ) C: read1-task ( port -- task )
[ >r <io-task> r> set-delegate ] keep ; [ >r <io-task> r> set-delegate ] keep ;
M: read1-task do-io-task ( task -- ? ) M: read1-task do-io-task
io-task-port dup refill [ io-task-port dup refill [
[ [
dup buffer-empty? dup buffer-empty?
@ -198,7 +198,7 @@ M: read1-task task-container drop read-tasks get-global ;
[ swap <read1-task> add-io-task stop ] callcc0 [ swap <read1-task> add-io-task stop ] callcc0
] when pending-error ; ] when pending-error ;
M: input-port stream-read1 ( stream -- char/f ) M: input-port stream-read1
dup wait-to-read1 dup wait-to-read1
dup port-eof? [ drop f ] [ buffer-pop ] if ; dup port-eof? [ drop f ] [ buffer-pop ] if ;
@ -222,7 +222,7 @@ C: read-task ( count port -- task )
: >read-task< dup read-task-count swap io-task-port ; : >read-task< dup read-task-count swap io-task-port ;
M: read-task do-io-task ( task -- ? ) M: read-task do-io-task
>read-task< dup refill [ >read-task< dup refill [
dup buffer-empty? [ dup buffer-empty? [
reader-eof drop t reader-eof drop t
@ -240,7 +240,7 @@ M: read-task task-container drop read-tasks get-global ;
[ -rot <read-task> add-io-task stop ] callcc0 [ -rot <read-task> add-io-task stop ] callcc0
] unless pending-error drop ; ] unless pending-error drop ;
M: input-port stream-read ( count stream -- string ) M: input-port stream-read
[ wait-to-read ] keep dup port-eof? [ wait-to-read ] keep dup port-eof?
[ drop f ] [ port-sbuf >string ] if ; [ drop f ] [ port-sbuf >string ] if ;
@ -287,19 +287,19 @@ M: write-task task-container drop write-tasks get-global ;
: port-flush ( port -- ) : port-flush ( port -- )
[ swap <write-task> add-write-io-task stop ] callcc0 drop ; [ swap <write-task> add-write-io-task stop ] callcc0 drop ;
M: output-port stream-flush ( stream -- ) M: output-port stream-flush
dup port-flush pending-error ; dup port-flush pending-error ;
: wait-to-write ( len port -- ) : wait-to-write ( len port -- )
tuck can-write? [ drop ] [ stream-flush ] if ; tuck can-write? [ drop ] [ stream-flush ] if ;
M: output-port stream-write1 ( char writer -- ) M: output-port stream-write1
1 over wait-to-write ch>buffer ; 1 over wait-to-write ch>buffer ;
M: output-port stream-write ( string writer -- ) M: output-port stream-write
over length over wait-to-write >buffer ; over length over wait-to-write >buffer ;
M: port stream-close ( stream -- ) M: port stream-close
dup port-type closed eq? [ dup port-type closed eq? [
dup port-type >r closed over set-port-type r> dup port-type >r closed over set-port-type r>
output eq? [ dup port-flush ] when dup port-handle close output eq? [ dup port-flush ] when dup port-handle close

View File

@ -47,7 +47,7 @@ TUPLE: connect-task ;
C: connect-task ( port -- task ) C: connect-task ( port -- task )
[ >r <io-task> r> set-delegate ] keep ; [ >r <io-task> r> set-delegate ] keep ;
M: connect-task do-io-task ( task -- ) M: connect-task do-io-task
io-task-port dup port-handle 0 0 write io-task-port dup port-handle 0 0 write
0 < [ defer-error ] [ drop t ] if ; 0 < [ defer-error ] [ drop t ] if ;
@ -104,7 +104,7 @@ C: accept-task ( port -- task )
swap sockaddr-in-port ntohs swap sockaddr-in-port ntohs
] keep <client-stream> swap set-server-client ; ] keep <client-stream> swap set-server-client ;
M: accept-task do-io-task ( task -- ? ) M: accept-task do-io-task
io-task-port "sockaddr-in" <c-object> io-task-port "sockaddr-in" <c-object>
over port-handle over "sockaddr-in" c-size <int> accept over port-handle over "sockaddr-in" c-size <int> accept
dup 0 >= [ dup 0 >= [

View File

@ -24,6 +24,6 @@ USING: alien errors io-internals kernel math parser sequences words ;
FUNCTION: char* error_message ( DWORD id ) ; FUNCTION: char* error_message ( DWORD id ) ;
: win32-throw-error ( -- ) : win32-throw-error ( -- * )
GetLastError error_message throw ; GetLastError error_message throw ;

View File

@ -65,13 +65,13 @@ C: win32-server ( port -- server )
dup stream set dup stream set
] make-hash over set-win32-server-this ; ] make-hash over set-win32-server-this ;
M: win32-server stream-close ( server -- ) M: win32-server stream-close
win32-server-this [ socket get CloseHandle drop ] bind ; win32-server-this [ socket get CloseHandle drop ] bind ;
M: win32-server set-timeout ( timeout server -- ) M: win32-server set-timeout
win32-server-this [ timeout set ] bind ; win32-server-this [ timeout set ] bind ;
M: win32-server expire ( -- ) M: win32-server expire
win32-server-this [ win32-server-this [
timeout get [ millis cutoff get > [ socket get CancelIo ] when ] when timeout get [ millis cutoff get > [ socket get CancelIo ] when ] when
] bind ; ] bind ;

View File

@ -49,11 +49,11 @@ SYMBOL: cutoff
: maybe-flush-output ( -- ) : maybe-flush-output ( -- )
out-buffer get buffer-length 0 > [ flush-output ] when ; out-buffer get buffer-length 0 > [ flush-output ] when ;
M: integer do-write ( int -- ) M: integer do-write
out-buffer get [ buffer-capacity zero? [ flush-output ] when ] keep out-buffer get [ buffer-capacity zero? [ flush-output ] when ] keep
>r ch>string r> >buffer ; >r ch>string r> >buffer ;
M: string do-write ( str -- ) M: string do-write
dup length out-buffer get buffer-capacity <= [ dup length out-buffer get buffer-capacity <= [
out-buffer get >buffer out-buffer get >buffer
] [ ] [
@ -97,30 +97,30 @@ M: string do-write ( str -- )
: peek-input ( -- str ) : peek-input ( -- str )
1 in-buffer get buffer-first-n ; 1 in-buffer get buffer-first-n ;
M: win32-stream stream-write ( str stream -- ) M: win32-stream stream-write
win32-stream-this [ do-write ] bind ; win32-stream-this [ do-write ] bind ;
M: win32-stream stream-write1 ( char stream -- ) M: win32-stream stream-write1
win32-stream-this [ >fixnum do-write ] bind ; win32-stream-this [ >fixnum do-write ] bind ;
M: win32-stream stream-read ( count stream -- str ) M: win32-stream stream-read
win32-stream-this [ dup <sbuf> swap do-read-count ] bind ; win32-stream-this [ dup <sbuf> swap do-read-count ] bind ;
M: win32-stream stream-read1 ( stream -- str ) M: win32-stream stream-read1
win32-stream-this [ win32-stream-this [
1 consume-input dup length zero? [ drop f ] when first 1 consume-input dup length zero? [ drop f ] when first
] bind ; ] bind ;
M: win32-stream stream-readln ( stream -- str ) M: win32-stream stream-readln
win32-stream-this [ readln ] bind ; win32-stream-this [ readln ] bind ;
M: win32-stream stream-terpri M: win32-stream stream-terpri
win32-stream-this [ CHAR: \n do-write ] bind ; win32-stream-this [ CHAR: \n do-write ] bind ;
M: win32-stream stream-flush ( stream -- ) M: win32-stream stream-flush
win32-stream-this [ maybe-flush-output ] bind ; win32-stream-this [ maybe-flush-output ] bind ;
M: win32-stream stream-close ( stream -- ) M: win32-stream stream-close
win32-stream-this [ win32-stream-this [
maybe-flush-output maybe-flush-output
handle get CloseHandle drop handle get CloseHandle drop
@ -128,21 +128,21 @@ M: win32-stream stream-close ( stream -- )
out-buffer get buffer-free out-buffer get buffer-free
] bind ; ] bind ;
M: win32-stream stream-format ( string style stream -- ) M: win32-stream stream-format
win32-stream-this [ drop do-write ] bind ; win32-stream-this [ drop do-write ] bind ;
M: win32-stream win32-stream-handle ( stream -- handle ) M: win32-stream win32-stream-handle
win32-stream-this [ handle get ] bind ; win32-stream-this [ handle get ] bind ;
M: win32-stream set-timeout ( timeout stream -- ) M: win32-stream set-timeout
win32-stream-this [ timeout set ] bind ; win32-stream-this [ timeout set ] bind ;
M: win32-stream expire ( stream -- ) M: win32-stream expire
win32-stream-this [ win32-stream-this [
timeout get [ millis cutoff get > [ handle get CancelIo ] when ] when timeout get [ millis cutoff get > [ handle get CancelIo ] when ] when
] bind ; ] bind ;
M: win32-stream with-nested-stream ( quot style stream -- ) M: win32-stream with-nested-stream
win32-stream-this [ drop stream get swap with-stream* ] bind ; win32-stream-this [ drop stream get swap with-stream* ] bind ;
C: win32-stream ( handle -- stream ) C: win32-stream ( handle -- stream )

View File

@ -13,7 +13,7 @@ UNION: number real complex ;
M: real real ; M: real real ;
M: real imaginary drop 0 ; M: real imaginary drop 0 ;
M: number equal? ( n n -- ? ) number= ; M: number equal? number= ;
: rect> ( xr xi -- x ) : rect> ( xr xi -- x )
over real? over real? and [ over real? over real? and [
@ -42,7 +42,7 @@ IN: math-internals
: 2>rect ( x y -- xr yr xi yi ) : 2>rect ( x y -- xr yr xi yi )
[ [ real ] 2apply ] 2keep [ imaginary ] 2apply ; inline [ [ real ] 2apply ] 2keep [ imaginary ] 2apply ; inline
M: complex number= ( x y -- ? ) M: complex number=
2>rect number= [ number= ] [ 2drop f ] if ; 2>rect number= [ number= ] [ 2drop f ] if ;
: *re ( x y -- xr*yr xi*ri ) 2>rect * >r * r> ; inline : *re ( x y -- xr*yr xi*ri ) 2>rect * >r * r> ; inline
@ -50,16 +50,16 @@ M: complex number= ( x y -- ? )
M: complex + 2>rect + >r + r> (rect>) ; M: complex + 2>rect + >r + r> (rect>) ;
M: complex - 2>rect - >r - r> (rect>) ; M: complex - 2>rect - >r - r> (rect>) ;
M: complex * ( x y -- x*y ) 2dup *re - -rot *im + (rect>) ; M: complex * 2dup *re - -rot *im + (rect>) ;
: complex/ ( x y -- r i m ) : complex/ ( x y -- r i m )
#! r = xr*yr+xi*yi, i = xi*yr-xr*yi, m = yr*yr+yi*yi #! r = xr*yr+xi*yi, i = xi*yr-xr*yi, m = yr*yr+yi*yi
dup absq >r 2dup *re + -rot *im - r> ; inline dup absq >r 2dup *re + -rot *im - r> ; inline
M: complex / ( x y -- x/y ) complex/ tuck / >r / r> (rect>) ; M: complex / complex/ tuck / >r / r> (rect>) ;
M: complex /f ( x y -- x/y ) complex/ tuck /f >r /f r> (rect>) ; M: complex /f complex/ tuck /f >r /f r> (rect>) ;
M: complex abs ( z -- |z| ) absq fsqrt ; M: complex abs absq fsqrt ;
M: complex hashcode ( n -- n ) M: complex hashcode
>rect >fixnum swap >fixnum bitxor ; >rect >fixnum swap >fixnum bitxor ;

View File

@ -14,13 +14,13 @@ UNION: real rational float ;
M: real abs dup 0 < [ neg ] when ; M: real abs dup 0 < [ neg ] when ;
M: real absq sq ; M: real absq sq ;
M: real hashcode ( n -- n ) >fixnum ; M: real hashcode >fixnum ;
M: real <=> - ; M: real <=> - ;
: fp-nan? ( float -- ? ) : fp-nan? ( float -- ? )
double>bits -51 shift BIN: 111111111111 [ bitand ] keep = ; double>bits -51 shift BIN: 111111111111 [ bitand ] keep = ;
M: float zero? ( float -- ? ) M: float zero?
dup 0.0 float= swap -0.0 float= or ; dup 0.0 float= swap -0.0 float= or ;
M: float < float< ; M: float < float< ;

View File

@ -42,9 +42,9 @@ IN: math-internals
dup 1 number= [ drop ] [ (fraction>) ] if ; inline dup 1 number= [ drop ] [ (fraction>) ] if ; inline
TUPLE: /0 ; TUPLE: /0 ;
: /0 ( -- ) </0> throw ; : /0 ( -- * ) </0> throw ;
M: integer / ( x y -- x/y ) M: integer /
dup zero? [ dup zero? [
/0 /0
] [ ] [

View File

@ -6,7 +6,7 @@ strings ;
DEFER: base> DEFER: base>
: string>ratio ( "a/b" radix -- a/b ) : string>ratio ( str radix -- a/b )
>r "/" split1 r> tuck base> >r base> r> >r "/" split1 r> tuck base> >r base> r>
2dup and [ / ] [ 2drop f ] if ; 2dup and [ / ] [ 2drop f ] if ;
@ -51,7 +51,7 @@ M: object digit> drop f ;
G: >base ( num radix -- string ) 1 standard-combination ; G: >base ( num radix -- string ) 1 standard-combination ;
M: integer >base ( num radix -- string ) M: integer >base
[ [
over 0 < [ over 0 < [
swap neg swap integer, CHAR: - , swap neg swap integer, CHAR: - ,
@ -60,7 +60,7 @@ M: integer >base ( num radix -- string )
] if ] if
] "" make reverse ; ] "" make reverse ;
M: ratio >base ( num radix -- string ) M: ratio >base
[ [
over numerator over >base % over numerator over >base %
CHAR: / , CHAR: / ,
@ -70,7 +70,7 @@ M: ratio >base ( num radix -- string )
: fix-float : fix-float
CHAR: . over member? [ ".0" append ] unless ; CHAR: . over member? [ ".0" append ] unless ;
M: float >base ( num radix -- string ) M: float >base
drop { drop {
{ [ dup 1.0/0.0 = ] [ drop "1.0/0.0" ] } { [ dup 1.0/0.0 = ] [ drop "1.0/0.0" ] }
{ [ dup -1.0/0.0 = ] [ drop "-1.0/0.0" ] } { [ dup -1.0/0.0 = ] [ drop "-1.0/0.0" ] }

View File

@ -27,7 +27,7 @@ GENERIC: (^) ( z w -- z^w ) foldable
: ^theta ( w abs arg -- theta ) : ^theta ( w abs arg -- theta )
>r >r >rect r> flog * swap r> * + ; inline >r >r >rect r> flog * swap r> * + ; inline
M: number (^) ( z w -- z^w ) M: number (^)
swap >polar 3dup ^theta >r ^mag r> polar> ; swap >polar 3dup ^theta >r ^mag r> polar> ;
: ^n ( z w -- z^w ) : ^n ( z w -- z^w )
@ -37,7 +37,7 @@ M: number (^) ( z w -- z^w )
{ [ t ] [ over sq over 2 /i ^n -rot 2 mod ^n * ] } { [ t ] [ over sq over 2 /i ^n -rot 2 mod ^n * ] }
} cond ; inline } cond ; inline
M: integer (^) ( z w -- z^w ) M: integer (^)
dup 0 < [ neg ^n recip ] [ ^n ] if ; dup 0 < [ neg ^n recip ] [ ^n ] if ;
: power-of-2? ( n -- ? ) : power-of-2? ( n -- ? )

View File

@ -16,7 +16,7 @@ IN: math-internals
: 2>fraction ( a/b c/d -- a c b d ) : 2>fraction ( a/b c/d -- a c b d )
[ >fraction ] 2apply swapd ; inline [ >fraction ] 2apply swapd ; inline
M: ratio number= ( a/b c/d -- ? ) M: ratio number=
2>fraction number= [ number= ] [ 2drop f ] if ; 2>fraction number= [ number= ] [ 2drop f ] if ;
: scale ( a/b c/d -- a*d b*c ) : scale ( a/b c/d -- a*d b*c )
@ -30,9 +30,9 @@ M: ratio <= scale <= ;
M: ratio > scale > ; M: ratio > scale > ;
M: ratio >= scale >= ; M: ratio >= scale >= ;
M: ratio + ( x y -- x+y ) 2dup scale + -rot ratio+d / ; M: ratio + 2dup scale + -rot ratio+d / ;
M: ratio - ( x y -- x-y ) 2dup scale - -rot ratio+d / ; M: ratio - 2dup scale - -rot ratio+d / ;
M: ratio * ( x y -- x*y ) 2>fraction * >r * r> / ; M: ratio * 2>fraction * >r * r> / ;
M: ratio / scale / ; M: ratio / scale / ;
M: ratio /i scale /i ; M: ratio /i scale /i ;
M: ratio mod 2dup >r >r /i r> r> rot * - ; M: ratio mod 2dup >r >r /i r> r> rot * - ;

View File

@ -22,7 +22,7 @@ M: quotation like drop dup quotation? [ >quotation ] unless ;
: make-dip ( quot n -- quot ) : make-dip ( quot n -- quot )
dup \ >r <array> -rot \ r> <array> append3 >quotation ; dup \ >r <array> -rot \ r> <array> append3 >quotation ;
: unit ( a -- [ a ] ) 1array >quotation ; : unit ( a -- quot ) 1array >quotation ;
GENERIC: literalize ( obj -- obj ) GENERIC: literalize ( obj -- obj )
M: object literalize ; M: object literalize ;

View File

@ -50,3 +50,22 @@ C: parse-error ( error -- error )
column get over set-parse-error-col column get over set-parse-error-col
line-text get over set-parse-error-text line-text get over set-parse-error-text
[ set-delegate ] keep ; [ set-delegate ] keep ;
TUPLE: effect in out declarations terminated? ;
C: effect
[
over { "*" } sequence=
[ nip t swap set-effect-terminated? ]
[ set-effect-out ] if
] keep
[ set-effect-in ] keep
H{ } clone over set-effect-declarations ;
: effect-height ( effect -- n )
dup effect-out length swap effect-in length - ;
: effect<= ( eff1 eff2 -- ? )
2dup [ effect-terminated? ] 2apply = >r
2dup [ effect-in length ] 2apply <= >r
[ effect-height ] 2apply number= r> and r> and ;

View File

@ -11,12 +11,6 @@ USING: alien arrays compiler definitions errors generic
hashtables kernel math modules namespaces parser sequences hashtables kernel math modules namespaces parser sequences
strings vectors words ; strings vectors words ;
: !(
CHAR: ) column [
line-text get index* dup -1 =
[ "Unterminated (" throw ] when 1+
] change ; parsing
: !! line-text get length column set ; parsing : !! line-text get length column set ; parsing
: !#! POSTPONE: ! ; parsing : !#! POSTPONE: ! ; parsing
: !IN: scan set-in ; parsing : !IN: scan set-in ; parsing
@ -83,3 +77,15 @@ DEFER: !PRIMITIVE: parsing
: !REQUIRES: : !REQUIRES:
string-mode on string-mode on
[ string-mode off [ (require) ] each ] f ; parsing [ string-mode off [ (require) ] each ] f ; parsing
: !(
word parse-effect dup 1array >vector effect-stack set
"declared-effect" set-word-prop ; parsing
: !|
scan scan-word \ ( eq? [
parse-effect dup effect-stack get push
swap add-declaration
] [
"Expected (" throw
] if ; parsing

View File

@ -57,7 +57,7 @@ TUPLE: no-word name ;
: (parse) ( str -- ) line-text set 0 column set parse-loop ; : (parse) ( str -- ) line-text set 0 column set parse-loop ;
TUPLE: bad-escape ; TUPLE: bad-escape ;
: bad-escape ( -- ) <bad-escape> throw ; : bad-escape ( -- * ) <bad-escape> throw ;
! Parsing word utilities ! Parsing word utilities
: escape ( ch -- esc ) : escape ( ch -- esc )
@ -90,6 +90,24 @@ TUPLE: bad-escape ;
column column
[ [ line-text get (parse-string) ] "" make swap ] change ; [ [ line-text get (parse-string) ] "" make swap ] change ;
SYMBOL: effect-stack
: (parse-effect)
scan [
dup ")" = [ drop ] [ , (parse-effect) ] if
] [
"Unexpected EOL" throw
] if* ;
: parse-effect ( -- effect )
[ (parse-effect) column get ] { } make swap column set
{ "--" } split1 <effect> ;
: add-declaration ( effect name -- )
effect-stack get [
2dup effect-in member? >r dupd effect-out member? r> or
] find nip effect-declarations set-hash ;
global [ global [
{ {
"scratchpad" "syntax" "arrays" "compiler" "definitions" "scratchpad" "syntax" "arrays" "compiler" "definitions"

View File

@ -122,7 +122,7 @@ TUPLE: newline ;
C: newline ( -- section ) C: newline ( -- section )
H{ } 0 <section> over set-delegate ; H{ } 0 <section> over set-delegate ;
M: newline pprint-section* ( newline -- ) M: newline pprint-section*
section-start fresh-line ; section-start fresh-line ;
: newline ( -- ) <newline> add-section ; : newline ( -- ) <newline> add-section ;
@ -138,7 +138,7 @@ M: newline pprint-section* ( newline -- )
: style> stdio [ delegate ] change ; : style> stdio [ delegate ] change ;
M: block pprint-section* ( block -- ) M: block pprint-section*
dup <style dup <style
f swap block-sections [ f swap block-sections [
over [ dup advance ] when pprint-section drop t over [ dup advance ] when pprint-section drop t
@ -175,11 +175,11 @@ GENERIC: pprint* ( obj -- )
: pprint-word ( obj -- ) : pprint-word ( obj -- )
dup word-name swap word-style styled-text ; dup word-name swap word-style styled-text ;
M: object pprint* ( obj -- ) M: object pprint*
"( unprintable object: " swap class word-name " )" append3 "( unprintable object: " swap class word-name " )" append3
text ; text ;
M: real pprint* ( obj -- ) number>string text ; M: real pprint* number>string text ;
: ch>ascii-escape ( ch -- esc ) : ch>ascii-escape ( ch -- esc )
H{ H{
@ -213,18 +213,18 @@ M: real pprint* ( obj -- ) number>string text ;
[ % [ unparse-ch ] each CHAR: " , ] "" make [ % [ unparse-ch ] each CHAR: " , ] "" make
do-string-limit text ; do-string-limit text ;
M: string pprint* ( str -- str ) "\"" pprint-string ; M: string pprint* "\"" pprint-string ;
M: sbuf pprint* ( str -- str ) "SBUF\" " pprint-string ; M: sbuf pprint* "SBUF\" " pprint-string ;
M: word pprint* ( word -- ) M: word pprint*
dup "pprint-close" word-prop [ block> ] when dup "pprint-close" word-prop [ block> ] when
dup pprint-word dup pprint-word
"pprint-open" word-prop [ H{ } <block ] when ; "pprint-open" word-prop [ H{ } <block ] when ;
M: f pprint* drop \ f pprint-word ; M: f pprint* drop \ f pprint-word ;
M: dll pprint* ( obj -- str ) dll-path "DLL\" " pprint-string ; M: dll pprint* dll-path "DLL\" " pprint-string ;
: nesting-limit? ( -- ? ) : nesting-limit? ( -- ? )
nesting-limit get dup [ pprinter-stack get length < ] when ; nesting-limit get dup [ pprinter-stack get length < ] when ;
@ -273,22 +273,22 @@ M: dll pprint* ( obj -- str ) dll-path "DLL\" " pprint-string ;
: pprint-sequence ( seq start end -- ) : pprint-sequence ( seq start end -- )
swap pprint* swap pprint-elements pprint* ; swap pprint* swap pprint-elements pprint* ;
M: complex pprint* ( num -- ) M: complex pprint*
>rect 2array \ C{ \ } pprint-sequence ; >rect 2array \ C{ \ } pprint-sequence ;
M: quotation pprint* ( list -- ) M: quotation pprint*
[ \ [ \ ] pprint-sequence ] check-recursion ; [ \ [ \ ] pprint-sequence ] check-recursion ;
M: array pprint* ( vector -- ) M: array pprint*
[ \ { \ } pprint-sequence ] check-recursion ; [ \ { \ } pprint-sequence ] check-recursion ;
M: vector pprint* ( vector -- ) M: vector pprint*
[ \ V{ \ } pprint-sequence ] check-recursion ; [ \ V{ \ } pprint-sequence ] check-recursion ;
M: hashtable pprint* ( hashtable -- ) M: hashtable pprint*
[ hash>alist \ H{ \ } pprint-sequence ] check-recursion ; [ hash>alist \ H{ \ } pprint-sequence ] check-recursion ;
M: tuple pprint* ( tuple -- ) M: tuple pprint*
[ [
\ T{ pprint* \ T{ pprint*
tuple>array dup first pprint* tuple>array dup first pprint*
@ -296,14 +296,14 @@ M: tuple pprint* ( tuple -- )
\ } pprint* \ } pprint*
] check-recursion ; ] check-recursion ;
M: alien pprint* ( alien -- ) M: alien pprint*
dup expired? [ dup expired? [
drop "( alien expired )" drop "( alien expired )"
] [ ] [
\ ALIEN: pprint-word alien-address number>string \ ALIEN: pprint-word alien-address number>string
] if text ; ] if text ;
M: wrapper pprint* ( wrapper -- ) M: wrapper pprint*
dup wrapped word? [ dup wrapped word? [
\ \ pprint-word wrapped pprint-word \ \ pprint-word wrapped pprint-word
] [ ] [

View File

@ -1,7 +1,7 @@
IN: temporary
USING: arrays errors generic inference kernel kernel-internals USING: arrays errors generic inference kernel kernel-internals
math math-internals namespaces parser sequences strings test math math-internals namespaces parser sequences strings test
vectors ; vectors words ;
IN: temporary
[ f ] [ f [ [ ] map-nodes ] with-node-iterator ] unit-test [ f ] [ f [ [ ] map-nodes ] with-node-iterator ] unit-test
@ -66,22 +66,22 @@ vectors ;
: no-base-case-1 dup [ no-base-case-1 ] [ no-base-case-1 ] if ; : no-base-case-1 dup [ no-base-case-1 ] [ no-base-case-1 ] if ;
[ [ no-base-case-1 ] infer ] unit-test-fails [ [ no-base-case-1 ] infer ] unit-test-fails
: simple-recursion-1 : simple-recursion-1 ( obj -- obj )
dup [ simple-recursion-1 ] [ ] if ; dup [ simple-recursion-1 ] [ ] if ;
[ { 1 1 } ] [ [ simple-recursion-1 ] infer ] unit-test [ { 1 1 } ] [ [ simple-recursion-1 ] infer ] unit-test
: simple-recursion-2 : simple-recursion-2 ( obj -- obj )
dup [ ] [ simple-recursion-2 ] if ; dup [ ] [ simple-recursion-2 ] if ;
[ { 1 1 } ] [ [ simple-recursion-2 ] infer ] unit-test [ { 1 1 } ] [ [ simple-recursion-2 ] infer ] unit-test
: bad-recursion-2 : bad-recursion-2 ( obj -- obj )
dup [ dup first swap second bad-recursion-2 ] [ ] if ; dup [ dup first swap second bad-recursion-2 ] [ ] if ;
[ [ bad-recursion-2 ] infer ] unit-test-fails [ [ bad-recursion-2 ] infer ] unit-test-fails
: funny-recursion : funny-recursion ( obj -- obj )
dup [ funny-recursion 1 ] [ 2 ] if drop ; dup [ funny-recursion 1 ] [ 2 ] if drop ;
[ { 1 1 } ] [ [ funny-recursion ] infer ] unit-test [ { 1 1 } ] [ [ funny-recursion ] infer ] unit-test
@ -122,7 +122,7 @@ DEFER: foe
[ { 0 0 } ] [ [ nested-when ] infer ] unit-test [ { 0 0 } ] [ [ nested-when ] infer ] unit-test
: nested-when* ( -- ) : nested-when* ( obj -- )
[ [
[ [
drop drop
@ -144,7 +144,7 @@ SYMBOL: sym-test
[ { 1 1 } ] [ [ terminator-branch ] infer ] unit-test [ { 1 1 } ] [ [ terminator-branch ] infer ] unit-test
: recursive-terminator : recursive-terminator ( obj -- )
dup [ dup [
recursive-terminator recursive-terminator
] [ ] [
@ -153,49 +153,48 @@ SYMBOL: sym-test
[ { 1 0 } ] [ [ recursive-terminator ] infer ] unit-test [ { 1 0 } ] [ [ recursive-terminator ] infer ] unit-test
GENERIC: potential-hang GENERIC: potential-hang ( obj -- obj )
M: fixnum potential-hang dup [ potential-hang ] when ; M: fixnum potential-hang dup [ potential-hang ] when ;
[ ] [ [ 5 potential-hang ] infer drop ] unit-test [ ] [ [ 5 potential-hang ] infer drop ] unit-test
TUPLE: funny-cons car cdr ; TUPLE: funny-cons car cdr ;
GENERIC: iterate GENERIC: iterate ( obj -- )
M: funny-cons iterate funny-cons-cdr iterate ; M: funny-cons iterate funny-cons-cdr iterate ;
M: f iterate drop ; M: f iterate drop ;
M: real iterate drop ; M: real iterate drop ;
[ { 1 0 } ] [ [ iterate ] infer ] unit-test [ { 1 0 } ] [ [ iterate ] infer ] unit-test
DEFER: agent DEFER: agent ( a b -- c d )
: smith 1+ agent ; inline : smith 1+ agent ; inline
: agent dup 0 = [ [ swap call ] 2keep smith ] when ; inline : agent dup 0 = [ [ swap call ] 2keep smith ] when ; inline
[ { 0 2 } ] [ { 0 2 } ]
[ [ [ drop ] 0 agent ] infer ] unit-test [ [ [ drop ] 0 agent ] infer ] unit-test
: no-base-case-2 no-base-case-2 ;
[ [ no-base-case-2 ] infer ] unit-test-fails
! Regression ! Regression
: cat dup [ throw ] [ throw ] if ; : cat ( obj -- * ) dup [ throw ] [ throw ] if ;
: dog dup [ cat ] [ 3drop ] if ; : dog ( a b c -- ) dup [ cat ] [ 3drop ] if ;
[ { 3 0 } ] [ [ dog ] infer ] unit-test [ { 3 0 } ] [ [ dog ] infer ] unit-test
! Regression ! Regression
DEFER: monkey DEFER: monkey
: friend dup [ friend ] [ monkey ] if ; : friend ( a b c -- ) dup [ friend ] [ monkey ] if ;
: monkey dup [ 3drop ] [ friend ] if ; : monkey ( a b c -- ) dup [ 3drop ] [ friend ] if ;
[ { 3 0 } ] [ [ friend ] infer ] unit-test [ { 3 0 } ] [ [ friend ] infer ] unit-test
! Regression -- same as above but we infer the second word first ! Regression -- same as above but we infer the second word first
DEFER: blah2 DEFER: blah2
: blah dup [ blah ] [ blah2 ] if ; : blah ( a b c -- ) dup [ blah ] [ blah2 ] if ;
: blah2 dup [ blah ] [ 3drop ] if ; : blah2 ( a b c -- ) dup [ blah ] [ 3drop ] if ;
[ { 3 0 } ] [ [ blah2 ] infer ] unit-test [ { 3 0 } ] [ [ blah2 ] infer ] unit-test
! Regression ! Regression
DEFER: blah4 DEFER: blah4
: blah3 dup [ blah3 ] [ dup [ blah4 ] [ blah3 ] if ] if ; : blah3 ( a b c -- )
: blah4 dup [ blah4 ] [ dup [ 3drop ] [ blah3 ] if ] if ; dup [ blah3 ] [ dup [ blah4 ] [ blah3 ] if ] if ;
: blah4 ( a b c -- )
dup [ blah4 ] [ dup [ 3drop ] [ blah3 ] if ] if ;
[ { 3 0 } ] [ [ blah4 ] infer ] unit-test [ { 3 0 } ] [ [ blah4 ] infer ] unit-test
! Regression ! Regression
@ -206,7 +205,7 @@ DEFER: blah4
[ swap slip ] keep swap bad-combinator [ swap slip ] keep swap bad-combinator
] if ; inline ] if ; inline
[ [ [ 1 ] [ ] bad-combinator ] infer ] unit-test-fails ! [ [ [ 1 ] [ ] bad-combinator ] infer ] unit-test-fails
! Regression ! Regression
: bad-input# : bad-input#
@ -219,18 +218,19 @@ DEFER: blah4
! This order of branches works ! This order of branches works
DEFER: do-crap DEFER: do-crap
: more-crap dup [ drop ] [ dup do-crap call ] if ; : more-crap ( obj -- ) dup [ drop ] [ dup do-crap call ] if ;
: do-crap dup [ more-crap ] [ do-crap ] if ; : do-crap ( obj -- ) dup [ more-crap ] [ do-crap ] if ;
[ [ do-crap ] infer ] unit-test-fails [ [ do-crap ] infer ] unit-test-fails
! This one does not ! This one does not
DEFER: do-crap* DEFER: do-crap*
: more-crap* dup [ drop ] [ dup do-crap* call ] if ; : more-crap* ( obj -- ) dup [ drop ] [ dup do-crap* call ] if ;
: do-crap* dup [ do-crap* ] [ more-crap* ] if ; : do-crap* ( obj -- ) dup [ do-crap* ] [ more-crap* ] if ;
[ [ do-crap* ] infer ] unit-test-fails [ [ do-crap* ] infer ] unit-test-fails
! Regression ! Regression
: too-deep dup [ drop ] [ 2dup too-deep too-deep * ] if ; inline : too-deep ( a b -- c )
dup [ drop ] [ 2dup too-deep too-deep * ] if ; inline
[ { 2 1 } ] [ [ too-deep ] infer ] unit-test [ { 2 1 } ] [ [ too-deep ] infer ] unit-test
! Error reporting is wrong ! Error reporting is wrong
@ -247,7 +247,7 @@ DEFER: A
DEFER: B DEFER: B
DEFER: C DEFER: C
: A : A ( a -- )
dup { dup {
[ drop ] [ drop ]
[ A ] [ A ]
@ -255,7 +255,7 @@ DEFER: C
[ dup C A ] [ dup C A ]
} dispatch ; } dispatch ;
: B : B ( b -- )
dup { dup {
[ C ] [ C ]
[ B ] [ B ]
@ -263,7 +263,7 @@ DEFER: C
[ dup B B ] [ dup B B ]
} dispatch ; } dispatch ;
: C : C ( c -- )
dup { dup {
[ A ] [ A ]
[ C ] [ C ]
@ -277,16 +277,26 @@ DEFER: C
! I found this bug by thinking hard about the previous one ! I found this bug by thinking hard about the previous one
DEFER: Y DEFER: Y
: X dup [ swap Y ] [ ] if ; : X ( a b -- c d ) dup [ swap Y ] [ ] if ;
: Y X ; : Y ( a b -- c d ) X ;
[ { 2 2 } ] [ [ X ] infer ] unit-test [ { 2 2 } ] [ [ X ] infer ] unit-test
[ { 2 2 } ] [ [ Y ] infer ] unit-test [ { 2 2 } ] [ [ Y ] infer ] unit-test
! This one comes from UI code
DEFER: #1
: #2 ( a b -- ) dup [ call ] [ 2drop ] if ; inline
: #3 ( a -- ) [ #1 ] #2 ;
: #4 ( a -- ) dup [ drop ] [ dup #4 dup #3 call ] if ;
: #1 ( a -- ) dup [ dup #4 dup #3 ] [ ] if drop ;
[ \ #4 word-def infer ] unit-test-fails
[ [ #1 ] infer ] unit-test-fails
! Similar ! Similar
DEFER: bar DEFER: bar
: foo dup [ 2drop f f bar ] [ ] if ; : foo ( a b -- c d ) dup [ 2drop f f bar ] [ ] if ;
: bar [ 2 2 + ] t foo drop call drop ; : bar ( a b -- ) [ 2 2 + ] t foo drop call drop ;
[ [ foo ] infer ] unit-test-fails [ [ foo ] infer ] unit-test-fails
@ -297,12 +307,12 @@ DEFER: bar
! This form should not have a stack effect ! This form should not have a stack effect
: bad-recursion-1 : bad-recursion-1 ( a -- b )
dup [ drop bad-recursion-1 5 ] [ ] if ; dup [ drop bad-recursion-1 5 ] [ ] if ;
[ [ bad-recursion-1 ] infer ] unit-test-fails [ [ bad-recursion-1 ] infer ] unit-test-fails
: bad-bin 5 [ 5 bad-bin bad-bin 5 ] [ 2drop ] if ; : bad-bin ( a b -- ) 5 [ 5 bad-bin bad-bin 5 ] [ 2drop ] if ;
[ [ bad-bin ] infer ] unit-test-fails [ [ bad-bin ] infer ] unit-test-fails
! Test some random library words ! Test some random library words

View File

@ -1,9 +1,5 @@
USING: arrays errors math parser test kernel generic words ;
IN: temporary IN: temporary
USE: parser
USE: test
USE: kernel
USE: generic
USE: words
[ 1 CHAR: a ] [ 1 CHAR: a ]
[ 0 "abcd" next-char ] unit-test [ 0 "abcd" next-char ] unit-test
@ -43,10 +39,6 @@ unit-test
[ "! This is a comment, people." parse call ] [ "! This is a comment, people." parse call ]
unit-test unit-test
[ ]
[ "( This is a comment, people. )" parse call ]
unit-test
! Test escapes ! Test escapes
[ [ " " ] ] [ [ " " ] ]
@ -63,3 +55,34 @@ unit-test
[ [ "Hello" ] ] [ "#! This calls until-eol.\n\"Hello\"" parse ] unit-test [ [ "Hello" ] ] [ "#! This calls until-eol.\n\"Hello\"" parse ] unit-test
[ word ] [ \ f class ] unit-test [ word ] [ \ f class ] unit-test
! Test stack effect parsing
: foo ( a b -- c ) + ;
[ T{ effect f { "a" "b" } { "c" } H{ } f } ]
[ \ foo "declared-effect" word-prop ] unit-test
: bar ( a quot -- b ) | quot ( u -- v ) call ;
[
T{ effect f
{ "a" "quot" }
{ "b" }
H{ { "quot" T{ effect f { "u" } { "v" } H{ } } } }
f
}
]
[ \ bar "declared-effect" word-prop ] unit-test
[ t ] [ 1 1 <effect> 2 2 <effect> effect<= ] unit-test
[ f ] [ 1 0 <effect> 2 2 <effect> effect<= ] unit-test
[ t ] [ 2 2 <effect> 2 2 <effect> effect<= ] unit-test
[ f ] [ 3 3 <effect> 2 2 <effect> effect<= ] unit-test
[ f ] [ 2 3 <effect> 2 2 <effect> effect<= ] unit-test
: baz ( a b -- * ) 2array throw ;
[ t ]
[ \ baz "declared-effect" word-prop effect-terminated? ]
unit-test

View File

@ -6,7 +6,7 @@ memory namespaces parser prettyprint sequences strings words
vectors ; vectors ;
TUPLE: assert got expect ; TUPLE: assert got expect ;
: assert ( got expect -- ) <assert> throw ; : assert ( got expect -- * ) <assert> throw ;
: assert= ( a b -- ) 2dup = [ 2drop ] [ assert ] if ; : assert= ( a b -- ) 2dup = [ 2drop ] [ assert ] if ;

View File

@ -11,13 +11,13 @@ PREDICATE: array kernel-error ( obj -- ? )
GENERIC: error. ( error -- ) GENERIC: error. ( error -- )
GENERIC: error-help ( error -- topic ) GENERIC: error-help ( error -- topic )
M: object error. ( error -- ) . ; M: object error. . ;
M: object error-help ( error -- topic ) drop f ; M: object error-help drop f ;
M: tuple error. ( error -- ) describe ; M: tuple error. describe ;
M: tuple error-help ( error -- topic ) class ; M: tuple error-help class ;
M: string error. ( error -- ) print ; M: string error. print ;
SYMBOL: restarts SYMBOL: restarts

View File

@ -12,9 +12,9 @@ GENERIC: sheet ( obj -- sheet )
dup third -rot first slot 2array dup third -rot first slot 2array
] map-with ; ] map-with ;
M: object sheet ( obj -- sheet ) slot-sheet ; M: object sheet slot-sheet ;
M: tuple sheet ( tuple -- sheet ) M: tuple sheet
dup slot-sheet swap delegate [ 1 tail ] unless ; dup slot-sheet swap delegate [ 1 tail ] unless ;
M: sequence summary M: sequence summary

View File

@ -80,14 +80,14 @@ DEFER: objc-error. ( alien -- )
callstack-overflow. callstack-overflow.
} nth ; } nth ;
M: kernel-error error. ( error -- ) dup kernel-error execute ; M: kernel-error error. dup kernel-error execute ;
M: kernel-error error-help ( error -- topic ) kernel-error ; M: kernel-error error-help kernel-error ;
M: no-method summary M: no-method summary
drop "No suitable method" ; drop "No suitable method" ;
M: no-method error. ( error -- ) M: no-method error.
"Generic word " write "Generic word " write
dup no-method-generic pprint dup no-method-generic pprint
" does not define a method for the " write " does not define a method for the " write
@ -150,7 +150,7 @@ M: no-word summary
parse-error-col [ 0 ] unless* parse-error-col [ 0 ] unless*
CHAR: \s <string> write "^" print ; CHAR: \s <string> write "^" print ;
M: parse-error error. ( error -- ) M: parse-error error.
dup parse-dump delegate error. ; dup parse-dump delegate error. ;
M: bounds-error summary drop "Sequence index out of bounds" ; M: bounds-error summary drop "Sequence index out of bounds" ;
@ -159,15 +159,15 @@ M: condition error. delegate error. ;
M: condition error-help drop f ; M: condition error-help drop f ;
M: alien-callback-error summary ( error -- ) M: alien-callback-error summary
drop "Words calling ``alien-callback'' cannot run in the interpreter. Compile the caller word and try again." ; drop "Words calling ``alien-callback'' cannot run in the interpreter. Compile the caller word and try again." ;
M: alien-invoke-error summary ( error -- ) M: alien-invoke-error summary
drop "Words calling ``alien-invoke'' cannot run in the interpreter. Compile the caller word and try again." ; drop "Words calling ``alien-invoke'' cannot run in the interpreter. Compile the caller word and try again." ;
M: assert summary drop "Assertion failed" ; M: assert summary drop "Assertion failed" ;
M: inference-error error. ( error -- ) M: inference-error error.
"Inference error:" print "Inference error:" print
dup inference-error-message print dup inference-error-message print
"Recursive state:" print "Recursive state:" print

View File

@ -120,23 +120,23 @@ SYMBOL: callframe-end
GENERIC: do-1 ( object -- ) GENERIC: do-1 ( object -- )
M: word do-1 ( word -- ) M: word do-1
dup "meta-word" word-prop [ call ] [ host-word ] ?if ; dup "meta-word" word-prop [ call ] [ host-word ] ?if ;
M: wrapper do-1 ( wrapper -- ) wrapped push-d ; M: wrapper do-1 wrapped push-d ;
M: object do-1 ( object -- ) push-d ; M: object do-1 push-d ;
GENERIC: do ( obj -- ) GENERIC: do ( obj -- )
M: word do ( word -- ) M: word do
dup "meta-word" word-prop [ dup "meta-word" word-prop [
call call
] [ ] [
dup compound? [ word-def meta-call ] [ host-word ] if dup compound? [ word-def meta-call ] [ host-word ] if
] ?if ; ] ?if ;
M: object do ( object -- ) do-1 ; M: object do do-1 ;
! The interpreter loses object identity of the name and catch ! The interpreter loses object identity of the name and catch
! stacks -- they are copied after each step -- so we execute ! stacks -- they are copied after each step -- so we execute

View File

@ -9,7 +9,7 @@ GENERIC: summary ( object -- string )
M: object summary M: object summary
"an instance of the " swap class word-name " class" append3 ; "an instance of the " swap class word-name " class" append3 ;
M: word summary ( word -- ) M: word summary
dup word-vocabulary [ dup word-vocabulary [
dup interned? dup interned?
"a word in the " "a word orphaned from the " ? "a word in the " "a word orphaned from the " ?
@ -18,11 +18,11 @@ M: word summary ( word -- )
drop "a uniquely generated symbol" drop "a uniquely generated symbol"
] if ; ] if ;
M: input summary ( input -- ) M: input summary
"Input: " swap input-string "Input: " swap input-string
dup string? [ unparse-short ] unless append ; dup string? [ unparse-short ] unless append ;
M: vocab-link summary ( vocab-link -- ) M: vocab-link summary
[ [
vocab-link-name dup % vocab-link-name dup %
" vocabulary (" % " vocabulary (" %

View File

@ -23,10 +23,10 @@ sequences ;
TUPLE: pasteboard handle ; TUPLE: pasteboard handle ;
M: pasteboard clipboard-contents ( pb -- str ) M: pasteboard clipboard-contents
pasteboard-handle pasteboard-string ; pasteboard-handle pasteboard-string ;
M: pasteboard set-clipboard-contents ( str pb -- ) M: pasteboard set-clipboard-contents
pasteboard-handle set-pasteboard-string ; pasteboard-handle set-pasteboard-string ;
: init-clipboard ( -- ) : init-clipboard ( -- )

View File

@ -67,8 +67,7 @@ M: gadget user-input* 2drop t ;
GENERIC: children-on ( rect/point gadget -- list ) GENERIC: children-on ( rect/point gadget -- list )
M: gadget children-on ( rect/point gadget -- list ) M: gadget children-on nip gadget-children ;
nip gadget-children ;
: inside? ( bounds gadget -- ? ) : inside? ( bounds gadget -- ? )
dup gadget-visible? dup gadget-visible?

View File

@ -20,9 +20,9 @@ C: book ( pages -- book )
: <book-control> ( model pages -- book ) : <book-control> ( model pages -- book )
<book> [ show-page ] <control> ; <book> [ show-page ] <control> ;
M: book pref-dim* ( book -- dim ) book-page pref-dim ; M: book pref-dim* book-page pref-dim ;
M: book layout* ( book -- ) M: book layout*
dup rect-dim swap book-page set-layout-dim ; dup rect-dim swap book-page set-layout-dim ;
: make-book ( model obj quots -- assoc ) : make-book ( model obj quots -- assoc )

View File

@ -20,11 +20,11 @@ C: border ( child gap -- border )
dup rect-dim over border-size 2 v*n v- dup rect-dim over border-size 2 v*n v-
swap gadget-child set-layout-dim ; swap gadget-child set-layout-dim ;
M: border pref-dim* ( border -- dim ) M: border pref-dim*
[ border-size 2 v*n ] keep [ border-size 2 v*n ] keep
gadget-child pref-dim v+ ; gadget-child pref-dim v+ ;
M: border layout* ( border -- ) M: border layout*
dup layout-border-loc layout-border-dim ; dup layout-border-loc layout-border-dim ;
: <spacing> ( -- gadget ) : <spacing> ( -- gadget )

View File

@ -70,7 +70,7 @@ C: repeat-button ( gadget quot -- button )
#! the mouse is held down. #! the mouse is held down.
[ >r <bevel-button> r> set-gadget-delegate ] keep ; [ >r <bevel-button> r> set-gadget-delegate ] keep ;
M: repeat-button tick ( ms object -- ) nip button-clicked ; M: repeat-button tick nip button-clicked ;
TUPLE: button-paint plain rollover pressed selected ; TUPLE: button-paint plain rollover pressed selected ;
@ -82,10 +82,10 @@ TUPLE: button-paint plain rollover pressed selected ;
{ [ t ] [ button-paint-plain ] } { [ t ] [ button-paint-plain ] }
} cond ; } cond ;
M: button-paint draw-interior ( button paint -- ) M: button-paint draw-interior
button-paint draw-interior ; button-paint draw-interior ;
M: button-paint draw-boundary ( button paint -- ) M: button-paint draw-boundary
button-paint draw-boundary ; button-paint draw-boundary ;
: <radio-control> ( model value gadget -- gadget ) : <radio-control> ( model value gadget -- gadget )

View File

@ -18,7 +18,7 @@ M: control graft*
M: control ungraft* M: control ungraft*
dup control-self swap control-model remove-connection ; dup control-self swap control-model remove-connection ;
M: control model-changed ( gadget -- ) M: control model-changed
[ control-model model-value ] keep [ control-model model-value ] keep
[ dup control-self swap control-quot call ] keep [ dup control-self swap control-quot call ] keep
control-self relayout ; control-self relayout ;

View File

@ -32,7 +32,7 @@ C: frame ( -- frame )
: fill-center ( horiz vert dim -- ) : fill-center ( horiz vert dim -- )
tuck (fill-center) (fill-center) ; tuck (fill-center) (fill-center) ;
M: frame layout* ( frame -- dim ) M: frame layout*
dup [ dup [
[ rot rect-dim fill-center ] 2keep grid-layout [ rot rect-dim fill-center ] 2keep grid-layout
] with-grid ; ] with-grid ;

View File

@ -20,7 +20,7 @@ SYMBOL: grid-dim
swap grid-positions grid get rect-dim { 1 0 } v- add swap grid-positions grid get rect-dim { 1 0 } v- add
[ grid-line-from/to gl-line ] each-with ; [ grid-line-from/to gl-line ] each-with ;
M: grid-lines draw-boundary ( gadget paint -- ) M: grid-lines draw-boundary
#! Clean this up later. #! Clean this up later.
GL_MODELVIEW [ GL_MODELVIEW [
grid-lines-color gl-color [ grid-lines-color gl-color [

View File

@ -39,7 +39,7 @@ C: grid ( children -- grid )
: (pair-up) ( horiz vert -- dim ) : (pair-up) ( horiz vert -- dim )
>r first r> second 2array ; >r first r> second 2array ;
M: grid pref-dim* ( grid -- dim ) M: grid pref-dim*
[ [
[ gap [ v+ gap v+ ] reduce ] 2apply (pair-up) [ gap [ v+ gap v+ ] reduce ] 2apply (pair-up)
] with-grid ; ] with-grid ;
@ -65,7 +65,7 @@ M: grid pref-dim* ( grid -- dim )
: grid-layout ( horiz vert -- ) : grid-layout ( horiz vert -- )
2dup position-grid resize-grid ; 2dup position-grid resize-grid ;
M: grid layout* ( frame -- dim ) M: grid layout*
[ grid-layout ] with-grid ; [ grid-layout ] with-grid ;
: build-grid ( grid specs -- ) : build-grid ( grid specs -- )

View File

@ -19,7 +19,7 @@ C: incremental ( pack -- incremental )
[ set-gadget-delegate ] keep [ set-gadget-delegate ] keep
dup delegate pref-dim over set-incremental-cursor ; dup delegate pref-dim over set-incremental-cursor ;
M: incremental pref-dim* ( incremental -- dim ) M: incremental pref-dim*
dup gadget-state [ dup gadget-state [
dup delegate pref-dim over set-incremental-cursor dup delegate pref-dim over set-incremental-cursor
] when incremental-cursor ; ] when incremental-cursor ;

View File

@ -17,13 +17,13 @@ C: label ( text -- label )
dup label-font lookup-font dup font-height >r dup label-font lookup-font dup font-height >r
swap label-text string-width r> 2array ; swap label-text string-width r> 2array ;
M: label pref-dim* ( label -- dim ) label-size ; M: label pref-dim* label-size ;
: draw-label ( label -- ) : draw-label ( label -- )
dup label-color gl-color dup label-color gl-color
dup label-font swap label-text draw-string ; dup label-font swap label-text draw-string ;
M: label draw-gadget* ( label -- ) draw-label ; M: label draw-gadget* draw-label ;
: <label-control> ( model -- gadget ) : <label-control> ( model -- gadget )
"" <label> [ set-label-text ] <control> ; "" <label> [ set-label-text ] <control> ;

View File

@ -8,7 +8,7 @@ gadgets-theme generic io kernel math opengl sequences styles ;
! Vertical line. ! Vertical line.
TUPLE: guide color ; TUPLE: guide color ;
M: guide draw-interior ( gadget interior -- ) M: guide draw-interior
guide-color gl-color guide-color gl-color
rect-dim dup { 0.5 0 0 } v* swap { 0.5 1 0 } v* gl-line ; rect-dim dup { 0.5 0 0 } v* swap { 0.5 1 0 } v* gl-line ;

View File

@ -43,11 +43,11 @@ C: pane ( -- pane )
GENERIC: write-gadget ( gadget stream -- ) GENERIC: write-gadget ( gadget stream -- )
M: pane write-gadget ( gadget pane -- ) M: pane write-gadget
#! Print a gadget to the given pane. #! Print a gadget to the given pane.
pane-current add-gadget ; pane-current add-gadget ;
M: duplex-stream write-gadget ( gadget stream -- ) M: duplex-stream write-gadget
duplex-stream-out write-gadget ; duplex-stream-out write-gadget ;
: print-gadget ( gadget pane -- ) : print-gadget ( gadget pane -- )
@ -58,29 +58,29 @@ M: duplex-stream write-gadget ( gadget stream -- )
stdio get print-gadget ; stdio get print-gadget ;
! Panes are streams. ! Panes are streams.
M: pane stream-flush ( pane -- ) drop ; M: pane stream-flush drop ;
: scroll-pane ( pane -- ) : scroll-pane ( pane -- )
dup pane-scrolls? [ scroll>bottom ] [ drop ] if ; dup pane-scrolls? [ scroll>bottom ] [ drop ] if ;
M: pane stream-terpri ( pane -- ) M: pane stream-terpri
dup pane-current prepare-print dup pane-current prepare-print
over pane-output add-incremental over pane-output add-incremental
dup prepare-line dup prepare-line
scroll-pane ; scroll-pane ;
M: pane stream-write1 ( char pane -- ) M: pane stream-write1
[ pane-current stream-write1 ] keep scroll-pane ; [ pane-current stream-write1 ] keep scroll-pane ;
M: pane stream-write ( string pane -- ) M: pane stream-write
[ swap "\n" split pane-write ] keep scroll-pane ; [ swap "\n" split pane-write ] keep scroll-pane ;
M: pane stream-format ( string style pane -- ) M: pane stream-format
[ rot "\n" split pane-format ] keep scroll-pane ; [ rot "\n" split pane-format ] keep scroll-pane ;
M: pane stream-close ( pane -- ) drop ; M: pane stream-close drop ;
M: pane with-stream-style ( quot style pane -- ) M: pane with-stream-style
(with-stream-style) ; (with-stream-style) ;
: ?terpri : ?terpri

View File

@ -10,7 +10,7 @@ TUPLE: word-break-gadget ;
C: word-break-gadget ( gadget -- gadget ) C: word-break-gadget ( gadget -- gadget )
[ set-delegate ] keep ; [ set-delegate ] keep ;
M: word-break-gadget draw-gadget* ( gadget -- ) drop ; M: word-break-gadget draw-gadget* drop ;
! A gadget that arranges its children in a word-wrap style. ! A gadget that arranges its children in a word-wrap style.
TUPLE: paragraph margin ; TUPLE: paragraph margin ;
@ -61,8 +61,8 @@ SYMBOL: margin
[ wrap-step ] each-child-with wrap-dim [ wrap-step ] each-child-with wrap-dim
] with-scope ; inline ] with-scope ; inline
M: paragraph pref-dim* ( paragraph -- dim ) M: paragraph pref-dim*
[ 2drop ] do-wrap ; [ 2drop ] do-wrap ;
M: paragraph layout* ( paragraph -- ) M: paragraph layout*
[ swap dup prefer set-rect-loc ] do-wrap drop ; [ swap dup prefer set-rect-loc ] do-wrap drop ;

View File

@ -18,7 +18,7 @@ C: object-button ( gadget object -- button )
r> set-gadget-delegate r> set-gadget-delegate
] keep ; ] keep ;
M: object-button gadget-help ( button -- string ) M: object-button gadget-help
object-button-object dup word? [ synopsis ] [ summary ] if ; object-button-object dup word? [ synopsis ] [ summary ] if ;
! Character styles ! Character styles
@ -107,26 +107,26 @@ M: object-button gadget-help ( button -- string )
[ pick pick >r >r -rot styled-pane r> r> rot ] map [ pick pick >r >r -rot styled-pane r> r> rot ] map
] map styled-grid nip ; ] map styled-grid nip ;
M: pane with-stream-table ( grid quot style pane -- ) M: pane with-stream-table
>r rot <pane-grid> r> print-gadget ; >r rot <pane-grid> r> print-gadget ;
M: pane with-nested-stream ( quot style stream -- ) M: pane with-nested-stream
>r styled-pane r> write-gadget ; >r styled-pane r> write-gadget ;
! Stream utilities ! Stream utilities
M: pack stream-close ( stream -- ) drop ; M: pack stream-close drop ;
M: paragraph stream-close ( stream -- ) drop ; M: paragraph stream-close drop ;
: gadget-write ( string gadget -- ) : gadget-write ( string gadget -- )
over empty? [ 2drop ] [ >r <label> r> add-gadget ] if ; over empty? [ 2drop ] [ >r <label> r> add-gadget ] if ;
M: pack stream-write ( string stream -- ) gadget-write ; M: pack stream-write gadget-write ;
: gadget-bl ( style stream -- ) : gadget-bl ( style stream -- )
>r " " <presentation> <word-break-gadget> r> add-gadget ; >r " " <presentation> <word-break-gadget> r> add-gadget ;
M: paragraph stream-write ( string stream -- ) M: paragraph stream-write
swap " " split swap " " split
[ over gadget-write ] [ H{ } over gadget-bl ] interleave [ over gadget-write ] [ H{ } over gadget-bl ] interleave
drop ; drop ;
@ -134,9 +134,9 @@ M: paragraph stream-write ( string stream -- )
: gadget-write1 ( char gadget -- ) : gadget-write1 ( char gadget -- )
>r ch>string r> stream-write ; >r ch>string r> stream-write ;
M: pack stream-write1 ( char stream -- ) gadget-write1 ; M: pack stream-write1 gadget-write1 ;
M: paragraph stream-write1 ( char stream -- ) M: paragraph stream-write1
over CHAR: \s = over CHAR: \s =
[ H{ } swap gadget-bl drop ] [ gadget-write1 ] if ; [ H{ } swap gadget-bl drop ] [ gadget-write1 ] if ;
@ -144,10 +144,10 @@ M: paragraph stream-write1 ( char stream -- )
pick empty? pick empty?
[ 3drop ] [ >r swap <presentation> r> add-gadget ] if ; [ 3drop ] [ >r swap <presentation> r> add-gadget ] if ;
M: pack stream-format ( string style stream -- ) M: pack stream-format
gadget-format ; gadget-format ;
M: paragraph stream-format ( string style stream -- ) M: paragraph stream-format
presented pick hash [ presented pick hash [
gadget-format gadget-format
] [ ] [

View File

@ -85,10 +85,10 @@ C: scroller ( gadget -- scroller )
dup scroller-origin scroll dup scroller-origin scroll
] if ; ] if ;
M: scroller layout* ( scroller -- ) M: scroller layout*
dup delegate layout* dup delegate layout*
dup layout-children dup layout-children
update-scroller ; update-scroller ;
M: scroller focusable-child* ( scroller -- viewport ) M: scroller focusable-child*
scroller-viewport ; scroller-viewport ;

View File

@ -116,7 +116,7 @@ C: elevator ( vector -- elevator )
: layout-thumb ( slider -- ) : layout-thumb ( slider -- )
dup layout-thumb-loc layout-thumb-dim ; dup layout-thumb-loc layout-thumb-dim ;
M: elevator layout* ( elevator -- ) M: elevator layout*
find-slider layout-thumb ; find-slider layout-thumb ;
: slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ; : slide-by-line ( -1/1 slider -- ) >r 32 * r> slide-by ;

View File

@ -32,14 +32,14 @@ C: track ( orientation -- track )
[ [ over n*v , ] [ divider-size , ] interleave ] { } make [ [ over n*v , ] [ divider-size , ] interleave ] { } make
nip ; nip ;
M: track layout* ( track -- ) M: track layout*
dup track-layout packed-layout ; dup track-layout packed-layout ;
: track-pref-dims ( dims sizes -- dims ) : track-pref-dims ( dims sizes -- dims )
[ [ dup zero? [ nip ] [ v/n ] if ] 2map max-dim ] keep [ [ dup zero? [ nip ] [ v/n ] if ] 2map max-dim ] keep
divider-sizes v+ [ >fixnum ] map ; divider-sizes v+ [ >fixnum ] map ;
M: track pref-dim* ( track -- dim ) M: track pref-dim*
[ [
dup gadget-children dup gadget-children
2 group [ first ] map pref-dims 2 group [ first ] map pref-dims

View File

@ -15,13 +15,13 @@ C: viewport ( content -- viewport )
[ >r 3 <border> r> add-gadget ] keep [ >r 3 <border> r> add-gadget ] keep
t over set-gadget-clipped? ; t over set-gadget-clipped? ;
M: viewport layout* ( viewport -- ) M: viewport layout*
dup gadget-child dup pref-dim rot rect-dim vmax dup gadget-child dup pref-dim rot rect-dim vmax
swap set-layout-dim ; swap set-layout-dim ;
M: viewport focusable-child* ( viewport -- gadget ) M: viewport focusable-child*
gadget-child ; gadget-child ;
M: viewport pref-dim* ( viewport -- dim ) viewport-dim ; M: viewport pref-dim* viewport-dim ;
: viewport-rect ( rect -- rect ) { 3 3 } offset-rect ; : viewport-rect ( rect -- rect ) { 3 3 } offset-rect ;

View File

@ -141,16 +141,16 @@ C: pack ( vector -- pack )
[ >r [ max-dim ] keep r> pack-gap swap gap-dims ] keep [ >r [ max-dim ] keep r> pack-gap swap gap-dims ] keep
gadget-orientation set-axis ; gadget-orientation set-axis ;
M: pack pref-dim* ( pack -- dim ) M: pack pref-dim*
[ gadget-children pref-dims ] keep pack-pref-dim ; [ gadget-children pref-dims ] keep pack-pref-dim ;
M: pack layout* ( pack -- ) M: pack layout*
dup gadget-children pref-dims packed-layout ; dup gadget-children pref-dims packed-layout ;
: fast-children-on ( dim axis gadgets -- i ) : fast-children-on ( dim axis gadgets -- i )
swapd [ rect-loc v- over v. ] binsearch nip ; swapd [ rect-loc v- over v. ] binsearch nip ;
M: pack children-on ( rect pack -- list ) M: pack children-on
dup gadget-orientation swap gadget-children [ dup gadget-orientation swap gadget-children [
3dup 3dup
>r >r dup rect-loc swap rect-dim v+ origin get v- r> r> fast-children-on 1+ >r >r dup rect-loc swap rect-dim v+ origin get v- r> r> fast-children-on 1+

View File

@ -56,7 +56,7 @@ GENERIC: model-changed ( observer -- )
GENERIC: set-model ( value model -- ) GENERIC: set-model ( value model -- )
M: model set-model ( value model -- ) M: model set-model
[ set-model-value ] keep [ set-model-value ] keep
model-connections [ model-changed ] each ; model-connections [ model-changed ] each ;
@ -84,7 +84,7 @@ C: filter ( model quot -- filter )
[ add-dependency ] keep [ add-dependency ] keep
dup model-changed ; dup model-changed ;
M: filter model-changed ( filter -- ) M: filter model-changed
dup filter-model model-value over filter-quot call dup filter-model model-value over filter-quot call
swap set-model ; swap set-model ;
@ -97,7 +97,7 @@ C: validator ( model quot -- filter )
[ add-dependency ] keep [ add-dependency ] keep
dup model-changed ; dup model-changed ;
M: validator model-changed ( validator -- ) M: validator model-changed
dup validator-model model-value dup dup validator-model model-value dup
pick validator-quot call [ pick validator-quot call [
swap delegate set-model swap delegate set-model
@ -105,7 +105,7 @@ M: validator model-changed ( validator -- )
2drop 2drop
] if ; ] if ;
M: validator set-model ( value validator -- ) M: validator set-model
2dup validator-quot call [ 2dup validator-quot call [
validator-model set-model validator-model set-model
] [ ] [
@ -119,11 +119,11 @@ C: compose ( models -- compose )
[ set-model-dependencies ] keep [ set-model-dependencies ] keep
dup model-changed ; dup model-changed ;
M: compose model-changed ( compose -- ) M: compose model-changed
dup model-dependencies [ model-value ] map dup model-dependencies [ model-value ] map
swap delegate set-model ; swap delegate set-model ;
M: compose set-model ( value compose -- ) M: compose set-model
model-dependencies [ set-model ] 2each ; model-dependencies [ set-model ] 2each ;
TUPLE: history back forward ; TUPLE: history back forward ;
@ -136,7 +136,7 @@ C: history ( value -- history )
G: (add-history) ( history vector -- ) G: (add-history) ( history vector -- )
1 standard-combination ; 1 standard-combination ;
M: history (add-history) ( history vector -- ) M: history (add-history)
swap model-value dup [ swap push ] [ 2drop ] if ; swap model-value dup [ swap push ] [ 2drop ] if ;
: go-back/forward ( history to from -- ) : go-back/forward ( history to from -- )
@ -152,6 +152,6 @@ M: history (add-history) ( history vector -- )
GENERIC: add-history ( history -- ) GENERIC: add-history ( history -- )
M: history add-history ( history -- ) M: history add-history
dup history-forward delete-all dup history-forward delete-all
dup history-back (add-history) ; dup history-back (add-history) ;

View File

@ -25,7 +25,7 @@ SYMBOL: clip
GENERIC: draw-gadget* ( gadget -- ) GENERIC: draw-gadget* ( gadget -- )
M: gadget draw-gadget* ( gadget -- ) drop ; M: gadget draw-gadget* drop ;
GENERIC: draw-interior ( gadget interior -- ) GENERIC: draw-interior ( gadget interior -- )
@ -94,7 +94,7 @@ M: solid draw-boundary
! Gradient pen ! Gradient pen
TUPLE: gradient colors ; TUPLE: gradient colors ;
M: gradient draw-interior ( gadget gradient -- ) M: gradient draw-interior
over gadget-orientation swap gradient-colors rot rect-dim over gadget-orientation swap gradient-colors rot rect-dim
gl-gradient ; gl-gradient ;
@ -104,10 +104,10 @@ TUPLE: polygon color points ;
: draw-polygon ( polygon quot -- ) : draw-polygon ( polygon quot -- )
>r dup polygon-color gl-color polygon-points r> each ; inline >r dup polygon-color gl-color polygon-points r> each ; inline
M: polygon draw-boundary ( gadget polygon -- ) M: polygon draw-boundary
[ gl-poly ] draw-polygon drop ; [ gl-poly ] draw-polygon drop ;
M: polygon draw-interior ( gadget polygon -- ) M: polygon draw-interior
[ gl-fill-poly ] draw-polygon drop ; [ gl-fill-poly ] draw-polygon drop ;
: arrow-up { { { 3 0 } { 6 6 } { 0 6 } } } ; : arrow-up { { { 3 0 } { 6 6 } { 0 6 } } } ;

View File

@ -128,11 +128,11 @@ C: document ( -- document )
: clear-doc ( document -- ) : clear-doc ( document -- )
"" swap set-doc-text ; "" swap set-doc-text ;
M: document (add-history) ( document vector -- ) M: document (add-history)
>r model-value dup { "" } sequence= >r model-value dup { "" } sequence=
[ r> 2drop ] [ r> push-new ] if ; [ r> 2drop ] [ r> push-new ] if ;
M: document add-history ( document -- ) M: document add-history
#! Add the new entry at the end of the history, and avoid #! Add the new entry at the end of the history, and avoid
#! duplicates. #! duplicates.
dup history-back dup dup history-back dup

View File

@ -32,17 +32,17 @@ C: editor ( document -- editor )
: deactivate-editor-model ( editor model -- ) : deactivate-editor-model ( editor model -- )
dup deactivate-model swap control-model remove-loc ; dup deactivate-model swap control-model remove-loc ;
M: editor graft* ( editor -- ) M: editor graft*
dup dup editor-caret activate-editor-model dup dup editor-caret activate-editor-model
dup dup editor-mark activate-editor-model dup dup editor-mark activate-editor-model
dup control-self swap control-model add-connection ; dup control-self swap control-model add-connection ;
M: editor ungraft* ( editor -- ) M: editor ungraft*
dup dup editor-caret deactivate-editor-model dup dup editor-caret deactivate-editor-model
dup dup editor-mark deactivate-editor-model dup dup editor-mark deactivate-editor-model
dup control-self swap control-model remove-connection ; dup control-self swap control-model remove-connection ;
M: editor model-changed ( editor -- ) M: editor model-changed
control-self dup control-model control-self dup control-model
over editor-caret [ over validate-loc ] (change-model) over editor-caret [ over validate-loc ] (change-model)
over editor-mark [ over validate-loc ] (change-model) over editor-mark [ over validate-loc ] (change-model)
@ -124,7 +124,7 @@ M: editor model-changed ( editor -- )
: scroll>caret ( editor -- ) : scroll>caret ( editor -- )
dup caret-rect swap scroll>rect ; dup caret-rect swap scroll>rect ;
M: loc-monitor model-changed ( obj -- ) M: loc-monitor model-changed
loc-monitor-editor dup scroll>caret loc-monitor-editor dup scroll>caret
control-self relayout ; control-self relayout ;
@ -182,7 +182,7 @@ M: loc-monitor model-changed ( obj -- )
] each-line 2drop ] each-line 2drop
] do-matrix ; ] do-matrix ;
M: editor draw-gadget* ( gadget -- ) M: editor draw-gadget*
[ draw-caret draw-selection draw-lines ] with-editor ; [ draw-caret draw-selection draw-lines ] with-editor ;
: editor-height ( editor -- n ) : editor-height ( editor -- n )
@ -192,20 +192,20 @@ M: editor draw-gadget* ( gadget -- )
0 swap dup editor-font* swap editor-lines 0 swap dup editor-font* swap editor-lines
[ string-width max ] each-with ; [ string-width max ] each-with ;
M: editor pref-dim* ( editor -- dim ) M: editor pref-dim*
dup editor-width swap editor-height 2array ; dup editor-width swap editor-height 2array ;
M: editor gadget-selection? ( editor -- ? ) M: editor gadget-selection?
selection-start/end = not ; selection-start/end = not ;
M: editor gadget-selection ( editor -- str ) M: editor gadget-selection
[ selection-start/end ] keep control-model doc-range ; [ selection-start/end ] keep control-model doc-range ;
: remove-editor-selection ( editor -- ) : remove-editor-selection ( editor -- )
[ selection-start/end ] keep control-model [ selection-start/end ] keep control-model
remove-doc-range ; remove-doc-range ;
M: editor user-input* ( str editor -- ? ) M: editor user-input*
[ selection-start/end ] keep control-model set-doc-range t ; [ selection-start/end ] keep control-model set-doc-range t ;
: editor-text ( editor -- str ) : editor-text ( editor -- str )

View File

@ -11,7 +11,7 @@ C: interactor ( output -- gadget )
f <field> over set-gadget-delegate f <field> over set-gadget-delegate
dup dup set-control-self ; dup dup set-control-self ;
M: interactor graft* ( interactor -- ) M: interactor graft*
f over set-interactor-busy? delegate graft* ; f over set-interactor-busy? delegate graft* ;
: interactor-eval ( string interactor -- ) : interactor-eval ( string interactor -- )
@ -55,6 +55,6 @@ interactor H{
{ T{ key-down f { C+ } "d" } [ f swap interactor-eval ] } { T{ key-down f { C+ } "d" } [ f swap interactor-eval ] }
} set-gestures } set-gestures
M: interactor stream-readln ( interactor -- line ) M: interactor stream-readln
f over set-interactor-busy? f over set-interactor-busy?
[ over set-interactor-continuation stop ] callcc1 nip ; [ over set-interactor-continuation stop ] callcc1 nip ;

View File

@ -164,6 +164,6 @@ M: browser gadget-title drop "Browser" <model> ;
: browser-tool [ browser? ] [ <browser> ] [ browse ] ; : browser-tool [ browser? ] [ <browser> ] [ browse ] ;
M: word show ( word -- ) browser-tool call-tool ; M: word show browser-tool call-tool ;
M: vocab-link show ( vocab -- ) browser-tool call-tool ; M: vocab-link show browser-tool call-tool ;

View File

@ -47,4 +47,4 @@ M: help-gadget pref-dim*
[ <help-gadget> ] [ <help-gadget> ]
[ show-help ] ; [ show-help ] ;
M: link show ( link -- ) help-tool call-tool ; M: link show help-tool call-tool ;

View File

@ -51,7 +51,7 @@ C: listener-gadget ( -- gadget )
M: listener-gadget pref-dim* M: listener-gadget pref-dim*
delegate pref-dim* { 500 600 } vmax ; delegate pref-dim* { 500 600 } vmax ;
M: listener-gadget focusable-child* ( listener -- gadget ) M: listener-gadget focusable-child*
listener-gadget-input ; listener-gadget-input ;
M: listener-gadget gadget-title drop "Listener" <model> ; M: listener-gadget gadget-title drop "Listener" <model> ;
@ -81,8 +81,8 @@ M: listener-gadget gadget-title drop "Listener" <model> ;
[ [ run-file ] each ] curry listener-tool call-tool [ [ run-file ] each ] curry listener-tool call-tool
] if ; ] if ;
M: input show ( input -- ) M: input show
input-string listener-tool call-tool ; input-string listener-tool call-tool ;
M: object show ( object -- ) M: object show
[ inspect ] curry listener-tool call-tool ; [ inspect ] curry listener-tool call-tool ;

View File

@ -87,7 +87,7 @@ M: walker-gadget gadget-title
M: walker-gadget pref-dim* M: walker-gadget pref-dim*
delegate pref-dim* { 600 600 } vmax ; delegate pref-dim* { 600 600 } vmax ;
M: walker-gadget focusable-child* ( listener -- gadget ) M: walker-gadget focusable-child*
walker-gadget-input ; walker-gadget-input ;
: walker-continuation ( -- continuation ) : walker-continuation ( -- continuation )

View File

@ -153,7 +153,7 @@ C: world-error ( error world -- error )
[ set-world-error-world ] keep [ set-world-error-world ] keep
[ set-delegate ] keep ; [ set-delegate ] keep ;
M: world-error error. ( world-error -- ) M: world-error error.
"An error occurred while drawing the world " write "An error occurred while drawing the world " write
dup world-error-world pprint-short "." print dup world-error-world pprint-short "." print
"This world has been deactivated to prevent cascading errors." print "This world has been deactivated to prevent cascading errors." print

View File

@ -45,8 +45,8 @@ IN: win32
CloseClipboard drop ; CloseClipboard drop ;
TUPLE: pasteboard ; TUPLE: pasteboard ;
M: pasteboard clipboard-contents ( pb -- str ) drop paste ; M: pasteboard clipboard-contents drop paste ;
M: pasteboard set-clipboard-contents ( str pb -- ) drop copy ; M: pasteboard set-clipboard-contents drop copy ;
: init-clipboard ( -- ) : init-clipboard ( -- )
<pasteboard> clipboard set-global ; <pasteboard> clipboard set-global ;

Some files were not shown because too many files have changed in this diff Show More