Recent Changes in Factor
Friday, March 28, 2008
Here are some things I’ve been working collaboratively with some other Factor devs lately.
cwd, cd, and pathname changes
The old way to change the current working directory was to call the cd
word. This is now obsolete, and code that does this won’t get the
expected behavior anymore. A new word, normalize-pathname
, is called
before every top level word using paths and adjusts the pathname based
on a new dynamic variable called current-directory
.
To get pathnames relative to the Factor directory you used to use the
words ?resource-path
and resource-path
. The code
"resource:foo.txt" file-contents
now does what
"foo.txt" resource-path file-contents
used to do, so user code should
avoid calling resource-path
on path literals.
Also, there’s a new word called with-directory ( path quot -- )
that
calls your quotation with a new current working directory and restores
the old one when done. All of words that deal with reading and writing
files have been updated to respect this change.
Using the cd
word is still useful sometimes, like when calling
with-fork ( parent-quot child-quot -- )
when you want the child
process to inherit the current-directory variable as its current
directory.
Pathnames in Factor are still strings, but may be either strings or pathname objects in the future.
IO Launcher Priorities
Since some Factor developers still use Windows XP on single-core laptops from 2004, tools.deploy now sets the child process to have a lower priority so that the system is still usable when deploying images.
Example:
<process>
{ "cmd" "/c" "dir" "/S" "\\" } >>command
+low-priority+ >>priority
run-process
BSD Port
Factor now supports FreeBSD, NetBSD, and OpenBSD 32 and 64bit versions. Please inform us of any bugs you find. Binary releases should happen within a week.
Fixing the Solaris port is next up, followed by the ARM Linux and WinCE port.
Random number generator protocol
Because we want to generate secure random numbers for the new web
framework, the Mersenne twister algorithm just won’t do as Factor’s sole
pseudo random number generator. So until we implement a Yarrow prng, the
default prng for cryptography is /dev/random on Unix systems and the
CryptGenRandom
call on Windows. Does anyone have a suggestion as to
which provider to use? I’m using PROV_RSA_AES right now, but I just
chose it randomly from the list.
The random protocol is really simple.
GENERIC: seed-random ( tuple seed -- )
GENERIC: random-32* ( tuple -- r )
GENERIC: random-bytes* ( tuple n -- bytes )
M: object random-bytes* ( tuple n -- byte-array )
[ drop random-32* ] with map >c-uint-array ;
M: object random-32* ( tuple -- n )
4 random-bytes* le> ;
There are two ways to get randomness – either 32 bits at a time, or several bytes at a time. The cool thing is that you only have to put a method on one of these words, and the other one is taken care of by the default method! Of course, if you don’t define either, the callstack will overflow. You can define methods on both for efficiency if it makes sense.