Factor can be used for command-line scripting on Unix-like systems.
To run a script, simply pass it as an argument to the Factor executable:
./factor cleanup.factor
To test a script in the listener, you can use
run-file.
The script may access command line arguments by inspecting the value of the
command-line variable. It can also get its own path from the
script variable.
Example: lsHere is an example implementing a simplified version of the Unix
ls command in Factor:
USING: command-line namespaces io io.files
io.pathnames tools.files sequences kernel ;
command-line get [
"." directory.
] [
dup length 1 = [ first directory. ] [
[ [ nl write ":" print ] [ directory. ] bi ] each
] if
] if-empty
You can put it in a file named
ls.factor, and then run it, to list the
/usr/bin directory for example:
./factor ls.factor /usr/bin
Example: grepThe following is a more complicated example, implementing something like the Unix
grep command:
USING: kernel fry io io.files io.encodings.ascii sequences
regexp command-line namespaces ;
IN: grep
: grep-lines ( pattern -- )
'[ dup _ matches? [ print ] [ drop ] if ] each-line ;
: grep-file ( pattern filename -- )
ascii [ grep-lines ] with-file-reader ;
: grep-usage ( -- )
"Usage: factor grep.factor <pattern> [<file>...]" print ;
command-line get [
grep-usage
] [
unclip <regexp> swap [
grep-lines
] [
[ grep-file ] with each
] if-empty
] if-empty
You can run it like so,
./factor grep.factor '.*hello.*' myfile.txt
You'll notice this script takes a while to start. This is because it is loading and compiling the
regexp vocabulary every time. To speed up startup, load the vocabulary into your image, and save the image:
USE: regexp
save
Now, the
grep.factor script will start up much faster. See
Images for details.
Executable scriptsIt is also possible to make executable scripts. A Factor file can begin with a 'shebang' like the following:
#!/usr/bin/env factor
If the text file is made executable, then it can be run, assuming the
factor binary is in your
$PATH.
References