First stage of stack effect declaration implementation
parent
fbddcdcca0
commit
56e19dbf14
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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? [
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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? [
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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*
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ] }
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -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 [
|
||||||
|
|
|
@ -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{
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 -- )
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) ;
|
||||||
|
|
|
@ -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
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 >= [
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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< ;
|
||||||
|
|
|
@ -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
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -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" ] }
|
||||||
|
|
|
@ -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 -- ? )
|
||||||
|
|
|
@ -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 * - ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 (" %
|
||||||
|
|
|
@ -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 ( -- )
|
||||||
|
|
|
@ -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?
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 [
|
||||||
|
|
|
@ -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 -- )
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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> ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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+
|
||||||
|
|
|
@ -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) ;
|
||||||
|
|
|
@ -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 } } } ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue