handbook updates, HTML-format changelog
parent
3956f12627
commit
50eeb1db28
|
@ -0,0 +1,113 @@
|
||||||
|
<html>
|
||||||
|
<head><title>Factor change log</title></head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>Factor 0.76:</h1>
|
||||||
|
<!-- :noWordSep=+-*\=><;.?/'()%,_|: -->
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Major improvements to the GUI:
|
||||||
|
<ul>
|
||||||
|
<li>Now uses 3-dimensional co-ordinates throughout</li>
|
||||||
|
<li>The listener supports styled text output and presentations</li>
|
||||||
|
<li>Gradient paint, bevel border paint</li>
|
||||||
|
<li>Wheel mouse scrolling</li>
|
||||||
|
<li>Slide-show tutorial with live code examples</li>
|
||||||
|
<li>Performance improvements, code cleanups, bug fixes</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Sequences:
|
||||||
|
<ul>
|
||||||
|
<li>The following formely list-specific words are now generic:
|
||||||
|
|
||||||
|
<pre>all? ( seq quot -- ? | quot: elt -- ? )
|
||||||
|
all-with? ( obj seq quot -- ? | quot: elt -- ? )
|
||||||
|
subset ( seq quot -- seq | quot: elt -- ? )
|
||||||
|
subset-with ( obj seq quot -- seq | quot: obj elt -- ? )
|
||||||
|
fiber? ( seq quot -- ? | quot: elt elt -- ? )
|
||||||
|
prune ( seq -- seq )</pre>
|
||||||
|
|
||||||
|
<li> The <code>contains?</code> word for testing membership in a sequence has been
|
||||||
|
renamed to <code>member? ( elt seq -- ? )</code>.
|
||||||
|
|
||||||
|
<li> The list-specific <code>some?</code> and <code>some-with?</code> combinators are gone. Their replacements are generic:
|
||||||
|
|
||||||
|
<pre>contains? ( seq quot -- ? | quot: elt -- ? )
|
||||||
|
contains-with? ( obj seq quot -- ? | quot: obj elt -- ? )
|
||||||
|
find ( seq quot -- i elt | quot: elt -- ? )
|
||||||
|
find* ( i seq quot -- i elt | quot: elt -- ? )
|
||||||
|
find-with ( obj seq quot -- i elt | quot: elt -- ? )
|
||||||
|
find-with* ( obj i seq quot -- i elt | quot: elt -- ? )</pre>
|
||||||
|
|
||||||
|
See the developer's handbook for details.
|
||||||
|
|
||||||
|
<li> The <code>nreverse ( seq -- )</code> word has been removed.
|
||||||
|
|
||||||
|
<li> <code>reverse-slice ( seq -- seq )</code> outputs a new sequence that shares
|
||||||
|
structure with the given sequence, but presents elements in reverse
|
||||||
|
order.
|
||||||
|
|
||||||
|
<li> The <code>string-compare</code> primitive has been replaced with the lexi word
|
||||||
|
which now operates on any pair of sequences of numbers. The
|
||||||
|
string> word has been replaced with <code>>lexi></code>.
|
||||||
|
|
||||||
|
<li> The <code>,</code> word no longer accepts a string as input inside a <code>make-string</code>. In 0.75, the following
|
||||||
|
two lines were equivalent:
|
||||||
|
|
||||||
|
<pre>[ "Hello" , " world" , ] make-string
|
||||||
|
[ "Hello" % " world" % ] make-string</pre>
|
||||||
|
|
||||||
|
<li> Now, the former raises a type error. Use <code>,</code> with characters, and <code>%</code> with
|
||||||
|
strings inside make-string.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li>Streams:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>The following words have been renamed:
|
||||||
|
|
||||||
|
<pre>stream-auto-flush ==> stream-finish ( stream -- )
|
||||||
|
stream-write-attr ==> stream-format ( string style stream -- )
|
||||||
|
write-attr ==> format ( string style -- )</pre>
|
||||||
|
|
||||||
|
<li>The following words no longer accept character arguments:
|
||||||
|
|
||||||
|
<pre>stream-format ( string style stream -- )
|
||||||
|
format ( string style -- )
|
||||||
|
stream-write ( string stream -- )
|
||||||
|
write ( string -- )
|
||||||
|
stream-print ( string -- )
|
||||||
|
print ( string -- )</pre>
|
||||||
|
|
||||||
|
<li>Use the new words to write characters:
|
||||||
|
|
||||||
|
<pre>stream-write1 ( char stream -- )
|
||||||
|
write1 ( char -- )</pre>
|
||||||
|
|
||||||
|
Note that <code>stream-write1</code> is generic and your stream must implement it.
|
||||||
|
|
||||||
|
<li><code>with-string</code> word renamed to <code>string-out ( quot -- string )</code>
|
||||||
|
|
||||||
|
<li>New <code>string-in ( string quot -- )</code> word, calls <code>quot</code> with <code>stdio</code> bound to
|
||||||
|
a stream that reads from the given string.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<li>Many improvements to the matrices library.
|
||||||
|
|
||||||
|
<li>Improved inspector. Call it with <code>inspect ( obj -- )</code>.
|
||||||
|
|
||||||
|
<li>The number of generations used for garbage collection can now be set
|
||||||
|
with the +G command line switch. You must specify at least 2
|
||||||
|
generations.
|
||||||
|
|
||||||
|
<li>Only 2 generations are used by default now, since there seems to be no
|
||||||
|
performance benefit to having 3 after running some brief benchmarks.
|
||||||
|
|
||||||
|
<li>Fixed bug where images saved from the jEdit plugin would fail to
|
||||||
|
start.
|
||||||
|
|
||||||
|
<li>md5 hashing algorithm in <code>contrib/crypto/</code> (Doug Coleman).
|
||||||
|
|
||||||
|
</ul>
|
191
CHANGES.txt
191
CHANGES.txt
|
@ -1,191 +0,0 @@
|
||||||
Factor 0.76:
|
|
||||||
------------
|
|
||||||
|
|
||||||
- Major improvements to the GUI:
|
|
||||||
|
|
||||||
- The listener supports styled text output and presentations
|
|
||||||
- Gradient paint, bevel border paint
|
|
||||||
- Wheel mouse scrolling
|
|
||||||
- Slide-show tutorial with live code examples
|
|
||||||
- Performance improvements, code cleanups, bug fixes
|
|
||||||
|
|
||||||
- The following formely list-specific words are now generic:
|
|
||||||
|
|
||||||
all? all-with? subset subset-with fiber? prune
|
|
||||||
|
|
||||||
- The contains? word for testing membership in a sequence has been
|
|
||||||
renamed to member?.
|
|
||||||
|
|
||||||
- The some? and some-with? combinators are gone. Their replacements
|
|
||||||
are contains?, contains-with?, find, find*, find-with, and find-with*.
|
|
||||||
See the documentation for details.
|
|
||||||
|
|
||||||
- The nreverse word has been removed.
|
|
||||||
|
|
||||||
- The , word no longer accepts a string as input. Formely, the following
|
|
||||||
two lines were equivalent:
|
|
||||||
|
|
||||||
[ "Hello" , " world" , ] make-string
|
|
||||||
[ "Hello" % " world" % ] make-string
|
|
||||||
|
|
||||||
Now, the former raises a type error.
|
|
||||||
|
|
||||||
- The string-compare primitive has been replaced with the lexi word
|
|
||||||
which now operates on any pair of sequences of numbers. The
|
|
||||||
string> word has been replaced with lexi>.
|
|
||||||
|
|
||||||
- The stream-write, stream-write-attr, write and write-attr generic
|
|
||||||
words no longer accept a character as an argument. Use the new
|
|
||||||
stream-write1 and write1 generic words to write single characters.
|
|
||||||
|
|
||||||
- reverse-slice ( seq -- seq ) outputs a new sequence that shares
|
|
||||||
structure with the given sequence, but presents elements in reverse
|
|
||||||
order.
|
|
||||||
|
|
||||||
- Many improvements to the matrices library.
|
|
||||||
|
|
||||||
- with-string word renamed to string-out ( quot -- string )
|
|
||||||
|
|
||||||
- new string-in ( string quot -- ) word, calls quot with stdio bound to
|
|
||||||
a stream that reads from the given string.
|
|
||||||
|
|
||||||
- Improved inspector. Call it with inspect ( obj -- ).
|
|
||||||
|
|
||||||
- The number of generations used for garbage collection can now be set
|
|
||||||
with the +G command line switch. You must specify at least 2
|
|
||||||
generations.
|
|
||||||
|
|
||||||
- Only 2 generations are used by default now, since there seems to be no
|
|
||||||
performance benefit to having 3 after running some brief benchmarks.
|
|
||||||
|
|
||||||
- Fixed bug where images saved from the jEdit plugin would fail to
|
|
||||||
start.
|
|
||||||
|
|
||||||
- md5 hashing algorithm in contrib/crypto/ (Doug Coleman).
|
|
||||||
|
|
||||||
Factor 0.75:
|
|
||||||
------------
|
|
||||||
|
|
||||||
+ Runtime and core library
|
|
||||||
|
|
||||||
- Fix for a fatal bug where Factor was not functional on Mac OS X 10.4.
|
|
||||||
|
|
||||||
- Client sockets were not functional on Linux.
|
|
||||||
|
|
||||||
- New generational garbage collector. There are two command line
|
|
||||||
switches for controlling it:
|
|
||||||
|
|
||||||
+Yn Size of 2 youngest generations, megabytes
|
|
||||||
+An Size of tenured and semi-spaces, megabytes
|
|
||||||
|
|
||||||
- Generic words can now dispatch on stack elements other than the top
|
|
||||||
one; define your generic like this to dispatch on the second element:
|
|
||||||
|
|
||||||
G: foo [ over ] [ type ] ;
|
|
||||||
|
|
||||||
Or this for the third:
|
|
||||||
|
|
||||||
G: foo [ pick ] [ type ] ;
|
|
||||||
|
|
||||||
Note that GENERIC: foo is the same as
|
|
||||||
|
|
||||||
G: foo [ dup ] [ type ] ;
|
|
||||||
|
|
||||||
- Sequence API refactoring, as described in
|
|
||||||
http://www.jroller.com/page/slava/20050518.
|
|
||||||
|
|
||||||
- The SO_OOBINLINE socket flag is now set. In 0.74, sending out-of-band
|
|
||||||
data could fill up the buffer and cause a denial-of-service attack.
|
|
||||||
|
|
||||||
- You can now set timeouts for I/O operations with the set-timeout
|
|
||||||
generic word. The HTTP server sets a timeout of 60 seconds for client
|
|
||||||
requests.
|
|
||||||
|
|
||||||
- Improved the words for doing binary I/O; see library/io/binary.factor
|
|
||||||
and the section in the handbook on binary I/O.
|
|
||||||
|
|
||||||
+ Compiler
|
|
||||||
|
|
||||||
- The compiler now does constant folding for certain words with literal
|
|
||||||
operands. The compiler's peephole optimizer has been improved.
|
|
||||||
|
|
||||||
- The alien interface now supports "float" and "double" types, and
|
|
||||||
arrays of C types.
|
|
||||||
|
|
||||||
- New short-hand syntax for defining words that alien-invoke
|
|
||||||
(Alex Chapman).
|
|
||||||
|
|
||||||
LIBRARY: gl
|
|
||||||
FUNCTION: void glTranslatef ( GLfloat x, GLfloat y, GLfloat z ) ;
|
|
||||||
|
|
||||||
should be the same as doing:
|
|
||||||
|
|
||||||
: glTranslatef ( x y z -- )
|
|
||||||
"void" "gl" "glTranslatef"
|
|
||||||
[ "GLfloat" "GLfloat" "GLfloat" ] alien-invoke ;
|
|
||||||
\ glTranslatef compile
|
|
||||||
|
|
||||||
+ Framework
|
|
||||||
|
|
||||||
- OpenGL binding in contrib/gl/ (Alex Chapman).
|
|
||||||
|
|
||||||
- PostgreSQL binding in contrib/postgresql/ (Doug Coleman).
|
|
||||||
|
|
||||||
- HTTP server now supports virtual hosting.
|
|
||||||
|
|
||||||
- The Factor plugin now supports connecting to Factor instances on
|
|
||||||
arbitrary host and port names. This allows interactive development on
|
|
||||||
one machine while testing on another. A new command was added to
|
|
||||||
evaluate the word definition at the caret in the listener.
|
|
||||||
|
|
||||||
Factor 0.74:
|
|
||||||
------------
|
|
||||||
|
|
||||||
C library interface ported to Linux/PPC and Mac OS X.
|
|
||||||
|
|
||||||
Developer's handbook rewritten to be more up to date and complete.
|
|
||||||
|
|
||||||
Added the sequences vocabulary that unifies code for working with lists,
|
|
||||||
vectors, strings, and string buffers. There are many changes, and most
|
|
||||||
of the old type-specific words such as vector-nth and string-map are
|
|
||||||
gone.
|
|
||||||
|
|
||||||
Added the matrices vocabulary for working with mathematical vectors and
|
|
||||||
matrices.
|
|
||||||
|
|
||||||
Added two words for modular arithmetic in the math vocabulary: mod-inv
|
|
||||||
and ^mod.
|
|
||||||
|
|
||||||
Added HTTP client API supporting GET and POST requests in the
|
|
||||||
http-client vocabulary.
|
|
||||||
|
|
||||||
Removed some inspection words: vocabs. words. usages. Now, just put a
|
|
||||||
space before the . and write vocabs . words . usages .
|
|
||||||
|
|
||||||
Redefining words that are used by compiled words automatically
|
|
||||||
decompiles the compiled words. This fixes the problem of new definitions
|
|
||||||
not taking effect. In a future release, there will be automatic
|
|
||||||
recompilation, rather than decompilation.
|
|
||||||
|
|
||||||
As a result of the previous change, there is now a cross-referencing
|
|
||||||
database, and the usages word lists indirect dependencies and is much
|
|
||||||
faster. The usage word behaves like the old usages, and lists direct
|
|
||||||
dependencies only.
|
|
||||||
|
|
||||||
The dump word in the dump vocabulary prints the memory bytes comprising
|
|
||||||
an object. The dump* word prints the bytes at an arbitrary address.
|
|
||||||
|
|
||||||
New words in words vocabulary for inspecting classes and methods:
|
|
||||||
classes implements.
|
|
||||||
|
|
||||||
The Unix I/O code was rewritten in Factor using the C library interface.
|
|
||||||
Many new features will be added in future releases, such as socket
|
|
||||||
timeouts and Unicode character encodings.
|
|
||||||
|
|
||||||
Lazy lists and parser combinators library in contrib/parser-combinators/
|
|
||||||
(Chris Double).
|
|
||||||
|
|
||||||
Quotations containing \ foo are prettyprinted in that form.
|
|
||||||
|
|
||||||
The watch word now causes annotated words to dump the stack, in addition
|
|
||||||
to printing a log message.
|
|
|
@ -3872,7 +3872,7 @@ String buffers support the stream output protocol. See \ref{stdio}.
|
||||||
\glossary{name=input stream,
|
\glossary{name=input stream,
|
||||||
description={a stream that implements the \texttt{stream-readln} and \texttt{stream-read} generic words and can be used for character input}}
|
description={a stream that implements the \texttt{stream-readln} and \texttt{stream-read} generic words and can be used for character input}}
|
||||||
\glossary{name=output stream,
|
\glossary{name=output stream,
|
||||||
description={a stream that implements the \texttt{stream-write-attr}, \texttt{stream-flush} and \texttt{stream-auto-flush} generic words and can be used for character output}}
|
description={a stream that implements the \texttt{stream-write-attr}, \texttt{stream-flush} and \texttt{stream-finish} generic words and can be used for character output}}
|
||||||
|
|
||||||
There are various subsets of the stream protocol that a class can implement so that its instances may be used as streams. The following generic word is mandatory.
|
There are various subsets of the stream protocol that a class can implement so that its instances may be used as streams. The following generic word is mandatory.
|
||||||
|
|
||||||
|
@ -3926,11 +3926,11 @@ Ensures all pending output operations are been complete. With many output stream
|
||||||
|
|
||||||
\wordtable{
|
\wordtable{
|
||||||
\vocabulary{io}
|
\vocabulary{io}
|
||||||
\genericword{stream-auto-flush}{stream-auto-flush ( s -- )}
|
\genericword{stream-finish}{stream-finish ( s -- )}
|
||||||
}
|
}
|
||||||
Ensures the user sees prior output. It is not as strong as \texttt{stream-flush}. The contract is as follows: if the stream is connected to an interactive end-point such as a terminal, \texttt{stream-auto-flush} should execute \texttt{stream-flush}. If the stream is a file or network stream used for ``batch'' operations, this word should have an empty definition.
|
Ensures the user sees prior output. It is not as strong as \texttt{stream-flush}. The contract is as follows: if the stream is connected to an interactive end-point such as a terminal, \texttt{stream-finish} should execute \texttt{stream-flush}. If the stream is a file or network stream used for ``batch'' operations, this word should have an empty definition.
|
||||||
|
|
||||||
The \texttt{stream-print} word executes \texttt{stream-auto-flush} after each line of output.
|
The \texttt{stream-print} word executes \texttt{stream-finish} after each line of output.
|
||||||
|
|
||||||
With some streams, the above operations may suspend the current thread and execute other threads until input data is available (\ref{threads}).
|
With some streams, the above operations may suspend the current thread and execute other threads until input data is available (\ref{threads}).
|
||||||
|
|
||||||
|
@ -3951,7 +3951,7 @@ Outputs a string to the stream, without any specific style information. Implemen
|
||||||
\vocabulary{io}
|
\vocabulary{io}
|
||||||
\ordinaryword{stream-print}{stream-print ( string stream -- )}
|
\ordinaryword{stream-print}{stream-print ( string stream -- )}
|
||||||
}
|
}
|
||||||
Outputs a string to the stream, followed by a newline, then executes \texttt{stream-auto-flush} to force the line to be displayed on interactive streams.
|
Outputs a string to the stream, followed by a newline, then executes \texttt{stream-finish} to force the line to be displayed on interactive streams.
|
||||||
|
|
||||||
\section{The default stream}\label{stdio}
|
\section{The default stream}\label{stdio}
|
||||||
\glossary{name=default stream,
|
\glossary{name=default stream,
|
||||||
|
|
|
@ -83,7 +83,7 @@ M: object find ( seq quot -- i elt )
|
||||||
#! ForAll(P in X) <==> !Exists(!P in X)
|
#! ForAll(P in X) <==> !Exists(!P in X)
|
||||||
swap [ swap call not ] contains-with? not ; inline
|
swap [ swap call not ] contains-with? not ; inline
|
||||||
|
|
||||||
: all-with? ( obj list pred -- ? )
|
: all-with? ( obj seq quot -- ? | quot: elt -- ? )
|
||||||
swap [ with rot ] all? 2nip ; inline
|
swap [ with rot ] all? 2nip ; inline
|
||||||
|
|
||||||
: subset ( seq quot -- seq | quot: elt -- ? )
|
: subset ( seq quot -- seq | quot: elt -- ? )
|
||||||
|
@ -99,7 +99,7 @@ M: object find ( seq quot -- i elt )
|
||||||
] each drop
|
] each drop
|
||||||
] keep like ; inline
|
] keep like ; inline
|
||||||
|
|
||||||
: subset-with ( obj list quot -- list )
|
: subset-with ( obj seq quot -- seq | quot: obj elt -- ? )
|
||||||
swap [ with rot ] subset 2nip ; inline
|
swap [ with rot ] subset 2nip ; inline
|
||||||
|
|
||||||
: fiber? ( seq quot -- ? | quot: elt elt -- ? )
|
: fiber? ( seq quot -- ? | quot: elt elt -- ? )
|
||||||
|
|
|
@ -7,7 +7,7 @@ USING: errors generic kernel math math-internals strings vectors ;
|
||||||
|
|
||||||
! Sequences support the following protocol. Concrete examples
|
! Sequences support the following protocol. Concrete examples
|
||||||
! are strings, string buffers, vectors, and arrays. Arrays are
|
! are strings, string buffers, vectors, and arrays. Arrays are
|
||||||
! low level and not bounds-checked; they are in the
|
! low level and no | quot: elt -- ? t bounds-checked; they are in the
|
||||||
! kernel-internals vocabulary, so don't use them unless you have
|
! kernel-internals vocabulary, so don't use them unless you have
|
||||||
! a good reason.
|
! a good reason.
|
||||||
|
|
||||||
|
@ -41,16 +41,16 @@ G: each ( seq quot -- | quot: elt -- )
|
||||||
G: 2map ( seq seq quot -- seq | quot: elt elt -- elt )
|
G: 2map ( seq seq quot -- seq | quot: elt elt -- elt )
|
||||||
[ over ] [ type ] ; inline
|
[ over ] [ type ] ; inline
|
||||||
|
|
||||||
G: find ( seq quot -- i elt )
|
G: find ( seq quot -- i elt | quot: elt -- ? )
|
||||||
[ over ] [ type ] ; inline
|
[ over ] [ type ] ; inline
|
||||||
|
|
||||||
: find-with ( obj seq quot -- i elt )
|
: find-with ( obj seq quot -- i elt | quot: elt -- ? )
|
||||||
swap [ with rot ] find 2swap 2drop ; inline
|
swap [ with rot ] find 2swap 2drop ; inline
|
||||||
|
|
||||||
G: find* ( i seq quot -- i elt )
|
G: find* ( i seq quot -- i elt | quot: elt -- ? )
|
||||||
[ over ] [ type ] ; inline
|
[ over ] [ type ] ; inline
|
||||||
|
|
||||||
: find-with* ( obj i seq quot -- i elt )
|
: find-with* ( obj i seq quot -- i elt | quot: elt -- ? )
|
||||||
-rot [ with rot ] find* 2swap 2drop ; inline
|
-rot [ with rot ] find* 2swap 2drop ; inline
|
||||||
|
|
||||||
: first 0 swap nth ; inline
|
: first 0 swap nth ; inline
|
||||||
|
|
|
@ -106,7 +106,7 @@ M: html-stream stream-write1 ( char stream -- )
|
||||||
dup html-entities assoc [ write ] [ write1 ] ?ifte
|
dup html-entities assoc [ write ] [ write1 ] ?ifte
|
||||||
] with-wrapper ;
|
] with-wrapper ;
|
||||||
|
|
||||||
M: html-stream stream-write-attr ( str style stream -- )
|
M: html-stream stream-format ( str style stream -- )
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
|
|
|
@ -21,7 +21,7 @@ io strings unparser ;
|
||||||
: read-response ( -- code header )
|
: read-response ( -- code header )
|
||||||
#! After sending a GET oR POST we read a response line and
|
#! After sending a GET oR POST we read a response line and
|
||||||
#! header.
|
#! header.
|
||||||
flush read-line parse-response read-header ;
|
flush readln parse-response read-header ;
|
||||||
|
|
||||||
: http-request ( host resource method -- )
|
: http-request ( host resource method -- )
|
||||||
write CHAR: \s write write " HTTP/1.0" write crlf
|
write CHAR: \s write write " HTTP/1.0" write crlf
|
||||||
|
|
|
@ -7,7 +7,7 @@ io strings unparser ;
|
||||||
": " split1 dup [ cons swons ] [ 2drop ] ifte ;
|
": " split1 dup [ cons swons ] [ 2drop ] ifte ;
|
||||||
|
|
||||||
: (read-header) ( alist -- alist )
|
: (read-header) ( alist -- alist )
|
||||||
read-line dup
|
readln dup
|
||||||
empty? [ drop ] [ header-line (read-header) ] ifte ;
|
empty? [ drop ] [ header-line (read-header) ] ifte ;
|
||||||
|
|
||||||
: read-header ( -- alist )
|
: read-header ( -- alist )
|
||||||
|
|
|
@ -52,7 +52,7 @@ sequences ;
|
||||||
: httpd-client ( socket -- )
|
: httpd-client ( socket -- )
|
||||||
dup log-client [
|
dup log-client [
|
||||||
60000 stdio get set-timeout
|
60000 stdio get set-timeout
|
||||||
read-line [ parse-request ] when*
|
readln [ parse-request ] when*
|
||||||
] with-stream ;
|
] with-stream ;
|
||||||
|
|
||||||
: httpd-connection ( socket -- )
|
: httpd-connection ( socket -- )
|
||||||
|
|
|
@ -15,7 +15,7 @@ TUPLE: c-stream in out flush? ;
|
||||||
M: c-stream stream-write1 ( char stream -- )
|
M: c-stream stream-write1 ( char stream -- )
|
||||||
>r ch>string r> c-stream-out fwrite ;
|
>r ch>string r> c-stream-out fwrite ;
|
||||||
|
|
||||||
M: c-stream stream-write-attr ( str style stream -- )
|
M: c-stream stream-format ( str style stream -- )
|
||||||
nip c-stream-out fwrite ;
|
nip c-stream-out fwrite ;
|
||||||
|
|
||||||
M: c-stream stream-read1 ( stream -- char/f )
|
M: c-stream stream-read1 ( stream -- char/f )
|
||||||
|
|
|
@ -11,7 +11,7 @@ sequences strings unparser ;
|
||||||
: file-icon. directory? dir-icon file-icon ? write-icon ;
|
: file-icon. directory? dir-icon file-icon ? write-icon ;
|
||||||
|
|
||||||
: file-link. ( dir name -- )
|
: file-link. ( dir name -- )
|
||||||
tuck path+ "file" swons unit write-attr ;
|
tuck path+ "file" swons unit format ;
|
||||||
|
|
||||||
: file. ( dir name -- )
|
: file. ( dir name -- )
|
||||||
#! If "doc-root" set, create links relative to it.
|
#! If "doc-root" set, create links relative to it.
|
||||||
|
|
|
@ -23,8 +23,8 @@ M: duplex-stream stream-read
|
||||||
M: duplex-stream stream-write1
|
M: duplex-stream stream-write1
|
||||||
duplex-stream-out stream-write1 ;
|
duplex-stream-out stream-write1 ;
|
||||||
|
|
||||||
M: duplex-stream stream-write-attr
|
M: duplex-stream stream-format
|
||||||
duplex-stream-out stream-write-attr ;
|
duplex-stream-out stream-format ;
|
||||||
|
|
||||||
M: duplex-stream stream-close
|
M: duplex-stream stream-close
|
||||||
#! The output stream is closed first, in case both streams
|
#! The output stream is closed first, in case both streams
|
||||||
|
|
|
@ -9,16 +9,16 @@ C: line-reader ( stream -- line ) [ set-delegate ] keep ;
|
||||||
|
|
||||||
: cr> dup line-reader-cr f rot set-line-reader-cr ;
|
: cr> dup line-reader-cr f rot set-line-reader-cr ;
|
||||||
|
|
||||||
: (read-line) ( ? line -- ? )
|
: (readln) ( ? line -- ? )
|
||||||
#! The flag is set after the first character is read.
|
#! The flag is set after the first character is read.
|
||||||
dup delegate stream-read1 dup [
|
dup delegate stream-read1 dup [
|
||||||
>r >r drop t r> r> dup CHAR: \r = [
|
>r >r drop t r> r> dup CHAR: \r = [
|
||||||
drop t swap set-line-reader-cr
|
drop t swap set-line-reader-cr
|
||||||
] [
|
] [
|
||||||
dup CHAR: \n = [
|
dup CHAR: \n = [
|
||||||
drop dup cr> [ (read-line) ] [ drop ] ifte
|
drop dup cr> [ (readln) ] [ drop ] ifte
|
||||||
] [
|
] [
|
||||||
, (read-line)
|
, (readln)
|
||||||
] ifte
|
] ifte
|
||||||
] ifte
|
] ifte
|
||||||
] [
|
] [
|
||||||
|
@ -26,7 +26,7 @@ C: line-reader ( stream -- line ) [ set-delegate ] keep ;
|
||||||
] ifte ;
|
] ifte ;
|
||||||
|
|
||||||
M: line-reader stream-readln ( line -- string )
|
M: line-reader stream-readln ( line -- string )
|
||||||
[ f swap (read-line) ] make-string
|
[ f swap (readln) ] make-string
|
||||||
dup empty? [ f ? ] [ nip ] ifte ;
|
dup empty? [ f ? ] [ nip ] ifte ;
|
||||||
|
|
||||||
M: line-reader stream-read ( count line -- string )
|
M: line-reader stream-read ( count line -- string )
|
||||||
|
|
|
@ -4,24 +4,25 @@ IN: io
|
||||||
USING: errors generic kernel lists namespaces strings styles ;
|
USING: errors generic kernel lists namespaces strings styles ;
|
||||||
|
|
||||||
: flush ( -- ) stdio get stream-flush ;
|
: flush ( -- ) stdio get stream-flush ;
|
||||||
: read-line ( -- string ) stdio get stream-readln ;
|
: readln ( -- string/f ) stdio get stream-readln ;
|
||||||
: read1 ( -- char/f ) stdio get stream-read1 ;
|
: read1 ( -- char/f ) stdio get stream-read1 ;
|
||||||
: read ( count -- string ) stdio get stream-read ;
|
: read ( count -- string ) stdio get stream-read ;
|
||||||
: write ( string -- ) stdio get stream-write ;
|
: write ( string -- ) stdio get stream-write ;
|
||||||
: write1 ( char -- ) stdio get stream-write1 ;
|
: write1 ( char -- ) stdio get stream-write1 ;
|
||||||
: write-attr ( string style -- ) stdio get stream-write-attr ;
|
: format ( string style -- ) stdio get stream-format ;
|
||||||
: print ( string -- ) stdio get stream-print ;
|
: print ( string -- ) stdio get stream-print ;
|
||||||
: terpri ( -- ) stdio get stream-terpri ;
|
: terpri ( -- ) stdio get stream-terpri ;
|
||||||
|
: close ( -- ) stdio get stream-close ;
|
||||||
|
|
||||||
: crlf ( -- ) "\r\n" write ;
|
: crlf ( -- ) "\r\n" write ;
|
||||||
: bl ( -- ) " " write ;
|
: bl ( -- ) " " write ;
|
||||||
: close ( -- ) stdio get stream-close ;
|
|
||||||
|
|
||||||
: write-icon ( resource -- )
|
: write-icon ( resource -- )
|
||||||
#! Write an icon. Eg, /library/icons/File.png
|
#! Write an icon. Eg, /library/icons/File.png
|
||||||
icon swons unit "" swap write-attr ;
|
icon swons unit "" swap format ;
|
||||||
|
|
||||||
: with-stream ( stream quot -- )
|
: with-stream ( stream quot -- )
|
||||||
#! Close the stream no matter what happends.
|
#! Close the stream no matter what happens.
|
||||||
[ swap stdio set [ close rethrow ] catch ] with-scope ;
|
[ swap stdio set [ close rethrow ] catch ] with-scope ;
|
||||||
|
|
||||||
: with-stream* ( stream quot -- )
|
: with-stream* ( stream quot -- )
|
||||||
|
|
|
@ -13,27 +13,22 @@ GENERIC: stream-readln ( stream -- string )
|
||||||
GENERIC: stream-read1 ( stream -- char/f )
|
GENERIC: stream-read1 ( stream -- char/f )
|
||||||
GENERIC: stream-read ( count stream -- string )
|
GENERIC: stream-read ( count stream -- string )
|
||||||
GENERIC: stream-write1 ( char stream -- )
|
GENERIC: stream-write1 ( char stream -- )
|
||||||
GENERIC: stream-write-attr ( string style stream -- )
|
GENERIC: stream-format ( string style stream -- )
|
||||||
GENERIC: stream-close ( stream -- )
|
GENERIC: stream-close ( stream -- )
|
||||||
GENERIC: set-timeout ( timeout stream -- )
|
GENERIC: set-timeout ( timeout stream -- )
|
||||||
|
|
||||||
|
: stream-write ( string stream -- )
|
||||||
|
f swap stream-format ;
|
||||||
|
|
||||||
: stream-terpri ( stream -- )
|
: stream-terpri ( stream -- )
|
||||||
"\n" swap stream-write ;
|
"\n" swap stream-write ;
|
||||||
|
|
||||||
: stream-write ( string stream -- )
|
|
||||||
f swap stream-write-attr ;
|
|
||||||
|
|
||||||
: stream-print ( string stream -- )
|
: stream-print ( string stream -- )
|
||||||
[ stream-write ] keep
|
[ stream-write ] keep dup stream-terpri stream-finish ;
|
||||||
[ stream-write ] keep
|
|
||||||
stream-finish ;
|
|
||||||
|
|
||||||
: (stream-copy) ( in out -- )
|
: (stream-copy) ( in out -- )
|
||||||
4096 pick stream-read [
|
4096 pick stream-read
|
||||||
over stream-write (stream-copy)
|
[ over stream-write (stream-copy) ] [ 2drop ] ifte* ;
|
||||||
] [
|
|
||||||
2drop
|
|
||||||
] ifte* ;
|
|
||||||
|
|
||||||
: stream-copy ( in out -- )
|
: stream-copy ( in out -- )
|
||||||
[ 2dup (stream-copy) ]
|
[ 2dup (stream-copy) ]
|
||||||
|
@ -47,7 +42,7 @@ M: null-stream stream-readln drop f ;
|
||||||
M: null-stream stream-read 2drop f ;
|
M: null-stream stream-read 2drop f ;
|
||||||
M: null-stream stream-read1 drop f ;
|
M: null-stream stream-read1 drop f ;
|
||||||
M: null-stream stream-write1 2drop ;
|
M: null-stream stream-write1 2drop ;
|
||||||
M: null-stream stream-write-attr 3drop ;
|
M: null-stream stream-format 3drop ;
|
||||||
M: null-stream stream-close drop ;
|
M: null-stream stream-close drop ;
|
||||||
|
|
||||||
! Sometimes, we want to have a delegating stream that uses stdio
|
! Sometimes, we want to have a delegating stream that uses stdio
|
||||||
|
|
|
@ -2,7 +2,7 @@ USING: io kernel math namespaces sequences strings ;
|
||||||
|
|
||||||
! String buffers support the stream output protocol.
|
! String buffers support the stream output protocol.
|
||||||
M: sbuf stream-write1 push ;
|
M: sbuf stream-write1 push ;
|
||||||
M: sbuf stream-write-attr rot nappend drop ;
|
M: sbuf stream-format rot nappend drop ;
|
||||||
M: sbuf stream-close drop ;
|
M: sbuf stream-close drop ;
|
||||||
M: sbuf stream-flush drop ;
|
M: sbuf stream-flush drop ;
|
||||||
M: sbuf stream-finish drop ;
|
M: sbuf stream-finish drop ;
|
||||||
|
|
|
@ -13,7 +13,7 @@ SYMBOL: recursion-check
|
||||||
GENERIC: prettyprint* ( indent obj -- indent )
|
GENERIC: prettyprint* ( indent obj -- indent )
|
||||||
|
|
||||||
: unparse. ( obj -- )
|
: unparse. ( obj -- )
|
||||||
dup unparse swap presented swons unit write-attr ;
|
dup unparse swap presented swons unit format ;
|
||||||
|
|
||||||
M: object prettyprint* ( indent obj -- indent )
|
M: object prettyprint* ( indent obj -- indent )
|
||||||
unparse. ;
|
unparse. ;
|
||||||
|
|
|
@ -20,7 +20,7 @@ streams strings styles unparser words ;
|
||||||
\ inline prettyprint-prop ;
|
\ inline prettyprint-prop ;
|
||||||
|
|
||||||
: comment. ( comment -- )
|
: comment. ( comment -- )
|
||||||
[ [[ font-style italic ]] ] write-attr ;
|
[ [[ font-style italic ]] ] format ;
|
||||||
|
|
||||||
: infer-effect. ( effect -- )
|
: infer-effect. ( effect -- )
|
||||||
[
|
[
|
||||||
|
|
|
@ -38,12 +38,12 @@ USING: html io kernel namespaces styles test ;
|
||||||
] string-out
|
] string-out
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
: html-write-attr ( string style -- string )
|
: html-format ( string style -- string )
|
||||||
[ write-attr ] with-html-stream ;
|
[ format ] with-html-stream ;
|
||||||
|
|
||||||
[ "hello world" ]
|
[ "hello world" ]
|
||||||
[
|
[
|
||||||
[ "hello world" [ ] html-write-attr ] string-out
|
[ "hello world" [ ] html-format ] string-out
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[ "<span style='color: #ff00ff; font-family: Monospaced; '>car</span>" ]
|
[ "<span style='color: #ff00ff; font-family: Monospaced; '>car</span>" ]
|
||||||
|
@ -51,7 +51,7 @@ USING: html io kernel namespaces styles test ;
|
||||||
[
|
[
|
||||||
"car"
|
"car"
|
||||||
[ [ foreground 255 0 255 ] [[ font "Monospaced" ]] ]
|
[ [ foreground 255 0 255 ] [[ font "Monospaced" ]] ]
|
||||||
html-write-attr
|
html-format
|
||||||
] string-out
|
] string-out
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ USING: io kernel math parser strings test ;
|
||||||
[ 4 ] [ "/library/test/io/no-trailing-eol.factor" run-resource ] unit-test
|
[ 4 ] [ "/library/test/io/no-trailing-eol.factor" run-resource ] unit-test
|
||||||
|
|
||||||
: lines-test ( stream -- line1 line2 )
|
: lines-test ( stream -- line1 line2 )
|
||||||
[ read-line read-line ] with-stream ;
|
[ readln readln ] with-stream ;
|
||||||
|
|
||||||
[
|
[
|
||||||
"This is a line."
|
"This is a line."
|
||||||
|
|
|
@ -13,9 +13,9 @@ unparser words ;
|
||||||
|
|
||||||
: jedit-server-info ( -- port auth )
|
: jedit-server-info ( -- port auth )
|
||||||
jedit-server-file <file-reader> [
|
jedit-server-file <file-reader> [
|
||||||
read-line drop
|
readln drop
|
||||||
read-line parse-number
|
readln parse-number
|
||||||
read-line parse-number
|
readln parse-number
|
||||||
] with-stream ;
|
] with-stream ;
|
||||||
|
|
||||||
: make-jedit-request ( files params -- code )
|
: make-jedit-request ( files params -- code )
|
||||||
|
|
|
@ -16,7 +16,7 @@ global [ " " listener-prompt set ] bind
|
||||||
|
|
||||||
: (read-multiline) ( quot depth -- quot ? )
|
: (read-multiline) ( quot depth -- quot ? )
|
||||||
#! Flag indicates EOF.
|
#! Flag indicates EOF.
|
||||||
>r read-line dup [
|
>r readln dup [
|
||||||
(parse) depth r> dup >r <= [
|
(parse) depth r> dup >r <= [
|
||||||
( we're done ) r> drop t
|
( we're done ) r> drop t
|
||||||
] [
|
] [
|
||||||
|
|
|
@ -101,7 +101,7 @@ M: pane stream-readln ( stream -- line )
|
||||||
M: pane stream-write1 ( string style stream -- )
|
M: pane stream-write1 ( string style stream -- )
|
||||||
[ rot ch>string unit pane-write ] keep scroll>bottom ;
|
[ rot ch>string unit pane-write ] keep scroll>bottom ;
|
||||||
|
|
||||||
M: pane stream-write-attr ( string style stream -- )
|
M: pane stream-format ( string style stream -- )
|
||||||
[ rot "\n" split pane-write ] keep scroll>bottom ;
|
[ rot "\n" split pane-write ] keep scroll>bottom ;
|
||||||
|
|
||||||
M: pane stream-close ( stream -- ) drop ;
|
M: pane stream-close ( stream -- ) drop ;
|
||||||
|
|
|
@ -288,7 +288,7 @@ M: port stream-finish ( stream -- ) drop ;
|
||||||
M: port stream-write1 ( char writer -- )
|
M: port stream-write1 ( char writer -- )
|
||||||
1 over wait-to-write ch>buffer ;
|
1 over wait-to-write ch>buffer ;
|
||||||
|
|
||||||
M: port stream-write-attr ( string style writer -- )
|
M: port stream-format ( string style writer -- )
|
||||||
nip over length over wait-to-write >buffer ;
|
nip over length over wait-to-write >buffer ;
|
||||||
|
|
||||||
M: port stream-close ( stream -- )
|
M: port stream-close ( stream -- )
|
||||||
|
|
Loading…
Reference in New Issue