Merge branch 'master' of git://factorcode.org/git/factor into regexp
Conflicts: basis/regexp/regexp.factordb4
commit
e908ef3242
basis
bit-arrays
bootstrap/image
compiler/tree/propagation
concurrency/mailboxes
deques
editors
editpadlite
editpadpro
editplus
emacs/windows
emeditor
etexteditor
gvim/windows
notepadpp
scite
ted-notepad
textpad
ultraedit
wordpad
environment/winnt
formatting
heaps
hints
http
io
directories
unix
windows
files/info/windows
monitors
pools
streams/byte-array
thread
math
persistent
deques
heaps
quoted-printable
random
stack-checker
threads
tools/walker
ui
unicode
breaks
case
unix
core
checksums/crc32
classes/algebra
effects/parser
io
math
slots
sorting
system
extra
adsoda
bubble-chamber
graph-theory
iokit
irc/ui
math/text/utils
multi-methods
otug-talk
project-euler
002
012
014
019
071
100
148
common
misc/fuel
|
@ -78,7 +78,7 @@ M: bit-array byte-length length 7 + -3 shift ;
|
||||||
[ dup 0 = ] [
|
[ dup 0 = ] [
|
||||||
[ pick underlying>> pick set-alien-unsigned-1 ] keep
|
[ pick underlying>> pick set-alien-unsigned-1 ] keep
|
||||||
[ 1+ ] [ -8 shift ] bi*
|
[ 1+ ] [ -8 shift ] bi*
|
||||||
] [ ] until 2drop
|
] until 2drop
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: bit-array>integer ( bit-array -- n )
|
: bit-array>integer ( bit-array -- n )
|
||||||
|
|
|
@ -240,7 +240,7 @@ GENERIC: ' ( obj -- ptr )
|
||||||
#! n is positive or zero.
|
#! n is positive or zero.
|
||||||
[ dup 0 > ]
|
[ dup 0 > ]
|
||||||
[ [ bignum-bits neg shift ] [ bignum-radix bitand ] bi ]
|
[ [ bignum-bits neg shift ] [ bignum-radix bitand ] bi ]
|
||||||
[ ] produce nip ;
|
produce nip ;
|
||||||
|
|
||||||
: emit-bignum ( n -- )
|
: emit-bignum ( n -- )
|
||||||
dup dup 0 < [ neg ] when bignum>seq
|
dup dup 0 < [ neg ] when bignum>seq
|
||||||
|
|
|
@ -441,7 +441,7 @@ TUPLE: mixed-mutable-immutable { x integer } { y sequence read-only } ;
|
||||||
|
|
||||||
[ V{ real } ] [ [ recursive-test-3 ] final-classes ] unit-test
|
[ V{ real } ] [ [ recursive-test-3 ] final-classes ] unit-test
|
||||||
|
|
||||||
[ V{ real } ] [ [ [ dup 10 < ] [ ] [ ] while ] final-classes ] unit-test
|
[ V{ real } ] [ [ [ dup 10 < ] [ ] while ] final-classes ] unit-test
|
||||||
|
|
||||||
[ V{ float } ] [
|
[ V{ float } ] [
|
||||||
[ { float } declare 10 [ 2.3 * ] times ] final-classes
|
[ { float } declare 10 [ 2.3 * ] times ] final-classes
|
||||||
|
|
|
@ -51,13 +51,13 @@ M: mailbox dispose* threads>> notify-all ;
|
||||||
block-if-empty
|
block-if-empty
|
||||||
[ dup mailbox-empty? ]
|
[ dup mailbox-empty? ]
|
||||||
[ dup data>> pop-back ]
|
[ dup data>> pop-back ]
|
||||||
[ ] produce nip ;
|
produce nip ;
|
||||||
|
|
||||||
: mailbox-get-all ( mailbox -- array )
|
: mailbox-get-all ( mailbox -- array )
|
||||||
f mailbox-get-all-timeout ;
|
f mailbox-get-all-timeout ;
|
||||||
|
|
||||||
: while-mailbox-empty ( mailbox quot -- )
|
: while-mailbox-empty ( mailbox quot -- )
|
||||||
[ '[ _ mailbox-empty? ] ] dip [ ] while ; inline
|
[ '[ _ mailbox-empty? ] ] dip while ; inline
|
||||||
|
|
||||||
: mailbox-get-timeout? ( mailbox timeout pred -- obj )
|
: mailbox-get-timeout? ( mailbox timeout pred -- obj )
|
||||||
[ block-unless-pred ]
|
[ block-unless-pred ]
|
||||||
|
|
|
@ -36,6 +36,6 @@ GENERIC: deque-empty? ( deque -- ? )
|
||||||
: slurp-deque ( deque quot -- )
|
: slurp-deque ( deque quot -- )
|
||||||
[ drop '[ _ deque-empty? not ] ]
|
[ drop '[ _ deque-empty? not ] ]
|
||||||
[ '[ _ pop-back @ ] ]
|
[ '[ _ pop-back @ ] ]
|
||||||
2bi [ ] while ; inline
|
2bi while ; inline
|
||||||
|
|
||||||
MIXIN: deque
|
MIXIN: deque
|
||||||
|
|
|
@ -5,7 +5,7 @@ IN: editors.editpadlite
|
||||||
|
|
||||||
: editpadlite-path ( -- path )
|
: editpadlite-path ( -- path )
|
||||||
\ editpadlite-path get-global [
|
\ editpadlite-path get-global [
|
||||||
"JGsoft" t [ >lower "editpadlite.exe" tail? ] find-in-program-files
|
"JGsoft" [ >lower "editpadlite.exe" tail? ] find-in-program-files
|
||||||
[ "editpadlite.exe" ] unless*
|
[ "editpadlite.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ IN: editors.editpadpro
|
||||||
|
|
||||||
: editpadpro-path ( -- path )
|
: editpadpro-path ( -- path )
|
||||||
\ editpadpro-path get-global [
|
\ editpadpro-path get-global [
|
||||||
"JGsoft" t [ >lower "editpadpro.exe" tail? ] find-in-program-files
|
"JGsoft" [ >lower "editpadpro.exe" tail? ] find-in-program-files
|
||||||
[ "editpadpro.exe" ] unless*
|
[ "editpadpro.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ IN: editors.editplus
|
||||||
|
|
||||||
: editplus-path ( -- path )
|
: editplus-path ( -- path )
|
||||||
\ editplus-path get-global [
|
\ editplus-path get-global [
|
||||||
"EditPlus 2" t [ "editplus.exe" tail? ] find-in-program-files
|
"EditPlus 2" [ "editplus.exe" tail? ] find-in-program-files
|
||||||
[ "editplus.exe" ] unless*
|
[ "editplus.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ IN: editors.emacs.windows
|
||||||
|
|
||||||
M: windows default-emacsclient
|
M: windows default-emacsclient
|
||||||
{
|
{
|
||||||
[ "Emacs" t [ "emacsclientw.exe" tail? ] find-in-program-files ]
|
[ "Emacs" [ "emacsclientw.exe" tail? ] find-in-program-files ]
|
||||||
[ "Emacs" t [ "emacsclient.exe" tail? ] find-in-program-files ]
|
[ "Emacs" [ "emacsclient.exe" tail? ] find-in-program-files ]
|
||||||
[ "emacsclient.exe" ]
|
[ "emacsclient.exe" ]
|
||||||
} 0|| ;
|
} 0|| ;
|
||||||
|
|
|
@ -5,7 +5,7 @@ IN: editors.emeditor
|
||||||
|
|
||||||
: emeditor-path ( -- path )
|
: emeditor-path ( -- path )
|
||||||
\ emeditor-path get-global [
|
\ emeditor-path get-global [
|
||||||
"EmEditor" t [ "EmEditor.exe" tail? ] find-in-program-files
|
"EmEditor" [ "EmEditor.exe" tail? ] find-in-program-files
|
||||||
[ "EmEditor.exe" ] unless*
|
[ "EmEditor.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ IN: editors.etexteditor
|
||||||
|
|
||||||
: etexteditor-path ( -- str )
|
: etexteditor-path ( -- str )
|
||||||
\ etexteditor-path get-global [
|
\ etexteditor-path get-global [
|
||||||
"e" t [ "e.exe" tail? ] find-in-program-files
|
"e" [ "e.exe" tail? ] find-in-program-files
|
||||||
[ "e" ] unless*
|
[ "e" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,6 @@ IN: editors.gvim.windows
|
||||||
|
|
||||||
M: windows gvim-path
|
M: windows gvim-path
|
||||||
\ gvim-path get-global [
|
\ gvim-path get-global [
|
||||||
"vim" t [ "gvim.exe" tail? ] find-in-program-files
|
"vim" [ "gvim.exe" tail? ] find-in-program-files
|
||||||
[ "gvim.exe" ] unless*
|
[ "gvim.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
|
@ -4,7 +4,7 @@ IN: editors.notepadpp
|
||||||
|
|
||||||
: notepadpp-path ( -- path )
|
: notepadpp-path ( -- path )
|
||||||
\ notepadpp-path get-global [
|
\ notepadpp-path get-global [
|
||||||
"notepad++" t [ "notepad++.exe" tail? ] find-in-program-files
|
"notepad++" [ "notepad++.exe" tail? ] find-in-program-files
|
||||||
[ "notepad++.exe" ] unless*
|
[ "notepad++.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,11 @@ IN: editors.scite
|
||||||
|
|
||||||
: scite-path ( -- path )
|
: scite-path ( -- path )
|
||||||
\ scite-path get-global [
|
\ scite-path get-global [
|
||||||
"Scintilla Text Editor" t
|
"Scintilla Text Editor"
|
||||||
[ >lower "scite.exe" tail? ] find-in-program-files
|
[ >lower "scite.exe" tail? ] find-in-program-files
|
||||||
|
|
||||||
[
|
[
|
||||||
"SciTE Source Code Editor" t
|
"SciTE Source Code Editor"
|
||||||
[ >lower "scite.exe" tail? ] find-in-program-files
|
[ >lower "scite.exe" tail? ] find-in-program-files
|
||||||
] unless*
|
] unless*
|
||||||
[ "scite.exe" ] unless*
|
[ "scite.exe" ] unless*
|
||||||
|
|
|
@ -4,7 +4,7 @@ IN: editors.ted-notepad
|
||||||
|
|
||||||
: ted-notepad-path ( -- path )
|
: ted-notepad-path ( -- path )
|
||||||
\ ted-notepad-path get-global [
|
\ ted-notepad-path get-global [
|
||||||
"TED Notepad" t [ "TedNPad.exe" tail? ] find-in-program-files
|
"TED Notepad" [ "TedNPad.exe" tail? ] find-in-program-files
|
||||||
[ "TedNPad.exe" ] unless*
|
[ "TedNPad.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ IN: editors.textpad
|
||||||
|
|
||||||
: textpad-path ( -- path )
|
: textpad-path ( -- path )
|
||||||
\ textpad-path get-global [
|
\ textpad-path get-global [
|
||||||
"TextPad 5" t [ "TextPad.exe" tail? ] find-in-program-files
|
"TextPad 5" [ "TextPad.exe" tail? ] find-in-program-files
|
||||||
[ "TextPad.exe" ] unless*
|
[ "TextPad.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ IN: editors.ultraedit
|
||||||
|
|
||||||
: ultraedit-path ( -- path )
|
: ultraedit-path ( -- path )
|
||||||
\ ultraedit-path get-global [
|
\ ultraedit-path get-global [
|
||||||
"IDM Computer Solutions" t [ "uedit32.exe" tail? ] find-in-program-files
|
"IDM Computer Solutions" [ "uedit32.exe" tail? ] find-in-program-files
|
||||||
[ "uedit32.exe" ] unless*
|
[ "uedit32.exe" ] unless*
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ IN: editors.wordpad
|
||||||
|
|
||||||
: wordpad-path ( -- path )
|
: wordpad-path ( -- path )
|
||||||
\ wordpad-path get [
|
\ wordpad-path get [
|
||||||
"Windows NT\\Accessories" t
|
"Windows NT\\Accessories"
|
||||||
[ "wordpad.exe" tail? ] find-in-program-files
|
[ "wordpad.exe" tail? ] find-in-program-files
|
||||||
] unless* ;
|
] unless* ;
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ M: winnt (os-envs) ( -- seq )
|
||||||
GetEnvironmentStrings [
|
GetEnvironmentStrings [
|
||||||
<memory-stream> [
|
<memory-stream> [
|
||||||
utf16n decode-input
|
utf16n decode-input
|
||||||
[ "\0" read-until drop dup empty? not ]
|
[ "\0" read-until drop dup empty? not ] [ ] produce nip
|
||||||
[ ] [ drop ] produce
|
|
||||||
] with-input-stream*
|
] with-input-stream*
|
||||||
] [ FreeEnvironmentStrings win32-error=0/f ] bi ;
|
] [ FreeEnvironmentStrings win32-error=0/f ] bi ;
|
||||||
|
|
|
@ -41,7 +41,7 @@ IN: formatting
|
||||||
[ dup 10.0 >=
|
[ dup 10.0 >=
|
||||||
[ 10.0 / [ 1+ ] dip ]
|
[ 10.0 / [ 1+ ] dip ]
|
||||||
[ 10.0 * [ 1- ] dip ] if
|
[ 10.0 * [ 1- ] dip ] if
|
||||||
] [ ] while
|
] while
|
||||||
] keep 0 < [ neg ] when ;
|
] keep 0 < [ neg ] when ;
|
||||||
|
|
||||||
: exp>string ( exp base digits -- string )
|
: exp>string ( exp base digits -- string )
|
||||||
|
|
|
@ -190,7 +190,7 @@ M: heap heap-pop ( heap -- value key )
|
||||||
: heap-pop-all ( heap -- alist )
|
: heap-pop-all ( heap -- alist )
|
||||||
[ dup heap-empty? not ]
|
[ dup heap-empty? not ]
|
||||||
[ dup heap-pop swap 2array ]
|
[ dup heap-pop swap 2array ]
|
||||||
[ ] produce nip ;
|
produce nip ;
|
||||||
|
|
||||||
: slurp-heap ( heap quot: ( elt -- ) -- )
|
: slurp-heap ( heap quot: ( elt -- ) -- )
|
||||||
over heap-empty? [ 2drop ] [
|
over heap-empty? [ 2drop ] [
|
||||||
|
|
|
@ -96,8 +96,6 @@ M: object specializer-declaration class ;
|
||||||
{ string string }
|
{ string string }
|
||||||
"specializer" set-word-prop
|
"specializer" set-word-prop
|
||||||
|
|
||||||
\ find-last-sep { string sbuf } "specializer" set-word-prop
|
|
||||||
|
|
||||||
\ >string { sbuf } "specializer" set-word-prop
|
\ >string { sbuf } "specializer" set-word-prop
|
||||||
|
|
||||||
\ >array { { vector } } "specializer" set-word-prop
|
\ >array { { vector } } "specializer" set-word-prop
|
||||||
|
|
|
@ -12,7 +12,7 @@ base64 ;
|
||||||
IN: http
|
IN: http
|
||||||
|
|
||||||
: (read-header) ( -- alist )
|
: (read-header) ( -- alist )
|
||||||
[ read-crlf dup f like ] [ parse-header-line ] [ drop ] produce ;
|
[ read-crlf dup f like ] [ parse-header-line ] produce nip ;
|
||||||
|
|
||||||
: collect-headers ( assoc -- assoc' )
|
: collect-headers ( assoc -- assoc' )
|
||||||
H{ } clone [ '[ _ push-at ] assoc-each ] keep ;
|
H{ } clone [ '[ _ push-at ] assoc-each ] keep ;
|
||||||
|
|
|
@ -38,7 +38,7 @@ HELP: find-in-directories
|
||||||
|
|
||||||
HELP: find-all-files
|
HELP: find-all-files
|
||||||
{ $values
|
{ $values
|
||||||
{ "path" "a pathname string" } { "bfs?" "a boolean, breadth-first or depth-first" } { "quot" quotation }
|
{ "path" "a pathname string" } { "quot" quotation }
|
||||||
{ "paths/f" "a sequence of pathname strings or f" }
|
{ "paths/f" "a sequence of pathname strings or f" }
|
||||||
}
|
}
|
||||||
{ $description "Finds all files in the input directory matching the predicate quotation in a breadth-first or depth-first traversal." } ;
|
{ $description "Finds all files in the input directory matching the predicate quotation in a breadth-first or depth-first traversal." } ;
|
||||||
|
|
|
@ -5,6 +5,6 @@ IN: io.directories.search.tests
|
||||||
[ t ] [
|
[ t ] [
|
||||||
[
|
[
|
||||||
10 [ "io.paths.test" "gogogo" make-unique-file ] replicate
|
10 [ "io.paths.test" "gogogo" make-unique-file ] replicate
|
||||||
current-temporary-directory get t [ ] find-all-files
|
current-temporary-directory get [ ] find-all-files
|
||||||
] with-unique-directory drop [ natural-sort ] bi@ =
|
] with-unique-directory drop [ natural-sort ] bi@ =
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
|
@ -51,7 +51,8 @@ PRIVATE>
|
||||||
[ keep and ] curry iterate-directory
|
[ keep and ] curry iterate-directory
|
||||||
] [ drop f ] recover ; inline
|
] [ drop f ] recover ; inline
|
||||||
|
|
||||||
: find-all-files ( path bfs? quot: ( obj -- ? ) -- paths/f )
|
: find-all-files ( path quot: ( obj -- ? ) -- paths/f )
|
||||||
|
f swap
|
||||||
'[
|
'[
|
||||||
_ _ _ [ <directory-iterator> ] dip
|
_ _ _ [ <directory-iterator> ] dip
|
||||||
pusher [ [ f ] compose iterate-directory drop ] dip
|
pusher [ [ f ] compose iterate-directory drop ] dip
|
||||||
|
|
|
@ -7,7 +7,7 @@ IN: io.directories.search.windows
|
||||||
: program-files-directories ( -- array )
|
: program-files-directories ( -- array )
|
||||||
program-files program-files-x86 2array harvest ; inline
|
program-files program-files-x86 2array harvest ; inline
|
||||||
|
|
||||||
: find-in-program-files ( base-directory bfs? quot -- path )
|
: find-in-program-files ( base-directory quot -- path )
|
||||||
[
|
t swap [
|
||||||
[ program-files-directories ] dip '[ _ append-path ] map
|
[ program-files-directories ] dip '[ _ append-path ] map
|
||||||
] 2dip find-in-directories ; inline
|
] 2dip find-in-directories ; inline
|
||||||
|
|
|
@ -61,5 +61,5 @@ M: unix (directory-entries) ( path -- seq )
|
||||||
[
|
[
|
||||||
'[ _ find-next-file dup ]
|
'[ _ find-next-file dup ]
|
||||||
[ >directory-entry ]
|
[ >directory-entry ]
|
||||||
[ drop ] produce
|
produce nip
|
||||||
] with-unix-directory ;
|
] with-unix-directory ;
|
||||||
|
|
|
@ -61,7 +61,7 @@ M: windows (directory-entries) ( path -- seq )
|
||||||
'[
|
'[
|
||||||
[ _ find-next-file dup ]
|
[ _ find-next-file dup ]
|
||||||
[ >directory-entry ]
|
[ >directory-entry ]
|
||||||
[ drop ] produce
|
produce nip
|
||||||
over name>> "." = [ nip ] [ swap prefix ] if
|
over name>> "." = [ nip ] [ swap prefix ] if
|
||||||
]
|
]
|
||||||
] [ '[ _ FindClose win32-error=0/f ] ] bi [ ] cleanup ;
|
] [ '[ _ FindClose win32-error=0/f ] ] bi [ ] cleanup ;
|
||||||
|
|
|
@ -159,9 +159,7 @@ M: winnt file-system-info ( path -- file-system-info )
|
||||||
find-first-volume
|
find-first-volume
|
||||||
[
|
[
|
||||||
'[
|
'[
|
||||||
[ _ find-next-volume dup ]
|
[ _ find-next-volume dup ] [ ] produce nip
|
||||||
[ ]
|
|
||||||
[ drop ] produce
|
|
||||||
swap prefix
|
swap prefix
|
||||||
]
|
]
|
||||||
] [ '[ _ FindVolumeClose win32-error=0/f ] ] bi [ ] cleanup ;
|
] [ '[ _ FindVolumeClose win32-error=0/f ] ] bi [ ] cleanup ;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
USING: io io.mmap io.mmap.char io.files io.files.temp
|
USING: io io.mmap io.mmap.char io.files io.files.temp
|
||||||
io.directories kernel tools.test continuations sequences
|
io.directories kernel tools.test continuations sequences
|
||||||
io.encodings.ascii accessors ;
|
io.encodings.ascii accessors math ;
|
||||||
IN: io.mmap.tests
|
IN: io.mmap.tests
|
||||||
|
|
||||||
[ "mmap-test-file.txt" temp-file delete-file ] ignore-errors
|
[ "mmap-test-file.txt" temp-file delete-file ] ignore-errors
|
||||||
|
@ -9,3 +9,13 @@ IN: io.mmap.tests
|
||||||
[ 5 ] [ "mmap-test-file.txt" temp-file [ length ] with-mapped-char-file ] unit-test
|
[ 5 ] [ "mmap-test-file.txt" temp-file [ length ] with-mapped-char-file ] unit-test
|
||||||
[ "22345" ] [ "mmap-test-file.txt" temp-file ascii file-contents ] unit-test
|
[ "22345" ] [ "mmap-test-file.txt" temp-file ascii file-contents ] unit-test
|
||||||
[ "mmap-test-file.txt" temp-file delete-file ] ignore-errors
|
[ "mmap-test-file.txt" temp-file delete-file ] ignore-errors
|
||||||
|
|
||||||
|
|
||||||
|
[ "mmap-empty-file.txt" temp-file delete-file ] ignore-errors
|
||||||
|
[ ] [ "mmap-empty-file.txt" temp-file touch-file ] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
"mmap-empty-file.txt" temp-file [
|
||||||
|
drop
|
||||||
|
] with-mapped-file
|
||||||
|
] [ bad-mmap-size? ] must-fail-with
|
||||||
|
|
|
@ -2,15 +2,20 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: continuations destructors io.files io.files.info
|
USING: continuations destructors io.files io.files.info
|
||||||
io.backend kernel quotations system alien alien.accessors
|
io.backend kernel quotations system alien alien.accessors
|
||||||
accessors system vocabs.loader combinators alien.c-types ;
|
accessors system vocabs.loader combinators alien.c-types
|
||||||
|
math ;
|
||||||
IN: io.mmap
|
IN: io.mmap
|
||||||
|
|
||||||
TUPLE: mapped-file address handle length disposed ;
|
TUPLE: mapped-file address handle length disposed ;
|
||||||
|
|
||||||
HOOK: (mapped-file) os ( path length -- address handle )
|
HOOK: (mapped-file) os ( path length -- address handle )
|
||||||
|
|
||||||
|
ERROR: bad-mmap-size path size ;
|
||||||
|
|
||||||
: <mapped-file> ( path -- mmap )
|
: <mapped-file> ( path -- mmap )
|
||||||
[ normalize-path ] [ file-info size>> ] bi [ (mapped-file) ] keep
|
[ normalize-path ] [ file-info size>> ] bi
|
||||||
|
dup 0 <= [ bad-mmap-size ] when
|
||||||
|
[ (mapped-file) ] keep
|
||||||
f mapped-file boa ;
|
f mapped-file boa ;
|
||||||
|
|
||||||
HOOK: close-mapped-file io-backend ( mmap -- )
|
HOOK: close-mapped-file io-backend ( mmap -- )
|
||||||
|
|
|
@ -9,7 +9,7 @@ IN: io.mmap.unix
|
||||||
:: mmap-open ( path length prot flags -- alien fd )
|
:: mmap-open ( path length prot flags -- alien fd )
|
||||||
[
|
[
|
||||||
f length prot flags
|
f length prot flags
|
||||||
path open-r/w |dispose
|
path open-r/w [ <fd> |dispose drop ] keep
|
||||||
[ 0 mmap dup MAP_FAILED = [ (io-error) ] when ] keep
|
[ 0 mmap dup MAP_FAILED = [ (io-error) ] when ] keep
|
||||||
] with-destructors ;
|
] with-destructors ;
|
||||||
|
|
||||||
|
|
|
@ -101,13 +101,13 @@ os { winnt linux macosx } member? [
|
||||||
! Non-recursive
|
! Non-recursive
|
||||||
[ ] [ "monitor-timeout-test" temp-file f <monitor> "m" set ] unit-test
|
[ ] [ "monitor-timeout-test" temp-file f <monitor> "m" set ] unit-test
|
||||||
[ ] [ 3 seconds "m" get set-timeout ] unit-test
|
[ ] [ 3 seconds "m" get set-timeout ] unit-test
|
||||||
[ [ t ] [ "m" get next-change drop ] [ ] while ] must-fail
|
[ [ t ] [ "m" get next-change drop ] while ] must-fail
|
||||||
[ ] [ "m" get dispose ] unit-test
|
[ ] [ "m" get dispose ] unit-test
|
||||||
|
|
||||||
! Recursive
|
! Recursive
|
||||||
[ ] [ "monitor-timeout-test" temp-file t <monitor> "m" set ] unit-test
|
[ ] [ "monitor-timeout-test" temp-file t <monitor> "m" set ] unit-test
|
||||||
[ ] [ 3 seconds "m" get set-timeout ] unit-test
|
[ ] [ 3 seconds "m" get set-timeout ] unit-test
|
||||||
[ [ t ] [ "m" get next-change drop ] [ ] while ] must-fail
|
[ [ t ] [ "m" get next-change drop ] while ] must-fail
|
||||||
[ ] [ "m" get dispose ] unit-test
|
[ ] [ "m" get dispose ] unit-test
|
||||||
] with-monitors
|
] with-monitors
|
||||||
] when
|
] when
|
||||||
|
|
|
@ -35,7 +35,7 @@ GENERIC: make-connection ( pool -- conn )
|
||||||
|
|
||||||
: acquire-connection ( pool -- conn )
|
: acquire-connection ( pool -- conn )
|
||||||
dup check-pool
|
dup check-pool
|
||||||
[ dup connections>> empty? ] [ dup new-connection ] [ ] while
|
[ dup connections>> empty? ] [ dup new-connection ] while
|
||||||
connections>> pop ;
|
connections>> pop ;
|
||||||
|
|
||||||
: (with-pooled-connection) ( conn pool quot -- )
|
: (with-pooled-connection) ( conn pool quot -- )
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
! Copyright (C) 2008, 2009 Daniel Ehrenberg
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: byte-arrays byte-vectors kernel io.encodings io.streams.string
|
USING: byte-arrays byte-vectors kernel io.encodings io.streams.string
|
||||||
sequences io namespaces io.encodings.private accessors ;
|
sequences io namespaces io.encodings.private accessors sequences.private
|
||||||
|
io.streams.sequence destructors ;
|
||||||
IN: io.streams.byte-array
|
IN: io.streams.byte-array
|
||||||
|
|
||||||
: <byte-writer> ( encoding -- stream )
|
: <byte-writer> ( encoding -- stream )
|
||||||
|
@ -9,8 +12,16 @@ IN: io.streams.byte-array
|
||||||
[ <byte-writer> ] dip [ output-stream get ] compose with-output-stream*
|
[ <byte-writer> ] dip [ output-stream get ] compose with-output-stream*
|
||||||
dup encoder? [ stream>> ] when >byte-array ; inline
|
dup encoder? [ stream>> ] when >byte-array ; inline
|
||||||
|
|
||||||
|
TUPLE: byte-reader { underlying byte-array read-only } { i array-capacity } ;
|
||||||
|
|
||||||
|
M: byte-reader stream-read-partial stream-read ;
|
||||||
|
M: byte-reader stream-read sequence-read ;
|
||||||
|
M: byte-reader stream-read1 sequence-read1 ;
|
||||||
|
M: byte-reader stream-read-until sequence-read-until ;
|
||||||
|
M: byte-reader dispose drop ;
|
||||||
|
|
||||||
: <byte-reader> ( byte-array encoding -- stream )
|
: <byte-reader> ( byte-array encoding -- stream )
|
||||||
[ >byte-vector dup reverse-here ] dip <decoder> ;
|
[ B{ } like 0 byte-reader boa ] dip <decoder> ;
|
||||||
|
|
||||||
: with-byte-reader ( byte-array encoding quot -- )
|
: with-byte-reader ( byte-array encoding quot -- )
|
||||||
[ <byte-reader> ] dip with-input-stream* ; inline
|
[ <byte-reader> ] dip with-input-stream* ; inline
|
||||||
|
|
|
@ -11,7 +11,7 @@ SYMBOL: io-thread-running?
|
||||||
sleep-time io-multiplex yield ;
|
sleep-time io-multiplex yield ;
|
||||||
|
|
||||||
: start-io-thread ( -- )
|
: start-io-thread ( -- )
|
||||||
[ [ io-thread-running? get-global ] [ io-thread ] [ ] while ]
|
[ [ io-thread-running? get-global ] [ io-thread ] while ]
|
||||||
"I/O wait" spawn drop ;
|
"I/O wait" spawn drop ;
|
||||||
|
|
||||||
[
|
[
|
||||||
|
|
|
@ -16,7 +16,7 @@ IN: math.combinatorics
|
||||||
! http://msdn2.microsoft.com/en-us/library/aa302371.aspx
|
! http://msdn2.microsoft.com/en-us/library/aa302371.aspx
|
||||||
|
|
||||||
: factoradic ( n -- factoradic )
|
: factoradic ( n -- factoradic )
|
||||||
0 [ over 0 > ] [ 1+ [ /mod ] keep swap ] [ ] produce reverse 2nip ;
|
0 [ over 0 > ] [ 1+ [ /mod ] keep swap ] produce reverse 2nip ;
|
||||||
|
|
||||||
: (>permutation) ( seq n -- seq )
|
: (>permutation) ( seq n -- seq )
|
||||||
[ '[ _ dupd >= [ 1+ ] when ] map ] keep prefix ;
|
[ '[ _ dupd >= [ 1+ ] when ] map ] keep prefix ;
|
||||||
|
|
|
@ -29,7 +29,7 @@ M: real sqrt
|
||||||
: factor-2s ( n -- r s )
|
: factor-2s ( n -- r s )
|
||||||
#! factor an integer into 2^r * s
|
#! factor an integer into 2^r * s
|
||||||
dup 0 = [ 1 ] [
|
dup 0 = [ 1 ] [
|
||||||
0 swap [ dup even? ] [ [ 1+ ] [ 2/ ] bi* ] [ ] while
|
0 swap [ dup even? ] [ [ 1+ ] [ 2/ ] bi* ] while
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
|
@ -7,7 +7,7 @@ IN: math.primes.factors
|
||||||
|
|
||||||
: count-factor ( n d -- n' c )
|
: count-factor ( n d -- n' c )
|
||||||
[ 1 ] 2dip [ /i ] keep
|
[ 1 ] 2dip [ /i ] keep
|
||||||
[ dupd /mod zero? ] curry [ nip [ 1+ ] dip ] [ drop ] while
|
[ dupd /mod zero? ] curry [ nip [ 1+ ] dip ] while drop
|
||||||
swap ;
|
swap ;
|
||||||
|
|
||||||
: write-factor ( n d -- n' d )
|
: write-factor ( n d -- n' d )
|
||||||
|
@ -18,7 +18,7 @@ PRIVATE>
|
||||||
: group-factors ( n -- seq )
|
: group-factors ( n -- seq )
|
||||||
[
|
[
|
||||||
2
|
2
|
||||||
[ 2dup sq < ] [ write-factor next-prime ] [ ] until
|
[ 2dup sq < ] [ write-factor next-prime ] until
|
||||||
drop dup 2 < [ drop ] [ 1 2array , ] if
|
drop dup 2 < [ drop ] [ 1 2array , ] if
|
||||||
] { } make ;
|
] { } make ;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ PRIVATE>
|
||||||
} cond ; foldable
|
} cond ; foldable
|
||||||
|
|
||||||
: next-prime ( n -- p )
|
: next-prime ( n -- p )
|
||||||
next-odd [ dup really-prime? ] [ 2 + ] [ ] until ; foldable
|
next-odd [ dup really-prime? ] [ 2 + ] until ; foldable
|
||||||
|
|
||||||
: primes-between ( low high -- seq )
|
: primes-between ( low high -- seq )
|
||||||
[ dup 3 max dup even? [ 1 + ] when ] dip
|
[ dup 3 max dup even? [ 1 + ] when ] dip
|
||||||
|
|
|
@ -67,4 +67,4 @@ PRIVATE>
|
||||||
<deque> [ push-back ] reduce ;
|
<deque> [ push-back ] reduce ;
|
||||||
|
|
||||||
: deque>sequence ( deque -- sequence )
|
: deque>sequence ( deque -- sequence )
|
||||||
[ dup deque-empty? not ] [ pop-front swap ] [ ] produce nip ;
|
[ dup deque-empty? not ] [ pop-front swap ] produce nip ;
|
||||||
|
|
|
@ -98,6 +98,6 @@ M: branch pheap-push
|
||||||
<persistent-heap> swap [ rot pheap-push ] assoc-each ;
|
<persistent-heap> swap [ rot pheap-push ] assoc-each ;
|
||||||
|
|
||||||
: pheap>alist ( heap -- alist )
|
: pheap>alist ( heap -- alist )
|
||||||
[ dup pheap-empty? not ] [ pheap-pop 2array ] [ ] produce nip ;
|
[ dup pheap-empty? not ] [ pheap-pop 2array ] produce nip ;
|
||||||
|
|
||||||
: pheap>values ( heap -- seq ) pheap>alist keys ;
|
: pheap>values ( heap -- seq ) pheap>alist keys ;
|
||||||
|
|
|
@ -32,7 +32,7 @@ IN: quoted-printable
|
||||||
[ 1- cut-slice swap ] [ f swap ] if* concat ;
|
[ 1- cut-slice swap ] [ f swap ] if* concat ;
|
||||||
|
|
||||||
: divide-lines ( strings -- strings )
|
: divide-lines ( strings -- strings )
|
||||||
[ dup ] [ take-some ] [ ] produce nip ;
|
[ dup ] [ take-some ] produce nip ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ PRIVATE>
|
||||||
] when ;
|
] when ;
|
||||||
|
|
||||||
: read-quoted ( -- bytes )
|
: read-quoted ( -- bytes )
|
||||||
[ read1 dup ] [ read-char ] [ drop ] B{ } produce-as ;
|
[ read1 dup ] [ read-char ] B{ } produce-as nip ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ PRIVATE>
|
||||||
: randomize ( seq -- seq )
|
: randomize ( seq -- seq )
|
||||||
dup length [ dup 1 > ]
|
dup length [ dup 1 > ]
|
||||||
[ [ random ] [ 1- ] bi [ pick exchange ] keep ]
|
[ [ random ] [ 1- ] bi [ pick exchange ] keep ]
|
||||||
[ ] while drop ;
|
while drop ;
|
||||||
|
|
||||||
: delete-random ( seq -- elt )
|
: delete-random ( seq -- elt )
|
||||||
[ length random-integer ] keep [ nth ] 2keep delete-nth ;
|
[ length random-integer ] keep [ nth ] 2keep delete-nth ;
|
||||||
|
|
|
@ -80,4 +80,4 @@ TUPLE: inconsistent-recursive-call-error word ;
|
||||||
TUPLE: unknown-primitive-error ;
|
TUPLE: unknown-primitive-error ;
|
||||||
|
|
||||||
: unknown-primitive-error ( -- * )
|
: unknown-primitive-error ( -- * )
|
||||||
\ unknown-primitive-error inference-error ;
|
\ unknown-primitive-error inference-warning ;
|
||||||
|
|
|
@ -141,9 +141,7 @@ M: object infer-call*
|
||||||
apply-word/effect ;
|
apply-word/effect ;
|
||||||
|
|
||||||
: infer-exit ( -- )
|
: infer-exit ( -- )
|
||||||
\ exit
|
\ exit (( n -- * )) apply-word/effect ;
|
||||||
{ integer } { } t >>terminated? <effect>
|
|
||||||
apply-word/effect ;
|
|
||||||
|
|
||||||
: infer-load-locals ( -- )
|
: infer-load-locals ( -- )
|
||||||
pop-literal nip
|
pop-literal nip
|
||||||
|
@ -189,7 +187,7 @@ M: object infer-call*
|
||||||
{ \ load-locals [ infer-load-locals ] }
|
{ \ load-locals [ infer-load-locals ] }
|
||||||
{ \ get-local [ infer-get-local ] }
|
{ \ get-local [ infer-get-local ] }
|
||||||
{ \ drop-locals [ infer-drop-locals ] }
|
{ \ drop-locals [ infer-drop-locals ] }
|
||||||
{ \ do-primitive [ unknown-primitive-error inference-warning ] }
|
{ \ do-primitive [ unknown-primitive-error ] }
|
||||||
{ \ alien-invoke [ infer-alien-invoke ] }
|
{ \ alien-invoke [ infer-alien-invoke ] }
|
||||||
{ \ alien-indirect [ infer-alien-indirect ] }
|
{ \ alien-indirect [ infer-alien-indirect ] }
|
||||||
{ \ alien-callback [ infer-alien-callback ] }
|
{ \ alien-callback [ infer-alien-callback ] }
|
||||||
|
@ -207,7 +205,7 @@ M: object infer-call*
|
||||||
{
|
{
|
||||||
declare call (call) slip 2slip 3slip dip 2dip 3dip
|
declare call (call) slip 2slip 3slip dip 2dip 3dip
|
||||||
curry compose execute (execute) if dispatch <tuple-boa>
|
curry compose execute (execute) if dispatch <tuple-boa>
|
||||||
(throw) load-local load-locals get-local drop-locals do-primitive
|
(throw) exit load-local load-locals get-local drop-locals do-primitive
|
||||||
alien-invoke alien-indirect alien-callback
|
alien-invoke alien-indirect alien-callback
|
||||||
} [ t "special" set-word-prop ] each
|
} [ t "special" set-word-prop ] each
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,8 @@ quotations effects tools.test continuations generic.standard
|
||||||
sorting assocs definitions prettyprint io inspector
|
sorting assocs definitions prettyprint io inspector
|
||||||
classes.tuple classes.union classes.predicate debugger
|
classes.tuple classes.union classes.predicate debugger
|
||||||
threads.private io.streams.string io.timeouts io.thread
|
threads.private io.streams.string io.timeouts io.thread
|
||||||
sequences.private destructors combinators eval locals.backend ;
|
sequences.private destructors combinators eval locals.backend
|
||||||
|
system ;
|
||||||
IN: stack-checker.tests
|
IN: stack-checker.tests
|
||||||
|
|
||||||
\ infer. must-infer
|
\ infer. must-infer
|
||||||
|
@ -511,9 +512,9 @@ ERROR: custom-error ;
|
||||||
[ [ missing->r-check ] infer ] must-fail
|
[ [ missing->r-check ] infer ] must-fail
|
||||||
|
|
||||||
! Corner case
|
! Corner case
|
||||||
[ [ [ f dup ] [ dup ] [ ] produce ] infer ] must-fail
|
[ [ [ f dup ] [ dup ] produce ] infer ] must-fail
|
||||||
|
|
||||||
[ [ [ f dup ] [ ] [ ] while ] infer ] must-fail
|
[ [ [ f dup ] [ ] while ] infer ] must-fail
|
||||||
|
|
||||||
: erg's-inference-bug ( -- ) f dup [ erg's-inference-bug ] when ; inline
|
: erg's-inference-bug ( -- ) f dup [ erg's-inference-bug ] when ; inline
|
||||||
|
|
||||||
|
@ -581,4 +582,6 @@ DEFER: eee'
|
||||||
: debugging-curry-folding ( quot -- )
|
: debugging-curry-folding ( quot -- )
|
||||||
[ debugging-curry-folding ] curry call ; inline recursive
|
[ debugging-curry-folding ] curry call ; inline recursive
|
||||||
|
|
||||||
[ [ ] debugging-curry-folding ] must-infer
|
[ [ ] debugging-curry-folding ] must-infer
|
||||||
|
|
||||||
|
[ [ exit ] [ 1 2 3 ] if ] must-infer
|
|
@ -115,7 +115,7 @@ DEFER: stop
|
||||||
sleep-queue
|
sleep-queue
|
||||||
[ dup expire-sleep? ]
|
[ dup expire-sleep? ]
|
||||||
[ dup heap-pop drop expire-sleep ]
|
[ dup heap-pop drop expire-sleep ]
|
||||||
[ ] while
|
while
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
: start ( namestack thread -- * )
|
: start ( namestack thread -- * )
|
||||||
|
|
|
@ -205,7 +205,7 @@ SYMBOL: +stopped+
|
||||||
]
|
]
|
||||||
} case
|
} case
|
||||||
] handle-synchronous
|
] handle-synchronous
|
||||||
] [ ] while ;
|
] while ;
|
||||||
|
|
||||||
: step-back-msg ( continuation -- continuation' )
|
: step-back-msg ( continuation -- continuation' )
|
||||||
walker-history tget
|
walker-history tget
|
||||||
|
@ -233,7 +233,7 @@ SYMBOL: +stopped+
|
||||||
{ step-back [ step-back-msg ] }
|
{ step-back [ step-back-msg ] }
|
||||||
} case f
|
} case f
|
||||||
] handle-synchronous
|
] handle-synchronous
|
||||||
] [ ] while ;
|
] while ;
|
||||||
|
|
||||||
: walker-loop ( -- )
|
: walker-loop ( -- )
|
||||||
+running+ set-status
|
+running+ set-status
|
||||||
|
@ -256,7 +256,7 @@ SYMBOL: +stopped+
|
||||||
[ walker-suspended ]
|
[ walker-suspended ]
|
||||||
} case
|
} case
|
||||||
] handle-synchronous
|
] handle-synchronous
|
||||||
] [ ] until ;
|
] until ;
|
||||||
|
|
||||||
: associate-thread ( walker -- )
|
: associate-thread ( walker -- )
|
||||||
walker-thread tset
|
walker-thread tset
|
||||||
|
|
|
@ -13,6 +13,6 @@ IN: ui.event-loop
|
||||||
|
|
||||||
HOOK: do-events ui-backend ( -- )
|
HOOK: do-events ui-backend ( -- )
|
||||||
|
|
||||||
: event-loop ( -- ) [ event-loop? ] [ do-events ] [ ] while ;
|
: event-loop ( -- ) [ event-loop? ] [ do-events ] while ;
|
||||||
|
|
||||||
: ui-wait ( -- ) 10 milliseconds sleep ;
|
: ui-wait ( -- ) 10 milliseconds sleep ;
|
||||||
|
|
|
@ -22,7 +22,7 @@ tools.test kernel calendar parser accessors calendar io ;
|
||||||
! This should not throw an exception
|
! This should not throw an exception
|
||||||
[ ] [ "interactor" get evaluate-input ] unit-test
|
[ ] [ "interactor" get evaluate-input ] unit-test
|
||||||
|
|
||||||
[ ] [ [ "interactor" get interactor-busy? ] [ yield ] [ ] while ] unit-test
|
[ ] [ [ "interactor" get interactor-busy? ] [ yield ] while ] unit-test
|
||||||
|
|
||||||
[ ] [ "[ 1 2 3 ]" "interactor" get set-editor-string ] unit-test
|
[ ] [ "[ 1 2 3 ]" "interactor" get set-editor-string ] unit-test
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,7 @@ SYMBOL: ui-thread
|
||||||
: update-ui-loop ( -- )
|
: update-ui-loop ( -- )
|
||||||
[ ui-running? ui-thread get-global self eq? and ]
|
[ ui-running? ui-thread get-global self eq? and ]
|
||||||
[ ui-notify-flag get lower-flag update-ui ]
|
[ ui-notify-flag get lower-flag update-ui ]
|
||||||
[ ] while ;
|
while ;
|
||||||
|
|
||||||
: start-ui-thread ( -- )
|
: start-ui-thread ( -- )
|
||||||
[ self ui-thread set-global update-ui-loop ]
|
[ self ui-thread set-global update-ui-loop ]
|
||||||
|
|
|
@ -22,11 +22,7 @@ SINGLETON: windows-ui-backend
|
||||||
[ [ dup CHAR: \n = [ CHAR: \r , ] when , ] each ] "" make ;
|
[ [ dup CHAR: \n = [ CHAR: \r , ] when , ] each ] "" make ;
|
||||||
|
|
||||||
: enum-clipboard ( -- seq )
|
: enum-clipboard ( -- seq )
|
||||||
0
|
0 [ EnumClipboardFormats win32-error dup dup 0 > ] [ ] produce 2nip ;
|
||||||
[ EnumClipboardFormats win32-error dup dup 0 > ]
|
|
||||||
[ ]
|
|
||||||
[ drop ]
|
|
||||||
produce nip ;
|
|
||||||
|
|
||||||
: with-clipboard ( quot -- )
|
: with-clipboard ( quot -- )
|
||||||
f OpenClipboard win32-error=0/f
|
f OpenClipboard win32-error=0/f
|
||||||
|
|
|
@ -102,8 +102,7 @@ PRIVATE>
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: >pieces ( str quot: ( str -- i ) -- graphemes )
|
: >pieces ( str quot: ( str -- i ) -- graphemes )
|
||||||
[ dup empty? not ] swap '[ dup @ cut-slice swap ]
|
[ dup empty? not ] swap '[ dup @ cut-slice swap ] produce nip ; inline
|
||||||
[ ] produce nip ; inline
|
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ SYMBOL: locale ! Just casing locale, or overall?
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: split-subseq ( string sep -- strings )
|
: split-subseq ( string sep -- strings )
|
||||||
[ dup ] swap '[ _ split1-slice swap ] [ ] produce nip ;
|
[ dup ] swap '[ _ split1-slice swap ] produce nip ;
|
||||||
|
|
||||||
: replace ( old new str -- newstr )
|
: replace ( old new str -- newstr )
|
||||||
[ split-subseq ] dip join ; inline
|
[ split-subseq ] dip join ; inline
|
||||||
|
|
|
@ -77,7 +77,7 @@ M: integer user-groups ( id -- seq )
|
||||||
user-name (user-groups) ;
|
user-name (user-groups) ;
|
||||||
|
|
||||||
: all-groups ( -- seq )
|
: all-groups ( -- seq )
|
||||||
[ getgrent dup ] [ group-struct>group ] [ drop ] produce ;
|
[ getgrent dup ] [ group-struct>group ] produce nip ;
|
||||||
|
|
||||||
: <group-cache> ( -- assoc )
|
: <group-cache> ( -- assoc )
|
||||||
all-groups [ [ id>> ] keep ] H{ } map>assoc ;
|
all-groups [ [ id>> ] keep ] H{ } map>assoc ;
|
||||||
|
|
|
@ -36,7 +36,7 @@ PRIVATE>
|
||||||
|
|
||||||
: all-users ( -- seq )
|
: all-users ( -- seq )
|
||||||
[
|
[
|
||||||
[ getpwent dup ] [ passwd>new-passwd ] [ drop ] produce
|
[ getpwent dup ] [ passwd>new-passwd ] produce nip
|
||||||
] with-pwent ;
|
] with-pwent ;
|
||||||
|
|
||||||
SYMBOL: user-cache
|
SYMBOL: user-cache
|
||||||
|
|
|
@ -14,7 +14,7 @@ IN: unix.utilities
|
||||||
: alien>strings ( alien encoding -- strings )
|
: alien>strings ( alien encoding -- strings )
|
||||||
[ [ dup more? ] ] dip
|
[ [ dup more? ] ] dip
|
||||||
'[ [ advance ] [ *void* _ alien>string ] bi ]
|
'[ [ advance ] [ *void* _ alien>string ] bi ]
|
||||||
[ ] produce nip ;
|
produce nip ;
|
||||||
|
|
||||||
: strings>alien ( strings encoding -- array )
|
: strings>alien ( strings encoding -- array )
|
||||||
'[ _ malloc-string ] void*-array{ } map-as f suffix ;
|
'[ _ malloc-string ] void*-array{ } map-as f suffix ;
|
||||||
|
|
|
@ -57,7 +57,7 @@ M: unix utmpx>utmpx-record ( utmpx -- utmpx-record )
|
||||||
[
|
[
|
||||||
[ getutxent dup ]
|
[ getutxent dup ]
|
||||||
[ utmpx>utmpx-record ]
|
[ utmpx>utmpx-record ]
|
||||||
[ drop ] produce
|
produce nip
|
||||||
] with-utmpx ;
|
] with-utmpx ;
|
||||||
|
|
||||||
os {
|
os {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
! Copyright (C) 2006 Doug Coleman
|
! Copyright (C) 2006 Doug Coleman
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel math sequences sequences.private namespaces
|
USING: kernel math sequences sequences.private namespaces
|
||||||
words io io.binary io.files io.streams.string quotations
|
words io io.binary io.files quotations
|
||||||
definitions checksums ;
|
definitions checksums ;
|
||||||
IN: checksums.crc32
|
IN: checksums.crc32
|
||||||
|
|
||||||
|
|
|
@ -210,7 +210,7 @@ M: anonymous-complement (classes-intersect?)
|
||||||
[ [ name>> ] compare ] sort >vector
|
[ [ name>> ] compare ] sort >vector
|
||||||
[ dup empty? not ]
|
[ dup empty? not ]
|
||||||
[ dup largest-class [ over delete-nth ] dip ]
|
[ dup largest-class [ over delete-nth ] dip ]
|
||||||
[ ] produce nip ;
|
produce nip ;
|
||||||
|
|
||||||
: min-class ( class seq -- class/f )
|
: min-class ( class seq -- class/f )
|
||||||
over [ classes-intersect? ] curry filter
|
over [ classes-intersect? ] curry filter
|
||||||
|
|
|
@ -21,7 +21,7 @@ ERROR: bad-effect ;
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: parse-effect-tokens ( end -- tokens )
|
: parse-effect-tokens ( end -- tokens )
|
||||||
[ parse-effect-token dup ] curry [ ] [ drop ] produce ;
|
[ parse-effect-token dup ] curry [ ] produce nip ;
|
||||||
|
|
||||||
: parse-effect ( end -- effect )
|
: parse-effect ( end -- effect )
|
||||||
parse-effect-tokens { "--" } split1 dup
|
parse-effect-tokens { "--" } split1 dup
|
||||||
|
|
|
@ -224,7 +224,7 @@ $io-error ;
|
||||||
ARTICLE: "stream-protocol" "Stream protocol"
|
ARTICLE: "stream-protocol" "Stream protocol"
|
||||||
"The stream protocol consists of a large number of generic words, many of which are optional."
|
"The stream protocol consists of a large number of generic words, many of which are optional."
|
||||||
$nl
|
$nl
|
||||||
"Stream protocol words are rarely called directly, since code which only works with one stream at a time should be written use " { $link "stdio" } " instead, wrapping I/O operations such as " { $link read } " and " { $link write } " in " { $link with-input-stream } " and " { $link with-output-stream } "."
|
"Stream protocol words are rarely called directly, since code which only works with one stream at a time should be written to use " { $link "stdio" } " instead, wrapping I/O operations such as " { $link read } " and " { $link write } " in " { $link with-input-stream } " and " { $link with-output-stream } "."
|
||||||
$nl
|
$nl
|
||||||
"All streams must implement the " { $link dispose } " word in addition to the stream protocol."
|
"All streams must implement the " { $link dispose } " word in addition to the stream protocol."
|
||||||
$nl
|
$nl
|
||||||
|
|
|
@ -65,12 +65,12 @@ SYMBOL: error-stream
|
||||||
: bl ( -- ) " " write ;
|
: bl ( -- ) " " write ;
|
||||||
|
|
||||||
: lines ( stream -- seq )
|
: lines ( stream -- seq )
|
||||||
[ [ readln dup ] [ ] [ drop ] produce ] with-input-stream ;
|
[ [ readln dup ] [ ] produce nip ] with-input-stream ;
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: each-morsel ( handler: ( data -- ) reader: ( -- data ) -- )
|
: each-morsel ( handler: ( data -- ) reader: ( -- data ) -- )
|
||||||
[ dup ] compose swap [ drop ] while ; inline
|
[ dup ] compose swap while drop ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
@ -79,8 +79,7 @@ PRIVATE>
|
||||||
|
|
||||||
: contents ( stream -- seq )
|
: contents ( stream -- seq )
|
||||||
[
|
[
|
||||||
[ 65536 read-partial dup ]
|
[ 65536 read-partial dup ] [ ] produce nip concat f like
|
||||||
[ ] [ drop ] produce concat f like
|
|
||||||
] with-input-stream ;
|
] with-input-stream ;
|
||||||
|
|
||||||
: each-block ( quot: ( block -- ) -- )
|
: each-block ( quot: ( block -- ) -- )
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
! Copyright (C) 2009 Daniel Ehrenberg
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: sequences io kernel accessors math math.order ;
|
||||||
|
IN: io.streams.sequence
|
||||||
|
|
||||||
|
SLOT: underlying
|
||||||
|
SLOT: i
|
||||||
|
|
||||||
|
: >sequence-stream< ( stream -- i underlying )
|
||||||
|
[ i>> ] [ underlying>> ] bi ; inline
|
||||||
|
|
||||||
|
: next ( stream -- )
|
||||||
|
[ 1+ ] change-i drop ; inline
|
||||||
|
|
||||||
|
: sequence-read1 ( stream -- elt/f )
|
||||||
|
[ >sequence-stream< ?nth ]
|
||||||
|
[ next ] bi ; inline
|
||||||
|
|
||||||
|
: add-length ( n stream -- i+n )
|
||||||
|
[ i>> + ] [ underlying>> length ] bi min ; inline
|
||||||
|
|
||||||
|
: (sequence-read) ( n stream -- seq/f )
|
||||||
|
[ add-length ] keep
|
||||||
|
[ [ swap dup ] change-i drop ]
|
||||||
|
[ underlying>> ] bi
|
||||||
|
subseq ; inline
|
||||||
|
|
||||||
|
: sequence-read ( n stream -- seq/f )
|
||||||
|
dup >sequence-stream< bounds-check?
|
||||||
|
[ (sequence-read) ] [ 2drop f ] if ; inline
|
||||||
|
|
||||||
|
: find-sep ( seps stream -- sep/f n )
|
||||||
|
swap [ >sequence-stream< ] dip
|
||||||
|
[ memq? ] curry find-from swap ; inline
|
||||||
|
|
||||||
|
: sequence-read-until ( separators stream -- seq sep/f )
|
||||||
|
[ find-sep ] keep
|
||||||
|
[ sequence-read ] [ next ] bi swap ; inline
|
|
@ -15,12 +15,12 @@ unit-test
|
||||||
|
|
||||||
[ "xyzzy" ] [ [ "xyzzy" write ] with-string-writer ] unit-test
|
[ "xyzzy" ] [ [ "xyzzy" write ] with-string-writer ] unit-test
|
||||||
|
|
||||||
[ "a" ] [ 1 SBUF" cba" stream-read ] unit-test
|
[ "a" ] [ 1 "abc" <string-reader> stream-read ] unit-test
|
||||||
[ "ab" ] [ 2 SBUF" cba" stream-read ] unit-test
|
[ "ab" ] [ 2 "abc" <string-reader> stream-read ] unit-test
|
||||||
[ "abc" ] [ 3 SBUF" cba" stream-read ] unit-test
|
[ "abc" ] [ 3 "abc" <string-reader> stream-read ] unit-test
|
||||||
[ "abc" ] [ 4 SBUF" cba" stream-read ] unit-test
|
[ "abc" ] [ 4 "abc" <string-reader> stream-read ] unit-test
|
||||||
[ "abc" f ] [
|
[ "abc" f ] [
|
||||||
3 SBUF" cba" [ stream-read ] keep stream-read1
|
3 "abc" <string-reader> [ stream-read ] keep stream-read1
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[
|
[
|
||||||
|
|
|
@ -1,18 +1,12 @@
|
||||||
! Copyright (C) 2003, 2009 Slava Pestov.
|
! Copyright (C) 2003, 2009 Slava Pestov, Daniel Ehrenberg.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors io kernel math namespaces sequences sbufs
|
USING: accessors io kernel math namespaces sequences sbufs
|
||||||
strings generic splitting continuations destructors
|
strings generic splitting continuations destructors sequences.private
|
||||||
io.streams.plain io.encodings math.order growable ;
|
io.streams.plain io.encodings math.order growable io.streams.sequence ;
|
||||||
IN: io.streams.string
|
IN: io.streams.string
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
: harden-as ( seq growble-exemplar -- newseq )
|
|
||||||
underlying>> like ;
|
|
||||||
|
|
||||||
: growable-read-until ( growable n -- str )
|
|
||||||
>fixnum dupd tail-slice swap harden-as dup reverse-here ;
|
|
||||||
|
|
||||||
SINGLETON: null-encoding
|
SINGLETON: null-encoding
|
||||||
|
|
||||||
M: null-encoding decode-char drop stream-read1 ;
|
M: null-encoding decode-char drop stream-read1 ;
|
||||||
|
@ -32,34 +26,18 @@ M: growable stream-flush drop ;
|
||||||
<string-writer> swap [ output-stream get ] compose with-output-stream*
|
<string-writer> swap [ output-stream get ] compose with-output-stream*
|
||||||
>string ; inline
|
>string ; inline
|
||||||
|
|
||||||
M: growable stream-read1 [ f ] [ pop ] if-empty ;
|
! New implementation
|
||||||
|
|
||||||
: find-last-sep ( seq seps -- n )
|
TUPLE: string-reader { underlying string read-only } { i array-capacity } ;
|
||||||
swap [ memq? ] curry find-last drop ;
|
|
||||||
|
|
||||||
M: growable stream-read-until
|
M: string-reader stream-read-partial stream-read ;
|
||||||
[ find-last-sep ] keep over [
|
M: string-reader stream-read sequence-read ;
|
||||||
[ swap 1+ growable-read-until ] 2keep [ nth ] 2keep
|
M: string-reader stream-read1 sequence-read1 ;
|
||||||
set-length
|
M: string-reader stream-read-until sequence-read-until ;
|
||||||
] [
|
M: string-reader dispose drop ;
|
||||||
[ swap drop 0 growable-read-until f like f ] keep
|
|
||||||
delete-all
|
|
||||||
] if ;
|
|
||||||
|
|
||||||
M: growable stream-read
|
|
||||||
[
|
|
||||||
drop f
|
|
||||||
] [
|
|
||||||
[ length swap - 0 max ] keep
|
|
||||||
[ swap growable-read-until ] 2keep
|
|
||||||
set-length
|
|
||||||
] if-empty ;
|
|
||||||
|
|
||||||
M: growable stream-read-partial
|
|
||||||
stream-read ;
|
|
||||||
|
|
||||||
: <string-reader> ( str -- stream )
|
: <string-reader> ( str -- stream )
|
||||||
>sbuf dup reverse-here null-encoding <decoder> ;
|
0 string-reader boa null-encoding <decoder> ;
|
||||||
|
|
||||||
: with-string-reader ( str quot -- )
|
: with-string-reader ( str quot -- )
|
||||||
[ <string-reader> ] dip with-input-stream ; inline
|
[ <string-reader> ] dip with-input-stream ; inline
|
||||||
|
|
|
@ -638,15 +638,15 @@ HELP: 4dip
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
HELP: while
|
HELP: while
|
||||||
{ $values { "pred" { $quotation "( -- ? )" } } { "body" "a quotation" } { "tail" "a quotation" } }
|
{ $values { "pred" { $quotation "( -- ? )" } } { "body" "a quotation" } }
|
||||||
{ $description "Calls " { $snippet "body" } " until " { $snippet "pred" } " returns " { $link f } "." } ;
|
{ $description "Calls " { $snippet "body" } " until " { $snippet "pred" } " returns " { $link f } "." } ;
|
||||||
|
|
||||||
HELP: until
|
HELP: until
|
||||||
{ $values { "pred" { $quotation "( -- ? )" } } { "body" "a quotation" } { "tail" "a quotation" } }
|
{ $values { "pred" { $quotation "( -- ? )" } } { "body" "a quotation" } }
|
||||||
{ $description "Calls " { $snippet "body" } " until " { $snippet "pred" } " returns " { $link t } "." } ;
|
{ $description "Calls " { $snippet "body" } " until " { $snippet "pred" } " returns " { $link t } "." } ;
|
||||||
|
|
||||||
HELP: do
|
HELP: do
|
||||||
{ $values { "pred" { $quotation "( -- ? )" } } { "body" "a quotation" } { "tail" "a quotation" } }
|
{ $values { "pred" { $quotation "( -- ? )" } } { "body" "a quotation" } }
|
||||||
{ $description "Executes one iteration of a " { $link while } " or " { $link until } " loop." } ;
|
{ $description "Executes one iteration of a " { $link while } " or " { $link until } " loop." } ;
|
||||||
|
|
||||||
HELP: loop
|
HELP: loop
|
||||||
|
@ -667,18 +667,11 @@ ARTICLE: "looping-combinators" "Looping combinators"
|
||||||
"In most cases, loops should be written using high-level combinators (such as " { $link "sequences-combinators" } ") or tail recursion. However, sometimes, the best way to express intent is with a loop."
|
"In most cases, loops should be written using high-level combinators (such as " { $link "sequences-combinators" } ") or tail recursion. However, sometimes, the best way to express intent is with a loop."
|
||||||
{ $subsection while }
|
{ $subsection while }
|
||||||
{ $subsection until }
|
{ $subsection until }
|
||||||
"The above two combinators take a " { $snippet "tail" } " quotation. Strictly speaking, the " { $snippet "tail" } " is not necessary, since the following are equivalent:"
|
|
||||||
{ $code
|
|
||||||
"[ P ] [ Q ] [ T ] while"
|
|
||||||
"[ P ] [ Q ] [ ] while T"
|
|
||||||
}
|
|
||||||
"However, depending on the stack effects of " { $snippet "pred" } " and " { $snippet "quot" } ", the " { $snippet "tail" } " quotation might need to be non-empty in order to balance out the stack effect of branches for stack effect inference."
|
|
||||||
$nl
|
|
||||||
"To execute one iteration of a loop, use the following word:"
|
"To execute one iteration of a loop, use the following word:"
|
||||||
{ $subsection do }
|
{ $subsection do }
|
||||||
"This word is intended as a modifier. The normal " { $link while } " loop never executes the body if the predicate returns first on the first iteration. To ensure the body executes at least once, use " { $link do } ":"
|
"This word is intended as a modifier. The normal " { $link while } " loop never executes the body if the predicate returns first on the first iteration. To ensure the body executes at least once, use " { $link do } ":"
|
||||||
{ $code
|
{ $code
|
||||||
"[ P ] [ Q ] [ T ] do while"
|
"[ P ] [ Q ] do while"
|
||||||
}
|
}
|
||||||
"A simpler looping combinator which executes a single quotation until it returns " { $link f } ":"
|
"A simpler looping combinator which executes a single quotation until it returns " { $link f } ":"
|
||||||
{ $subsection loop } ;
|
{ $subsection loop } ;
|
||||||
|
|
|
@ -185,21 +185,20 @@ PRIVATE>
|
||||||
|
|
||||||
: either? ( x y quot -- ? ) bi@ or ; inline
|
: either? ( x y quot -- ? ) bi@ or ; inline
|
||||||
|
|
||||||
: most ( x y quot -- z )
|
: most ( x y quot -- z ) 2keep ? ; inline
|
||||||
[ 2dup ] dip call [ drop ] [ nip ] if ; inline
|
|
||||||
|
|
||||||
! Loops
|
! Loops
|
||||||
: loop ( pred: ( -- ? ) -- )
|
: loop ( pred: ( -- ? ) -- )
|
||||||
[ call ] keep [ loop ] curry when ; inline recursive
|
[ call ] keep [ loop ] curry when ; inline recursive
|
||||||
|
|
||||||
: do ( pred body tail -- pred body tail )
|
: do ( pred body -- pred body )
|
||||||
over 3dip ; inline
|
dup 2dip ; inline
|
||||||
|
|
||||||
: while ( pred: ( -- ? ) body: ( -- ) tail: ( -- ) -- )
|
: while ( pred: ( -- ? ) body: ( -- ) -- )
|
||||||
[ pick 3dip [ do while ] 3curry ] keep if ; inline recursive
|
swap do compose [ loop ] curry when ; inline
|
||||||
|
|
||||||
: until ( pred: ( -- ? ) body: ( -- ) tail: ( -- ) -- )
|
: until ( pred: ( -- ? ) body: ( -- ) -- )
|
||||||
[ [ not ] compose ] 2dip while ; inline
|
[ [ not ] compose ] dip while ; inline
|
||||||
|
|
||||||
! Object protocol
|
! Object protocol
|
||||||
GENERIC: hashcode* ( depth obj -- code )
|
GENERIC: hashcode* ( depth obj -- code )
|
||||||
|
|
|
@ -41,7 +41,7 @@ M: fixnum bitnot fixnum-bitnot ;
|
||||||
M: fixnum bit? neg shift 1 bitand 0 > ;
|
M: fixnum bit? neg shift 1 bitand 0 > ;
|
||||||
|
|
||||||
: fixnum-log2 ( x -- n )
|
: fixnum-log2 ( x -- n )
|
||||||
0 swap [ dup 1 eq? ] [ [ 1+ ] [ 2/ ] bi* ] [ ] until drop ;
|
0 swap [ dup 1 eq? ] [ [ 1+ ] [ 2/ ] bi* ] until drop ;
|
||||||
|
|
||||||
M: fixnum (log2) fixnum-log2 ;
|
M: fixnum (log2) fixnum-log2 ;
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ M: bignum (log2) bignum-log2 ;
|
||||||
: /f-loop ( scale mantissa den -- scale' fraction-and-guard rem )
|
: /f-loop ( scale mantissa den -- scale' fraction-and-guard rem )
|
||||||
[ 2dup /i log2 53 > ]
|
[ 2dup /i log2 53 > ]
|
||||||
[ [ shift-mantissa ] dip ]
|
[ [ shift-mantissa ] dip ]
|
||||||
[ ] while /mod ; inline
|
while /mod ; inline
|
||||||
|
|
||||||
! Third step: post-scaling
|
! Third step: post-scaling
|
||||||
: unscaled-float ( mantissa -- n )
|
: unscaled-float ( mantissa -- n )
|
||||||
|
|
|
@ -308,7 +308,7 @@ HELP: find-last-integer
|
||||||
|
|
||||||
HELP: byte-array>bignum
|
HELP: byte-array>bignum
|
||||||
{ $values { "byte-array" byte-array } { "n" integer } }
|
{ $values { "byte-array" byte-array } { "n" integer } }
|
||||||
{ $description "Converts a byte-array, interpreted as little-endian, into a bignum integer. User code should call " { $link >le } " or " { $link >be } " instead." } ;
|
{ $description "Converts a byte-array, interpreted as little-endian, into a bignum integer. User code should call " { $link le> } " or " { $link be> } " instead." } ;
|
||||||
|
|
||||||
ARTICLE: "division-by-zero" "Division by zero"
|
ARTICLE: "division-by-zero" "Division by zero"
|
||||||
"Floating point division never raises an error if the denominator is zero. This means that if at least one of the two inputs to " { $link / } ", " { $link /f } " or " { $link mod } " is a float, the result will be a floating point infinity or not a number value."
|
"Floating point division never raises an error if the denominator is zero. This means that if at least one of the two inputs to " { $link / } ", " { $link /f } " or " { $link mod } " is a float, the result will be a floating point infinity or not a number value."
|
||||||
|
|
|
@ -96,7 +96,7 @@ PRIVATE>
|
||||||
|
|
||||||
: positive>base ( num radix -- str )
|
: positive>base ( num radix -- str )
|
||||||
dup 1 <= [ "Invalid radix" throw ] when
|
dup 1 <= [ "Invalid radix" throw ] when
|
||||||
[ dup 0 > ] swap [ /mod >digit ] curry [ ] "" produce-as nip
|
[ dup 0 > ] swap [ /mod >digit ] curry "" produce-as nip
|
||||||
dup reverse-here ; inline
|
dup reverse-here ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
|
@ -915,24 +915,19 @@ HELP: supremum
|
||||||
{ $errors "Throws an error if the sequence is empty." } ;
|
{ $errors "Throws an error if the sequence is empty." } ;
|
||||||
|
|
||||||
HELP: produce
|
HELP: produce
|
||||||
{ $values { "pred" { $quotation "( -- ? )" } } { "quot" { $quotation "( -- obj )" } } { "tail" "a quotation" } { "seq" "a sequence" } }
|
{ $values { "pred" { $quotation "( -- ? )" } } { "quot" { $quotation "( -- obj )" } } { "seq" "a sequence" } }
|
||||||
{ $description "Calls " { $snippet "pred" } " repeatedly. If the predicate yields " { $link f } ", stops, otherwise, calls " { $snippet "quot" } " to yield a value. Values are accumulated and returned in a sequence at the end." }
|
{ $description "Calls " { $snippet "pred" } " repeatedly. If the predicate yields " { $link f } ", stops, otherwise, calls " { $snippet "quot" } " to yield a value. Values are accumulated and returned in a sequence at the end." }
|
||||||
{ $examples
|
{ $examples
|
||||||
"The following example divides a number by two until we reach zero, and accumulates intermediate results:"
|
"The following example divides a number by two until we reach zero, and accumulates intermediate results:"
|
||||||
{ $example "USING: kernel math prettyprint sequences ;" "1337 [ dup 0 > ] [ 2/ dup ] [ ] produce nip ." "{ 668 334 167 83 41 20 10 5 2 1 0 }" }
|
{ $example "USING: kernel math prettyprint sequences ;" "1337 [ dup 0 > ] [ 2/ dup ] produce nip ." "{ 668 334 167 83 41 20 10 5 2 1 0 }" }
|
||||||
"The " { $snippet "tail" } " quotation is used when the predicate produces more than one output value. In this case, we have to drop this value even if the predicate fails in order for stack inference to calculate a stack effect for the " { $link produce } " call:"
|
"The following example collects random numbers as long as they are greater than 1:"
|
||||||
{ $unchecked-example "USING: kernel prettyprint random sequences ;" "[ 10 random dup 1 > ] [ ] [ drop ] produce ." "{ 8 2 2 9 }" }
|
{ $unchecked-example "USING: kernel prettyprint random sequences ;" "[ 10 random dup 1 > ] [ ] produce nip ." "{ 8 2 2 9 }" }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
HELP: produce-as
|
HELP: produce-as
|
||||||
{ $values { "pred" { $quotation "( -- ? )" } } { "quot" { $quotation "( -- obj )" } } { "tail" "a quotation" } { "exemplar" sequence } { "seq" "a sequence" } }
|
{ $values { "pred" { $quotation "( -- ? )" } } { "quot" { $quotation "( -- obj )" } } { "exemplar" sequence } { "seq" "a sequence" } }
|
||||||
{ $description "Calls " { $snippet "pred" } " repeatedly. If the predicate yields " { $link f } ", stops, otherwise, calls " { $snippet "quot" } " to yield a value. Values are accumulated and returned in a sequence of type " { $snippet "exemplar" } " at the end." }
|
{ $description "Calls " { $snippet "pred" } " repeatedly. If the predicate yields " { $link f } ", stops, otherwise, calls " { $snippet "quot" } " to yield a value. Values are accumulated and returned in a sequence of type " { $snippet "exemplar" } " at the end." }
|
||||||
{ $examples
|
{ $examples "See " { $link produce } " for examples." } ;
|
||||||
"The following example divides a number by two until we reach zero, and accumulates intermediate results:"
|
|
||||||
{ $example "USING: kernel math prettyprint sequences ;" "1337 [ dup 0 > ] [ 2/ dup ] [ ] V{ } produce-as nip ." "V{ 668 334 167 83 41 20 10 5 2 1 0 }" }
|
|
||||||
"The " { $snippet "tail" } " quotation is used when the predicate produces more than one output value. In this case, we have to drop this value even if the predicate fails in order for stack inference to calculate a stack effect for the " { $link produce } " call:"
|
|
||||||
{ $unchecked-example "USING: kernel prettyprint random sequences ;" "[ 10 random dup 1 > ] [ ] [ drop ] B{ } produce-as ." "B{ 8 2 2 9 }" }
|
|
||||||
} ;
|
|
||||||
|
|
||||||
HELP: sigma
|
HELP: sigma
|
||||||
{ $values { "seq" sequence } { "quot" quotation } { "n" number } }
|
{ $values { "seq" sequence } { "quot" quotation } { "n" number } }
|
||||||
|
|
|
@ -487,14 +487,14 @@ PRIVATE>
|
||||||
: accumulator ( quot -- quot' vec )
|
: accumulator ( quot -- quot' vec )
|
||||||
V{ } clone [ [ push ] curry compose ] keep ; inline
|
V{ } clone [ [ push ] curry compose ] keep ; inline
|
||||||
|
|
||||||
: produce-as ( pred quot tail exemplar -- seq )
|
: produce-as ( pred quot exemplar -- seq )
|
||||||
[ swap accumulator [ swap while ] dip ] dip like ; inline
|
[ accumulator [ while ] dip ] dip like ; inline
|
||||||
|
|
||||||
: produce ( pred quot tail -- seq )
|
: produce ( pred quot -- seq )
|
||||||
{ } produce-as ; inline
|
{ } produce-as ; inline
|
||||||
|
|
||||||
: follow ( obj quot -- seq )
|
: follow ( obj quot -- seq )
|
||||||
[ dup ] swap [ keep ] curry [ ] produce nip ; inline
|
[ dup ] swap [ keep ] curry produce nip ; inline
|
||||||
|
|
||||||
: prepare-index ( seq quot -- seq n quot )
|
: prepare-index ( seq quot -- seq n quot )
|
||||||
[ dup length ] dip ; inline
|
[ dup length ] dip ; inline
|
||||||
|
|
|
@ -199,7 +199,7 @@ M: array make-slot
|
||||||
swap
|
swap
|
||||||
peel-off-name
|
peel-off-name
|
||||||
peel-off-class
|
peel-off-class
|
||||||
[ dup empty? ] [ peel-off-attributes ] [ ] until drop
|
[ dup empty? ] [ peel-off-attributes ] until drop
|
||||||
check-initial-value ;
|
check-initial-value ;
|
||||||
|
|
||||||
M: slot-spec make-slot
|
M: slot-spec make-slot
|
||||||
|
|
|
@ -126,7 +126,7 @@ TUPLE: merge
|
||||||
: sort-loop ( merge quot -- )
|
: sort-loop ( merge quot -- )
|
||||||
[ 2 [ over seq>> length over > ] ] dip
|
[ 2 [ over seq>> length over > ] ] dip
|
||||||
[ [ 1 shift 2dup ] dip sort-pass ] curry
|
[ [ 1 shift 2dup ] dip sort-pass ] curry
|
||||||
[ ] while 2drop ; inline
|
while 2drop ; inline
|
||||||
|
|
||||||
: each-pair ( seq quot -- )
|
: each-pair ( seq quot -- )
|
||||||
[ [ length 1+ 2/ ] keep ] dip
|
[ [ length 1+ 2/ ] keep ] dip
|
||||||
|
|
|
@ -25,9 +25,11 @@ SINGLETON: solaris
|
||||||
SINGLETON: macosx
|
SINGLETON: macosx
|
||||||
SINGLETON: linux
|
SINGLETON: linux
|
||||||
|
|
||||||
|
SINGLETON: haiku
|
||||||
|
|
||||||
UNION: bsd freebsd netbsd openbsd macosx ;
|
UNION: bsd freebsd netbsd openbsd macosx ;
|
||||||
|
|
||||||
UNION: unix bsd solaris linux ;
|
UNION: unix bsd solaris linux haiku ;
|
||||||
|
|
||||||
: os ( -- class ) \ os get-global ; foldable
|
: os ( -- class ) \ os get-global ; foldable
|
||||||
|
|
||||||
|
@ -51,6 +53,7 @@ UNION: unix bsd solaris linux ;
|
||||||
{ "solaris" solaris }
|
{ "solaris" solaris }
|
||||||
{ "macosx" macosx }
|
{ "macosx" macosx }
|
||||||
{ "linux" linux }
|
{ "linux" linux }
|
||||||
|
{ "haiku" haiku }
|
||||||
} at ;
|
} at ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
|
@ -337,7 +337,7 @@ TUPLE: solid dimension silhouettes
|
||||||
: compute-adjacencies ( solid -- solid )
|
: compute-adjacencies ( solid -- solid )
|
||||||
dup dimension>> [ >= ] curry
|
dup dimension>> [ >= ] curry
|
||||||
[ keep swap ] curry MAX-FACE-PER-CORNER swap
|
[ keep swap ] curry MAX-FACE-PER-CORNER swap
|
||||||
[ [ test-faces-combinaisons ] 2keep 1- ] [ ] while drop ;
|
[ [ test-faces-combinaisons ] 2keep 1- ] while drop ;
|
||||||
|
|
||||||
: find-adjacencies ( solid -- solid )
|
: find-adjacencies ( solid -- solid )
|
||||||
erase-old-adjacencies
|
erase-old-adjacencies
|
||||||
|
|
|
@ -135,7 +135,7 @@ METHOD: collide ( <axion> -- )
|
||||||
0 >>theta-d
|
0 >>theta-d
|
||||||
0 >>theta-dd
|
0 >>theta-dd
|
||||||
|
|
||||||
[ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] [ ] while
|
[ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] while
|
||||||
|
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
|
@ -201,7 +201,7 @@ METHOD: collide ( <hadron> -- )
|
||||||
0 >>theta-d
|
0 >>theta-d
|
||||||
0 >>theta-dd
|
0 >>theta-dd
|
||||||
|
|
||||||
[ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] [ ] while
|
[ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] while
|
||||||
|
|
||||||
0 1 0 1 rgba boa >>myc
|
0 1 0 1 rgba boa >>myc
|
||||||
|
|
||||||
|
@ -302,7 +302,7 @@ METHOD: collide ( <muon> -- )
|
||||||
0 >>theta-d
|
0 >>theta-d
|
||||||
0 >>theta-dd
|
0 >>theta-dd
|
||||||
|
|
||||||
[ 0.001 theta-dd-small? ] [ -0.1 0.1 random-theta-dd ] [ ] while
|
[ 0.001 theta-dd-small? ] [ -0.1 0.1 random-theta-dd ] while
|
||||||
|
|
||||||
set-good-color
|
set-good-color
|
||||||
set-anti-color
|
set-anti-color
|
||||||
|
@ -355,7 +355,7 @@ METHOD: collide ( <quark> -- )
|
||||||
0 >>theta-d
|
0 >>theta-d
|
||||||
0 >>theta-dd
|
0 >>theta-dd
|
||||||
|
|
||||||
[ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] [ ] while
|
[ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] while
|
||||||
|
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ PRIVATE>
|
||||||
: full-depth-first ( graph pre post tail -- ? )
|
: full-depth-first ( graph pre post tail -- ? )
|
||||||
'[ [ visited? get [ nip not ] assoc-find ]
|
'[ [ visited? get [ nip not ] assoc-find ]
|
||||||
[ drop _ _ (depth-first) @ ]
|
[ drop _ _ (depth-first) @ ]
|
||||||
[ 2drop ] while ] swap search-wrap ; inline
|
while 2drop ] swap search-wrap ; inline
|
||||||
|
|
||||||
: dag? ( graph -- ? )
|
: dag? ( graph -- ? )
|
||||||
V{ } clone swap [ 2dup swap push dupd
|
V{ } clone swap [ 2dup swap push dupd
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
Tim Wawrzynczak
|
Tim Wawrzynczak
|
||||||
|
Doug Coleman
|
||||||
|
|
|
@ -6,7 +6,7 @@ IN: id3
|
||||||
HELP: file-id3-tags
|
HELP: file-id3-tags
|
||||||
{ $values
|
{ $values
|
||||||
{ "path" "a path string" }
|
{ "path" "a path string" }
|
||||||
{ "object/f" "a tuple storing ID3 metadata or f" } }
|
{ "id3v2-info/f" "a tuple storing ID3v2 metadata or f" } }
|
||||||
{ $description "Return a tuple containing the ID3 information parsed out of the MP3 file, or " { $link f } " if no metadata is present. Currently, the parser supports the following tags: "
|
{ $description "Return a tuple containing the ID3 information parsed out of the MP3 file, or " { $link f } " if no metadata is present. Currently, the parser supports the following tags: "
|
||||||
$nl { $link title>> }
|
$nl { $link title>> }
|
||||||
$nl { $link artist>> }
|
$nl { $link artist>> }
|
||||||
|
|
|
@ -1,35 +1,42 @@
|
||||||
! Copyright (C) 2009 Tim Wawrzynczak
|
! Copyright (C) 2009 Tim Wawrzynczak
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: tools.test id3 id3.private ;
|
USING: tools.test id3 combinators ;
|
||||||
IN: id3.tests
|
IN: id3.tests
|
||||||
|
|
||||||
[
|
: id3-params ( id3 -- title artist album year comment genre )
|
||||||
T{ id3-info
|
{
|
||||||
{ title "BLAH" }
|
[ id3-title ]
|
||||||
{ artist "ARTIST" }
|
[ id3-artist ]
|
||||||
{ album "ALBUM" }
|
[ id3-album ]
|
||||||
{ year "2009" }
|
[ id3-year ]
|
||||||
{ comment "COMMENT" }
|
[ id3-comment ]
|
||||||
{ genre "Bluegrass" }
|
[ id3-genre ]
|
||||||
}
|
} cleave ;
|
||||||
] [ "resource:extra/id3/tests/blah.mp3" file-id3-tags ] unit-test
|
|
||||||
|
|
||||||
[
|
[
|
||||||
T{ id3-info
|
"BLAH"
|
||||||
{ title "Anthem of the Trinity" }
|
"ARTIST"
|
||||||
{ artist "Terry Riley" }
|
"ALBUM"
|
||||||
{ album "Shri Camel" }
|
"2009"
|
||||||
{ genre "Classical" }
|
"COMMENT"
|
||||||
}
|
"Bluegrass"
|
||||||
] [ "resource:extra/id3/tests/blah2.mp3" file-id3-tags ] unit-test
|
] [ "vocab:id3/tests/blah.mp3" file-id3-tags id3-params ] unit-test
|
||||||
|
|
||||||
|
[
|
||||||
|
"Anthem of the Trinity"
|
||||||
|
"Terry Riley"
|
||||||
|
"Shri Camel"
|
||||||
|
f
|
||||||
|
f
|
||||||
|
"Classical"
|
||||||
|
] [ "vocab:id3/tests/blah2.mp3" file-id3-tags id3-params ] unit-test
|
||||||
|
|
||||||
[
|
[
|
||||||
T{ id3-info
|
"Stormy Weather"
|
||||||
{ title "Stormy Weather" }
|
"Frank Sinatra"
|
||||||
{ artist "Frank Sinatra" }
|
"Night and Day Frank Sinatra"
|
||||||
{ album "Night and Day Frank Sinatra" }
|
f
|
||||||
{ comment "eng, AG# 08E1C12E" }
|
"eng, AG# 08E1C12E"
|
||||||
{ genre "Big Band" }
|
"Big Band"
|
||||||
}
|
] [ "vocab:id3/tests/blah3.mp3" file-id3-tags id3-params ] unit-test
|
||||||
] [ "resource:extra/id3/tests/blah3.mp3" file-id3-tags ] unit-test
|
|
||||||
|
|
||||||
|
|
|
@ -1,142 +1,43 @@
|
||||||
! Copyright (C) 2009 Tim Wawrzynczak
|
! Copyright (C) 2009 Tim Wawrzynczak, Doug Coleman.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: sequences io io.encodings.binary io.files io.pathnames strings kernel math io.mmap io.mmap.uchar accessors syntax combinators math.ranges unicode.categories byte-arrays io.encodings.string io.encodings.utf8 assocs math.parser ;
|
USING: sequences io io.encodings.binary io.files io.pathnames
|
||||||
|
strings kernel math io.mmap io.mmap.uchar accessors syntax
|
||||||
|
combinators math.ranges unicode.categories byte-arrays
|
||||||
|
io.encodings.string io.encodings.utf16 assocs math.parser
|
||||||
|
combinators.short-circuit fry namespaces combinators.smart
|
||||||
|
splitting io.encodings.ascii arrays ;
|
||||||
IN: id3
|
IN: id3
|
||||||
|
|
||||||
<PRIVATE
|
<PRIVATE
|
||||||
|
|
||||||
! genres
|
|
||||||
CONSTANT: genres
|
CONSTANT: genres
|
||||||
H{
|
{
|
||||||
{ 0 "Blues" }
|
"Blues" "Classic Rock" "Country" "Dance" "Disco" "Funk"
|
||||||
{ 1 "Classic Rock" }
|
"Grunge" "Hip-Hop" "Jazz" "Metal" "New Age" "Oldies" "Other"
|
||||||
{ 2 "Country" }
|
"Pop" "R&B" "Rap" "Reggae" "Rock" "Techno" "Industrial"
|
||||||
{ 3 "Dance" }
|
"Alternative" "Ska" "Death Metal" "Pranks" "Soundtrack"
|
||||||
{ 4 "Disco" }
|
"Euro-Techno" "Ambient" "Trip-Hop" "Vocal" "Jazz+Funk"
|
||||||
{ 5 "Funk" }
|
"Fusion" "Trance" "Classical" "Instrumental" "Acid" "House"
|
||||||
{ 6 "Grunge" }
|
"Game" "Sound Clip" "Gospel" "Noise" "AlternRock" "Bass"
|
||||||
{ 7 "Hip-Hop" }
|
"Soul" "Punk" "Space" "Meditative" "Instrumental Pop"
|
||||||
{ 8 "Jazz" }
|
"Instrumental Rock" "Ethnic" "Gothic" "Darkwave"
|
||||||
{ 9 "Metal" }
|
"Techno-Industrial" "Electronic" "Pop-Folk" "Eurodance"
|
||||||
{ 10 "New Age" }
|
"Dream" "Southern Rock" "Comedy" "Cult" "Gangsta" "Top 40"
|
||||||
{ 11 "Oldies" }
|
"Christian Rap" "Pop/Funk" "Jungle" "Native American"
|
||||||
{ 12 "Other" }
|
"Cabaret" "New Wave" "Psychedelic" "Rave" "Showtunes"
|
||||||
{ 13 "Pop" }
|
"Trailer" "Lo-Fi" "Tribal" "Acid Punk" "Acid Jazz" "Polka"
|
||||||
{ 14 "R&B" }
|
"Retro" "Musical" "Rock & Roll" "Hard Rock" "Folk"
|
||||||
{ 15 "Rap" }
|
"Folk-Rock" "National Folk" "Swing" "Fast Fusion" "Bebop"
|
||||||
{ 16 "Reggae" }
|
"Latin" "Revival" "Celtic" "Bluegrass" "Avantgarde"
|
||||||
{ 17 "Rock" }
|
"Gothic Rock" "Progressive Rock" "Psychedelic Rock"
|
||||||
{ 18 "Techno" }
|
"Symphonic Rock" "Slow Rock" "Big Band" "Chorus"
|
||||||
{ 19 "Industrial" }
|
"Easy Listening" "Acoustic" "Humour" "Speech" "Chanson"
|
||||||
{ 20 "Alternative" }
|
"Opera" "Chamber Music" "Sonata" "Symphony" "Booty Bass"
|
||||||
{ 21 "Ska" }
|
"Primus" "Porn Groove" "Satire" "Slow Jam" "Club" "Tango"
|
||||||
{ 22 "Death Metal" }
|
"Samba" "Folklore" "Ballad" "Power Ballad" "Rhythmic Soul"
|
||||||
{ 23 "Pranks" }
|
"Freestyle" "Duet" "Punk Rock" "Drum Solo" "A capella"
|
||||||
{ 24 "Soundtrack" }
|
"Euro-House" "Dance Hall"
|
||||||
{ 25 "Euro-Techno" }
|
}
|
||||||
{ 26 "Ambient" }
|
|
||||||
{ 27 "Trip-Hop" }
|
|
||||||
{ 28 "Vocal" }
|
|
||||||
{ 29 "Jazz+Funk" }
|
|
||||||
{ 30 "Fusion" }
|
|
||||||
{ 31 "Trance" }
|
|
||||||
{ 32 "Classical" }
|
|
||||||
{ 33 "Instrumental" }
|
|
||||||
{ 34 "Acid" }
|
|
||||||
{ 35 "House" }
|
|
||||||
{ 36 "Game" }
|
|
||||||
{ 37 "Sound Clip" }
|
|
||||||
{ 38 "Gospel" }
|
|
||||||
{ 39 "Noise" }
|
|
||||||
{ 40 "AlternRock" }
|
|
||||||
{ 41 "Bass" }
|
|
||||||
{ 42 "Soul" }
|
|
||||||
{ 43 "Punk" }
|
|
||||||
{ 44 "Space" }
|
|
||||||
{ 45 "Meditative" }
|
|
||||||
{ 46 "Instrumental Pop" }
|
|
||||||
{ 47 "Instrumental Rock" }
|
|
||||||
{ 48 "Ethnic" }
|
|
||||||
{ 49 "Gothic" }
|
|
||||||
{ 50 "Darkwave" }
|
|
||||||
{ 51 "Techno-Industrial" }
|
|
||||||
{ 52 "Electronic" }
|
|
||||||
{ 53 "Pop-Folk" }
|
|
||||||
{ 54 "Eurodance" }
|
|
||||||
{ 55 "Dream" }
|
|
||||||
{ 56 "Southern Rock" }
|
|
||||||
{ 57 "Comedy" }
|
|
||||||
{ 58 "Cult" }
|
|
||||||
{ 59 "Gangsta" }
|
|
||||||
{ 60 "Top 40" }
|
|
||||||
{ 61 "Christian Rap" }
|
|
||||||
{ 62 "Pop/Funk" }
|
|
||||||
{ 63 "Jungle" }
|
|
||||||
{ 64 "Native American" }
|
|
||||||
{ 65 "Cabaret" }
|
|
||||||
{ 66 "New Wave" }
|
|
||||||
{ 67 "Psychedelic" }
|
|
||||||
{ 68 "Rave" }
|
|
||||||
{ 69 "Showtunes" }
|
|
||||||
{ 70 "Trailer" }
|
|
||||||
{ 71 "Lo-Fi" }
|
|
||||||
{ 72 "Tribal" }
|
|
||||||
{ 73 "Acid Punk" }
|
|
||||||
{ 74 "Acid Jazz" }
|
|
||||||
{ 75 "Polka" }
|
|
||||||
{ 76 "Retro" }
|
|
||||||
{ 77 "Musical" }
|
|
||||||
{ 78 "Rock & Roll" }
|
|
||||||
{ 79 "Hard Rock" }
|
|
||||||
{ 80 "Folk" }
|
|
||||||
{ 81 "Folk-Rock" }
|
|
||||||
{ 82 "National Folk" }
|
|
||||||
{ 83 "Swing" }
|
|
||||||
{ 84 "Fast Fusion" }
|
|
||||||
{ 85 "Bebop" }
|
|
||||||
{ 86 "Latin" }
|
|
||||||
{ 87 "Revival" }
|
|
||||||
{ 88 "Celtic" }
|
|
||||||
{ 89 "Bluegrass" }
|
|
||||||
{ 90 "Avantgarde" }
|
|
||||||
{ 91 "Gothic Rock" }
|
|
||||||
{ 92 "Progressive Rock" }
|
|
||||||
{ 93 "Psychedelic Rock" }
|
|
||||||
{ 94 "Symphonic Rock" }
|
|
||||||
{ 95 "Slow Rock" }
|
|
||||||
{ 96 "Big Band" }
|
|
||||||
{ 97 "Chorus" }
|
|
||||||
{ 98 "Easy Listening" }
|
|
||||||
{ 99 "Acoustic" }
|
|
||||||
{ 100 "Humour" }
|
|
||||||
{ 101 "Speech" }
|
|
||||||
{ 102 "Chanson" }
|
|
||||||
{ 103 "Opera" }
|
|
||||||
{ 104 "Chamber Music" }
|
|
||||||
{ 105 "Sonata" }
|
|
||||||
{ 106 "Symphony" }
|
|
||||||
{ 107 "Booty Bass" }
|
|
||||||
{ 108 "Primus" }
|
|
||||||
{ 109 "Porn Groove" }
|
|
||||||
{ 110 "Satire" }
|
|
||||||
{ 111 "Slow Jam" }
|
|
||||||
{ 112 "Club" }
|
|
||||||
{ 113 "Tango" }
|
|
||||||
{ 114 "Samba" }
|
|
||||||
{ 115 "Folklore" }
|
|
||||||
{ 116 "Ballad" }
|
|
||||||
{ 117 "Power Ballad" }
|
|
||||||
{ 118 "Rhythmic Soul" }
|
|
||||||
{ 119 "Freestyle" }
|
|
||||||
{ 120 "Duet" }
|
|
||||||
{ 121 "Punk Rock" }
|
|
||||||
{ 122 "Drum Solo" }
|
|
||||||
{ 123 "A capella" }
|
|
||||||
{ 124 "Euro-House" }
|
|
||||||
{ 125 "Dance Hall" }
|
|
||||||
} ! end genre hashtable
|
|
||||||
|
|
||||||
! tuples
|
|
||||||
|
|
||||||
TUPLE: header version flags size ;
|
TUPLE: header version flags size ;
|
||||||
|
|
||||||
|
@ -144,154 +45,145 @@ TUPLE: frame frame-id flags size data ;
|
||||||
|
|
||||||
TUPLE: id3v2-info header frames ;
|
TUPLE: id3v2-info header frames ;
|
||||||
|
|
||||||
TUPLE: id3-info title artist album year comment genre ;
|
TUPLE: id3v1-info title artist album year comment genre ;
|
||||||
|
|
||||||
: <id3-info> ( -- object ) id3-info new ;
|
: <id3v1-info> ( -- object ) id3v1-info new ;
|
||||||
|
|
||||||
: <id3v2-info> ( header frames -- object ) id3v2-info boa ;
|
: <id3v2-info> ( header frames -- object )
|
||||||
|
[ [ frame-id>> ] keep ] H{ } map>assoc
|
||||||
|
id3v2-info boa ;
|
||||||
|
|
||||||
: <header> ( -- object ) header new ;
|
: <header> ( -- object ) header new ;
|
||||||
|
|
||||||
: <frame> ( -- object ) frame new ;
|
: <frame> ( -- object ) frame new ;
|
||||||
|
|
||||||
! utility words
|
: id3v2? ( mmap -- ? ) "ID3" head? ; inline
|
||||||
|
|
||||||
: id3v2? ( mmap -- ? )
|
|
||||||
"ID3" head? ;
|
|
||||||
|
|
||||||
: id3v1? ( mmap -- ? )
|
: id3v1? ( mmap -- ? )
|
||||||
128 tail-slice* "TAG" head? ;
|
{ [ length 128 >= ] [ 128 tail-slice* "TAG" head? ] } 1&& ; inline
|
||||||
|
|
||||||
|
: id3v1-frame ( string key -- frame )
|
||||||
|
<frame>
|
||||||
|
swap >>frame-id
|
||||||
|
swap >>data ;
|
||||||
|
|
||||||
|
: id3v1>id3v2 ( id3v1 -- id3v2 )
|
||||||
|
[
|
||||||
|
{
|
||||||
|
[ title>> "TIT2" id3v1-frame ]
|
||||||
|
[ artist>> "TPE1" id3v1-frame ]
|
||||||
|
[ album>> "TALB" id3v1-frame ]
|
||||||
|
[ year>> "TYER" id3v1-frame ]
|
||||||
|
[ comment>> "COMM" id3v1-frame ]
|
||||||
|
[ genre>> "TCON" id3v1-frame ]
|
||||||
|
} cleave
|
||||||
|
] output>array f swap <id3v2-info> ;
|
||||||
|
|
||||||
: >28bitword ( seq -- int )
|
: >28bitword ( seq -- int )
|
||||||
0 [ swap 7 shift bitor ] reduce ;
|
0 [ [ 7 shift ] dip bitor ] reduce ; inline
|
||||||
|
|
||||||
: filter-text-data ( data -- filtered )
|
: filter-text-data ( data -- filtered )
|
||||||
[ printable? ] filter ;
|
[ printable? ] filter ; inline
|
||||||
|
|
||||||
! frame details stuff
|
|
||||||
|
|
||||||
: valid-frame-id? ( id -- ? )
|
: valid-frame-id? ( id -- ? )
|
||||||
[ [ digit? ] [ LETTER? ] bi or ] all? ;
|
[ { [ digit? ] [ LETTER? ] } 1|| ] all? ; inline
|
||||||
|
|
||||||
: read-frame-id ( mmap -- id )
|
|
||||||
4 head-slice ;
|
|
||||||
|
|
||||||
: read-frame-size ( mmap -- size )
|
|
||||||
[ 4 8 ] dip subseq ;
|
|
||||||
|
|
||||||
: read-frame-flags ( mmap -- flags )
|
|
||||||
[ 8 10 ] dip subseq ;
|
|
||||||
|
|
||||||
: read-frame-data ( frame mmap -- frame data )
|
: read-frame-data ( frame mmap -- frame data )
|
||||||
[ 10 over size>> 10 + ] dip <slice> filter-text-data ;
|
[ 10 over size>> 10 + ] dip <slice> filter-text-data ; inline
|
||||||
|
|
||||||
! read whole frames
|
: decode-text ( string -- string' )
|
||||||
|
dup 2 short head
|
||||||
|
{ { HEX: ff HEX: fe } { HEX: fe HEX: ff } } member?
|
||||||
|
utf16 ascii ? decode ; inline
|
||||||
|
|
||||||
: (read-frame) ( mmap -- frame )
|
: (read-frame) ( mmap -- frame )
|
||||||
[ <frame> ] dip
|
[ <frame> ] dip
|
||||||
{
|
{
|
||||||
[ read-frame-id utf8 decode >>frame-id ]
|
[ 4 head-slice decode-text >>frame-id ]
|
||||||
[ read-frame-flags >byte-array >>flags ]
|
[ [ 4 8 ] dip subseq >28bitword >>size ]
|
||||||
[ read-frame-size >28bitword >>size ]
|
[ [ 8 10 ] dip subseq >byte-array >>flags ]
|
||||||
[ read-frame-data utf8 decode >>data ]
|
[ read-frame-data decode-text >>data ]
|
||||||
} cleave ;
|
} cleave ;
|
||||||
|
|
||||||
: read-frame ( mmap -- frame/f )
|
: read-frame ( mmap -- frame/f )
|
||||||
dup read-frame-id valid-frame-id? [ (read-frame) ] [ drop f ] if ;
|
dup 4 head-slice valid-frame-id?
|
||||||
|
[ (read-frame) ] [ drop f ] if ;
|
||||||
|
|
||||||
: remove-frame ( mmap frame -- mmap )
|
: remove-frame ( mmap frame -- mmap )
|
||||||
size>> 10 + tail-slice ;
|
size>> 10 + tail-slice ; inline
|
||||||
|
|
||||||
: read-frames ( mmap -- frames )
|
: read-frames ( mmap -- frames )
|
||||||
[ dup read-frame dup ]
|
[ dup read-frame dup ]
|
||||||
[ [ remove-frame ] keep ]
|
[ [ remove-frame ] keep ]
|
||||||
[ drop ] produce nip ;
|
produce 2nip ;
|
||||||
|
|
||||||
! header stuff
|
! header stuff
|
||||||
|
|
||||||
: read-header-supported-version? ( mmap -- ? )
|
: read-v2-header ( seq -- id3header )
|
||||||
3 tail-slice [ { 4 } head? ] [ { 3 } head? ] bi or ;
|
|
||||||
|
|
||||||
: read-header-flags ( mmap -- flags )
|
|
||||||
5 swap nth ;
|
|
||||||
|
|
||||||
: read-header-size ( mmap -- size )
|
|
||||||
[ 6 10 ] dip <slice> >28bitword ;
|
|
||||||
|
|
||||||
: read-v2-header ( mmap -- id3header )
|
|
||||||
[ <header> ] dip
|
[ <header> ] dip
|
||||||
{
|
{
|
||||||
[ read-header-supported-version? >>version ]
|
[ [ 3 5 ] dip <slice> >array >>version ]
|
||||||
[ read-header-flags >>flags ]
|
[ [ 5 ] dip nth >>flags ]
|
||||||
[ read-header-size >>size ]
|
[ [ 6 10 ] dip <slice> >28bitword >>size ]
|
||||||
} cleave ;
|
} cleave ; inline
|
||||||
|
|
||||||
: drop-header ( mmap -- seq1 seq2 )
|
: read-v2-tag-data ( seq -- id3v2-info )
|
||||||
dup 10 tail-slice swap ;
|
10 cut-slice
|
||||||
|
[ read-v2-header ]
|
||||||
: parse-frames ( id3v2-info -- id3-info )
|
[ read-frames ] bi* <id3v2-info> ; inline
|
||||||
[ <id3-info> ] dip frames>>
|
|
||||||
{
|
|
||||||
[ [ frame-id>> "TIT2" = ] find nip [ data>> >>title ] when* ]
|
|
||||||
[ [ frame-id>> "TALB" = ] find nip [ data>> >>album ] when* ]
|
|
||||||
[ [ frame-id>> "TPE1" = ] find nip [ data>> >>artist ] when* ]
|
|
||||||
[ [ frame-id>> "TCON" = ] find nip [ data>> [ [ digit? ] filter string>number ] keep swap [ genres at nip ] when*
|
|
||||||
>>genre ] when* ]
|
|
||||||
[ [ frame-id>> "COMM" = ] find nip [ data>> >>comment ] when* ]
|
|
||||||
[ [ frame-id>> "TYER" = ] find nip [ data>> >>year ] when* ]
|
|
||||||
} cleave ;
|
|
||||||
|
|
||||||
: read-v2-tag-data ( seq -- id3-info )
|
|
||||||
drop-header read-v2-header swap read-frames <id3v2-info> parse-frames ;
|
|
||||||
|
|
||||||
! v1 information
|
! v1 information
|
||||||
|
|
||||||
: skip-to-v1-data ( seq -- seq )
|
: skip-to-v1-data ( seq -- seq ) 125 tail-slice* ; inline
|
||||||
125 tail-slice* ;
|
|
||||||
|
|
||||||
: read-title ( seq -- title )
|
|
||||||
30 head-slice ;
|
|
||||||
|
|
||||||
: read-artist ( seq -- title )
|
|
||||||
[ 30 60 ] dip subseq ;
|
|
||||||
|
|
||||||
: read-album ( seq -- album )
|
|
||||||
[ 60 90 ] dip subseq ;
|
|
||||||
|
|
||||||
: read-year ( seq -- year )
|
|
||||||
[ 90 94 ] dip subseq ;
|
|
||||||
|
|
||||||
: read-comment ( seq -- comment )
|
|
||||||
[ 94 124 ] dip subseq ;
|
|
||||||
|
|
||||||
: read-genre ( seq -- genre )
|
|
||||||
[ 124 ] dip nth ;
|
|
||||||
|
|
||||||
: (read-v1-tag-data) ( seq -- mp3-file )
|
: (read-v1-tag-data) ( seq -- mp3-file )
|
||||||
[ <id3-info> ] dip
|
[ <id3v1-info> ] dip
|
||||||
{
|
{
|
||||||
[ read-title utf8 decode filter-text-data >>title ]
|
[ 30 head-slice decode-text filter-text-data >>title ]
|
||||||
[ read-artist utf8 decode filter-text-data >>artist ]
|
[ [ 30 60 ] dip subseq decode-text filter-text-data >>artist ]
|
||||||
[ read-album utf8 decode filter-text-data >>album ]
|
[ [ 60 90 ] dip subseq decode-text filter-text-data >>album ]
|
||||||
[ read-year utf8 decode filter-text-data >>year ]
|
[ [ 90 94 ] dip subseq decode-text filter-text-data >>year ]
|
||||||
[ read-comment utf8 decode filter-text-data >>comment ]
|
[ [ 94 124 ] dip subseq decode-text filter-text-data >>comment ]
|
||||||
[ read-genre >fixnum genres at >>genre ]
|
[ [ 124 ] dip nth number>string >>genre ]
|
||||||
} cleave ;
|
} cleave ; inline
|
||||||
|
|
||||||
: read-v1-tag-data ( seq -- mp3-file )
|
: read-v1-tag-data ( seq -- mp3-file )
|
||||||
skip-to-v1-data (read-v1-tag-data) ;
|
skip-to-v1-data (read-v1-tag-data) ; inline
|
||||||
|
|
||||||
|
: parse-genre ( string -- n/f )
|
||||||
|
dup "(" ?head-slice drop ")" ?tail-slice drop
|
||||||
|
string>number dup number? [
|
||||||
|
genres ?nth swap or
|
||||||
|
] [
|
||||||
|
drop
|
||||||
|
] if ; inline
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
! public interface
|
: frame-named ( id3 name quot -- obj )
|
||||||
|
[ swap frames>> at* ] dip
|
||||||
|
[ data>> ] prepose [ drop f ] if ; inline
|
||||||
|
|
||||||
: file-id3-tags ( path -- object/f )
|
: id3-title ( id3 -- title/f ) "TIT2" [ ] frame-named ; inline
|
||||||
|
|
||||||
|
: id3-artist ( id3 -- artist/f ) "TPE1" [ ] frame-named ; inline
|
||||||
|
|
||||||
|
: id3-album ( id3 -- album/f ) "TALB" [ ] frame-named ; inline
|
||||||
|
|
||||||
|
: id3-year ( id3 -- year/f ) "TYER" [ ] frame-named ; inline
|
||||||
|
|
||||||
|
: id3-comment ( id3 -- comment/f ) "COMM" [ ] frame-named ; inline
|
||||||
|
|
||||||
|
: id3-genre ( id3 -- genre/f )
|
||||||
|
"TCON" [ parse-genre ] frame-named ; inline
|
||||||
|
|
||||||
|
: id3-frame ( id3 key -- value/f ) [ ] frame-named ; inline
|
||||||
|
|
||||||
|
: file-id3-tags ( path -- id3v2-info/f )
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
{ [ dup id3v2? ] [ read-v2-tag-data ] } ! ( ? -- id3v2 )
|
{ [ dup id3v2? ] [ read-v2-tag-data ] }
|
||||||
{ [ dup id3v1? ] [ read-v1-tag-data ] } ! ( ? -- id3-info )
|
{ [ dup id3v1? ] [ read-v1-tag-data id3v1>id3v2 ] }
|
||||||
[ drop f ] ! ( mmap -- f )
|
[ drop f ]
|
||||||
} cond
|
} cond
|
||||||
] with-mapped-uchar-file ;
|
] with-mapped-uchar-file ;
|
||||||
|
|
||||||
! end
|
|
||||||
|
|
|
@ -166,9 +166,7 @@ M: mach-error error.
|
||||||
IOObjectRelease mach-error ;
|
IOObjectRelease mach-error ;
|
||||||
|
|
||||||
: io-objects-from-iterator* ( i -- i array )
|
: io-objects-from-iterator* ( i -- i array )
|
||||||
[ dup IOIteratorNext dup MACH_PORT_NULL = not ]
|
[ dup IOIteratorNext dup MACH_PORT_NULL = not ] [ ] produce nip ;
|
||||||
[ ]
|
|
||||||
[ drop ] produce ;
|
|
||||||
|
|
||||||
: io-objects-from-iterator ( i -- array )
|
: io-objects-from-iterator ( i -- array )
|
||||||
io-objects-from-iterator* [ release-io-object ] dip ;
|
io-objects-from-iterator* [ release-io-object ] dip ;
|
||||||
|
|
|
@ -152,7 +152,7 @@ M: object handle-inbox
|
||||||
: display ( stream tab -- )
|
: display ( stream tab -- )
|
||||||
'[ _ [ [ t ]
|
'[ _ [ [ t ]
|
||||||
[ _ dup chat>> hear handle-inbox ]
|
[ _ dup chat>> hear handle-inbox ]
|
||||||
[ ] while ] with-output-stream ] "ircv" spawn drop ;
|
while ] with-output-stream ] "ircv" spawn drop ;
|
||||||
|
|
||||||
: <irc-pane> ( tab -- tab pane )
|
: <irc-pane> ( tab -- tab pane )
|
||||||
<scrolling-pane>
|
<scrolling-pane>
|
||||||
|
|
|
@ -4,4 +4,4 @@ USING: kernel math sequences ;
|
||||||
IN: math.text.utils
|
IN: math.text.utils
|
||||||
|
|
||||||
: 3digit-groups ( n -- seq )
|
: 3digit-groups ( n -- seq )
|
||||||
[ dup 0 > ] [ 1000 /mod ] [ ] produce nip ;
|
[ dup 0 > ] [ 1000 /mod ] produce nip ;
|
||||||
|
|
|
@ -82,7 +82,7 @@ SYMBOL: total
|
||||||
: topological-sort ( seq quot -- newseq )
|
: topological-sort ( seq quot -- newseq )
|
||||||
[ >vector [ dup empty? not ] ] dip
|
[ >vector [ dup empty? not ] ] dip
|
||||||
[ dupd maximal-element [ over delete-nth ] dip ] curry
|
[ dupd maximal-element [ over delete-nth ] dip ] curry
|
||||||
[ ] produce nip ; inline
|
produce nip ; inline
|
||||||
|
|
||||||
: classes< ( seq1 seq2 -- lt/eq/gt )
|
: classes< ( seq1 seq2 -- lt/eq/gt )
|
||||||
[
|
[
|
||||||
|
|
|
@ -223,7 +223,7 @@ CONSTANT: otug-slides
|
||||||
}
|
}
|
||||||
{ $slide "Modifiers"
|
{ $slide "Modifiers"
|
||||||
{ $code ": bank ( n -- n )" " readln string>number +" " dup \"Balance: $\" write . ;" }
|
{ $code ": bank ( n -- n )" " readln string>number +" " dup \"Balance: $\" write . ;" }
|
||||||
{ $code "0 [ dup 0 > ] [ bank ] [ ] while" }
|
{ $code "0 [ dup 0 > ] [ bank ] while" }
|
||||||
}
|
}
|
||||||
{ $slide "Modifiers"
|
{ $slide "Modifiers"
|
||||||
{ $code "0 [ dup 0 > ] [ bank ] [ ] do while" }
|
{ $code "0 [ dup 0 > ] [ bank ] [ ] do while" }
|
||||||
|
|
|
@ -41,7 +41,7 @@ PRIVATE>
|
||||||
! -------------------
|
! -------------------
|
||||||
|
|
||||||
: fib-upto* ( n -- seq )
|
: fib-upto* ( n -- seq )
|
||||||
0 1 [ pick over >= ] [ tuck + dup ] [ ] produce [ 3drop ] dip
|
0 1 [ pick over >= ] [ tuck + dup ] produce [ 3drop ] dip
|
||||||
but-last-slice { 0 1 } prepend ;
|
but-last-slice { 0 1 } prepend ;
|
||||||
|
|
||||||
: euler002a ( -- answer )
|
: euler002a ( -- answer )
|
||||||
|
|
|
@ -34,7 +34,7 @@ IN: project-euler.012
|
||||||
! --------
|
! --------
|
||||||
|
|
||||||
: euler012 ( -- answer )
|
: euler012 ( -- answer )
|
||||||
8 [ dup nth-triangle tau* 500 < ] [ 1+ ] [ ] while nth-triangle ;
|
8 [ dup nth-triangle tau* 500 < ] [ 1+ ] while nth-triangle ;
|
||||||
|
|
||||||
! [ euler012 ] 10 ave-time
|
! [ euler012 ] 10 ave-time
|
||||||
! 6573 ms ave run time - 346.27 SD (10 trials)
|
! 6573 ms ave run time - 346.27 SD (10 trials)
|
||||||
|
|
|
@ -43,7 +43,7 @@ IN: project-euler.014
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: collatz ( n -- seq )
|
: collatz ( n -- seq )
|
||||||
[ [ dup 1 > ] [ dup , next-collatz ] [ ] while , ] { } make ;
|
[ [ dup 1 > ] [ dup , next-collatz ] while , ] { } make ;
|
||||||
|
|
||||||
: euler014 ( -- answer )
|
: euler014 ( -- answer )
|
||||||
1000000 [1,b] 0 [ collatz longest ] reduce first ;
|
1000000 [1,b] 0 [ collatz longest ] reduce first ;
|
||||||
|
|
|
@ -53,7 +53,7 @@ IN: project-euler.019
|
||||||
: first-days ( end-date start-date -- days )
|
: first-days ( end-date start-date -- days )
|
||||||
[ 2dup after=? ]
|
[ 2dup after=? ]
|
||||||
[ dup 1 months time+ swap day-of-week ]
|
[ dup 1 months time+ swap day-of-week ]
|
||||||
[ ] produce 2nip ;
|
produce 2nip ;
|
||||||
|
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ IN: project-euler.071
|
||||||
PRIVATE>
|
PRIVATE>
|
||||||
|
|
||||||
: euler071 ( -- answer )
|
: euler071 ( -- answer )
|
||||||
2/5 [ dup denominator 1000000 <= ] [ 3/7 mediant dup ] [ ] produce
|
2/5 [ dup denominator 1000000 <= ] [ 3/7 mediant dup ] produce
|
||||||
nip penultimate numerator ;
|
nip penultimate numerator ;
|
||||||
|
|
||||||
! [ euler071 ] 100 ave-time
|
! [ euler071 ] 100 ave-time
|
||||||
|
|
|
@ -26,7 +26,7 @@ IN: project-euler.100
|
||||||
: euler100 ( -- answer )
|
: euler100 ( -- answer )
|
||||||
1 1
|
1 1
|
||||||
[ dup dup 1- * 2 * 10 24 ^ <= ]
|
[ dup dup 1- * 2 * 10 24 ^ <= ]
|
||||||
[ tuck 6 * swap - 2 - ] [ ] while nip ;
|
[ tuck 6 * swap - 2 - ] while nip ;
|
||||||
|
|
||||||
! TODO: solution needs generalization
|
! TODO: solution needs generalization
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ IN: project-euler.148
|
||||||
dup 1+ * 2/ ; inline
|
dup 1+ * 2/ ; inline
|
||||||
|
|
||||||
: >base7 ( x -- y )
|
: >base7 ( x -- y )
|
||||||
[ dup 0 > ] [ 7 /mod ] [ ] produce nip ;
|
[ dup 0 > ] [ 7 /mod ] produce nip ;
|
||||||
|
|
||||||
: (use-digit) ( prev x index -- next )
|
: (use-digit) ( prev x index -- next )
|
||||||
[ [ 1+ * ] [ sum-1toN 7 sum-1toN ] bi ] dip ^ * + ;
|
[ [ 1+ * ] [ sum-1toN 7 sum-1toN ] bi ] dip ^ * + ;
|
||||||
|
|
|
@ -72,7 +72,7 @@ PRIVATE>
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: number>digits ( n -- seq )
|
: number>digits ( n -- seq )
|
||||||
[ dup 0 = not ] [ 10 /mod ] [ ] produce reverse nip ;
|
[ dup 0 = not ] [ 10 /mod ] produce reverse nip ;
|
||||||
|
|
||||||
: nth-triangle ( n -- n )
|
: nth-triangle ( n -- n )
|
||||||
dup 1+ * 2 / ;
|
dup 1+ * 2 / ;
|
||||||
|
|
|
@ -37,5 +37,18 @@
|
||||||
(autoload 'fuel-scaffold-help "fuel-scaffold.el"
|
(autoload 'fuel-scaffold-help "fuel-scaffold.el"
|
||||||
"Create a Factor vocabulary help file." t)
|
"Create a Factor vocabulary help file." t)
|
||||||
|
|
||||||
|
(mapc (lambda (group)
|
||||||
|
(custom-add-load group (symbol-name group))
|
||||||
|
(custom-add-load 'fuel (symbol-name group)))
|
||||||
|
'(fuel fuel-faces
|
||||||
|
factor-mode
|
||||||
|
fuel-autodoc
|
||||||
|
fuel-stack
|
||||||
|
fuel-help
|
||||||
|
fuel-xref
|
||||||
|
fuel-listener
|
||||||
|
fuel-scaffold
|
||||||
|
fuel-debug
|
||||||
|
fuel-mode))
|
||||||
|
|
||||||
;;; fu.el ends here
|
;;; fu.el ends here
|
||||||
|
|
|
@ -59,6 +59,35 @@ buffer."
|
||||||
:type 'boolean
|
:type 'boolean
|
||||||
:group 'fuel-listener)
|
:group 'fuel-listener)
|
||||||
|
|
||||||
|
(defcustom fuel-listener-history-filename (expand-file-name "~/.fuel_history")
|
||||||
|
"File where listener input history is saved, so that it persists between sessions."
|
||||||
|
:type 'filename
|
||||||
|
:group 'fuel-listener)
|
||||||
|
|
||||||
|
(defcustom fuel-listener-history-size comint-input-ring-size
|
||||||
|
"Maximum size of the saved listener input history."
|
||||||
|
:type 'integer
|
||||||
|
:group 'fuel-listener)
|
||||||
|
|
||||||
|
|
||||||
|
;;; Listener history:
|
||||||
|
|
||||||
|
(defun fuel-listener--sentinel (proc event)
|
||||||
|
(when (string= event "finished\n")
|
||||||
|
(with-current-buffer (process-buffer proc)
|
||||||
|
(let ((comint-input-ring-file-name fuel-listener-history-filename))
|
||||||
|
(comint-write-input-ring)
|
||||||
|
(when (buffer-name (current-buffer))
|
||||||
|
(insert "\nBye bye. It's been nice listening to you!\n")
|
||||||
|
(insert "Press C-cz to bring me back.\n" ))))))
|
||||||
|
|
||||||
|
(defun fuel-listener--history-setup ()
|
||||||
|
(set (make-local-variable 'comint-input-ring-file-name) fuel-listener-history-filename)
|
||||||
|
(set (make-local-variable 'comint-input-ring-size) fuel-listener-history-size)
|
||||||
|
(add-hook 'kill-buffer-hook 'comint-write-input-ring nil t)
|
||||||
|
(comint-read-input-ring t)
|
||||||
|
(set-process-sentinel (get-buffer-process (current-buffer)) 'fuel-listener--sentinel))
|
||||||
|
|
||||||
|
|
||||||
;;; Fuel listener buffer/process:
|
;;; Fuel listener buffer/process:
|
||||||
|
|
||||||
|
@ -84,7 +113,8 @@ buffer."
|
||||||
(pop-to-buffer (fuel-listener--buffer))
|
(pop-to-buffer (fuel-listener--buffer))
|
||||||
(make-comint-in-buffer "fuel listener" (current-buffer) factor nil
|
(make-comint-in-buffer "fuel listener" (current-buffer) factor nil
|
||||||
"-run=listener" (format "-i=%s" image))
|
"-run=listener" (format "-i=%s" image))
|
||||||
(fuel-listener--wait-for-prompt 10000)
|
(fuel-listener--wait-for-prompt 60000)
|
||||||
|
(fuel-listener--history-setup)
|
||||||
(fuel-con--setup-connection (current-buffer))))
|
(fuel-con--setup-connection (current-buffer))))
|
||||||
|
|
||||||
(defun fuel-listener--connect-process (port)
|
(defun fuel-listener--connect-process (port)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue