-- workspace window takes too long to come up
-- bogus compile error
-- windows crash
-
+ 0.87:
- these things are "Too Slow":
+ ui:
+- workspace window takes too long to come up
- new windows don't always have focus, eg focus follows mouse
- dataflow for [ ] map [ ] subset looks weird (wrong?)
- listener commands from a menu should not include 'hide-glass' etc
+ compiler/ffi:
+- bogus compile error
- recompile get/set/>n/n>/ndrop if needed
- %allot-bignum-signed-2 is broken on both platforms
- cross-word type inference
+ misc:
+- windows crash
- growable data heap
- minor GC takes too long now, we should card mark code heap
- buffer-ptr should be an alien
: init-rule ( -- ) 8 <hashtable> >rule ;
-: rule-keys ( -- { ... } )
+: rule-keys ( -- array )
{ { 1 1 1 }
{ 1 1 0 }
{ 1 0 1 }
"cairo_t*" "cairo" "cairo_create" [ "void*" ] alien-invoke ;
: cairo_destroy ( cairo_t -- )
- "void" "cairo" "cairo_destroy" [ "cairo_t*" ] ;
+ "void" "cairo" "cairo_destroy" [ "cairo_t*" ] alien-invoke ;
: cairo_set_operator ( cairo_t cairo_operator_t -- )
- "void" "cairo" "cairo_set_operator" [ "cairo_t*" "int" ] ;
+ "void" "cairo" "cairo_set_operator" [ "cairo_t*" "int" ] alien-invoke ;
: cairo_image_surface_create_for_data ( data format width height stride -- cairo_surface_t )
"void*" "cairo" "cairo_image_surface_create_for_data" [ "void*" "uint" "int" "int" "int" ] alien-invoke ;
: >64-bit ( n -- n ) HEX: ffffffffffffffff bitand ; inline
IN: crypto-internals
-: w+ ( int -- int ) + >32-bit ; inline
+: w+ ( int int -- int ) + >32-bit ; inline
: nth-int ( string n -- int ) 2 shift dup 4 + rot <slice> le> ; inline
: nth-int-be ( string n -- int ) 2 shift dup 4 + rot <slice> be> ; inline
: update ( num var -- ) [ w+ ] change ; inline
: init-miller-rabin ( n trials -- ) 0 composite set trials set n set ;
-: (miller-rabin) ( n -- bool )
+: (miller-rabin) ( -- bool )
n get dup 1 = [ drop f ]
[
even? [
HEX: 0F HEX: 8F HEX: 4F HEX: CF HEX: 2F HEX: AF HEX: 6F HEX: EF HEX: 1F HEX: 9F HEX: 5F HEX: DF HEX: 3F HEX: BF HEX: 7F HEX: FF
} ; inline
-: modular-exp ( a b n -- d )
- n set b set a set 0 c set 1 d set
- [
- [ ] each-bit
- ] with-scope ;
-
! ------- editing operations ---------------
-G: insert* 2 standard-combination ;
+G: insert* ( seq position gb -- ) 2 standard-combination ;
: prepare-insert ( seq position gb -- seq gb )
tuck move-gap over length over ensure-room ;
LAZY: 'e' ( -- parser )
"e" token "E" token <|> ;
-: sign-number ( { minus? num } -- number )
+: sign-number ( pair -- number )
+ #! Pair is { minus? num }
#! Convert the json number value to a factor number
dup second swap first [ -1 * ] when ;
LAZY: 'frac' ( -- parser )
'decimal-point' 'digit0-9' <+> &> [ sequence>frac ] <@ ;
-: raise-to-power ( { num exp } -- num )
+: raise-to-power ( pair -- num )
+ #! Pair is { num exp }.
#! Multiply 'num' by 10^exp
dup second dup [ 10 swap first ^ swap first * ] [ drop first ] if ;
TUPLE: camera-slate ;
-C: camera-slate ( -- ) <slate> over set-delegate ;
+C: camera-slate ( -- slate ) <slate> over set-delegate ;
VAR: camera
: lcm ( a b -- c )
#! Smallest integer such that c/a and c/b are both integers.
- 2dup gcd nip >r * r> /i ; foldable
+ [ * ] 2keep gcd nip /i ; foldable
: mod-inv ( x n -- y )
#! Compute the multiplicative inverse of x mod n.
: powers ( n x -- seq )
#! Output sequence has n elements, { 1 x x^2 x^3 ... }
- <array> 1 [ * ] accumulate ;
+ <array> 1 [ * ] accumulate nip ;
: ** ( u v -- u*v' ) conjugate * ; inline
dup rot "<" swap append swap start dup 0 >= [ ! seq index
">" -rot start* dup 0 >= [ 1 + ] [ drop f ] if
] [
- drop f
+ 2drop f
] if ;
: find-end-tag ( tag seq -- n )
VAR: slate
-: action> ( -- ) slate> slate-action ;
+: action> ( -- quot ) slate> slate-action ;
: >action ( quot -- ) slate> set-slate-action ;
C: splay-tree ;
-: rotate-right
+: rotate-right ( node -- node )
dup splay-node-l
[ splay-node-r swap set-splay-node-l ] 2keep
[ set-splay-node-r ] keep ;
-: rotate-left
+: rotate-left ( node -- node )
dup splay-node-r
[ splay-node-l swap set-splay-node-r ] 2keep
[ set-splay-node-l ] keep ;
swap >r rot [ set-splay-node-r ] 2keep
drop dup splay-node-r swapd r> swap ;
-: cmp 2dup splay-node-k <=> ;
+: cmp ( key node -- obj node -1/0/1 )
+ 2dup splay-node-k <=> ;
-: lcmp 2dup splay-node-l splay-node-k <=> ;
+: lcmp ( key node -- obj node -1/0/1 )
+ 2dup splay-node-l splay-node-k <=> ;
-: rcmp 2dup splay-node-r splay-node-k <=> ;
+: rcmp ( key node -- obj node -1/0/1 )
+ 2dup splay-node-r splay-node-k <=> ;
DEFER: (splay)
-: splay-left
+: splay-left ( left right key node -- left right key node )
dup splay-node-l [
lcmp 0 < [ rotate-right ] when
dup splay-node-l [ link-right (splay) ] when
] when ;
-: splay-right
+: splay-right ( left right key node -- left right key node )
dup splay-node-r [
rcmp 0 > [ rotate-left ] when
dup splay-node-r [ link-left (splay) ] when
: remove-one ( obj seq -- seq )
[ index ] keep over -1 = [
- 2drop
+ drop
] [
[ 0 -rot <slice> ] 2keep
>r 1+ r> [ length ] keep <slice> append
: reduce-units ( dimensioned -- )
dup dimensions symbolic-reduce pick set-dimensioned-bot swap set-dimensioned-top ;
-: 2reduce-units ( d d -- )
+: 2reduce-units ( d d -- d d )
>r dup reduce-units r> dup reduce-units ;
-: 2value ( d d -- )
+: 2value ( d d -- n n )
[ dimensioned-value ] 2apply ;
: =units?
>r dimensions 2array r> dimensions 2array = ;
-: d+ ( d d -- )
+: d+ ( d d -- d )
2dup =units? [
"d+: dimensions must be the same" throw
] unless
dup dimensions
>r >r 2value + r> r> <dimensioned> ;
-: d- ( d d -- )
+: d- ( d d -- d )
2dup =units? [
"d-: dimensions must be the same" throw
] unless
: (d*)
>r add-dimensions r> over set-dimensioned-value dup reduce-units ;
-: d* ( d d -- )
+: d* ( d d -- d )
2dup 2value * (d*) ;
: swap-dimensions ( d -- d )
dup dimensions rot [ set-dimensioned-top ] keep [ set-dimensioned-bot ] keep ;
-: d/ ( d d -- )
+: d/ ( d d -- d )
swap-dimensions 2dup 2value / (d*) ;
: d-inv ( d -- d )
: define-var ( str -- )
dup define-var-symbol dup define-var-getter define-var-setter ;
-: VAR: ( variable -- ) scan define-var ; parsing
+: VAR: ! var
+ scan define-var ; parsing
: define-vars ( seq -- ) [ define-var ] each ;
{ $list
"Improved memory management code leads to reduced memory consumption, less frequent garbage collections and fixes a few corner cases where Factor could run out of heap even if a GC would have freed enough memory to proceed"
"Improved prettyprinter low lays out code in a more pleasing manner"
+ "Windows native I/O has been sped up (Doug Coleman)"
}
}
{ $subtopic "UI"
TUPLE: alien-invoke library function return parameters ;
-GENERIC: alien-invoke-abi
+GENERIC: alien-invoke-abi ( node -- string )
M: alien-invoke alien-invoke-abi
alien-invoke-library library-abi ;
: namestack-effect ( seq -- )
#! If the namestack is unbalanced, we don't throw an error
- meta-n active-variable
+ [ meta-n swap hash ] map
dup [ length ] map all-equal? [
<unbalanced-namestacks> inference-error
] unless
drop
"Quotation pops name stack elements which it did not push" ;
+M: unbalanced-namestacks error.
+ "Unbalanced name stack usage." print
+ "Make sure occurrences of >n/n> are consistent across branches." print ;
+
M: no-effect error.
"The word " write
no-effect-word pprint
[ V{ } ] [ [ >n x set ndrop ] infer drop inferred-vars-writes ] unit-test
[ [ >n ] [ ] if ] unit-test-fails
+
+[ V{ 2 3 } ] [ [ [ [ 2 get 3 throw ] [ 3 get ] if ] with-scope ] infer drop inferred-vars-reads ] unit-test
"set-word-prop" [ ] <word-search> "search" set
"search" get graft*
+1000 sleep
+
[ f ]
[ "search" get live-search-list control-value empty? ]
unit-test