Deploying programs
Factor handbook ยป Guided tour of Factor

Prev:Input/Output
Next:Multithreading


There are two ways to run Factor programs outside the listener: as scripts, which are interpreted by Factor, or as standalone executable compiled for your platform. Both require you to define a vocabulary with an entry point (altough there is an even simpler way for scripts), so let's do that first.

Start by creating our ls vocabulary with "ls" scaffold-work and make it look like this:
! Copyright (C) 2014 Andrea Ferretti. ! See https://factorcode.org/license.txt for BSD license. USING: accessors command-line io io.directories io.files.types kernel namespaces sequences ; IN: ls <PRIVATE : list-files-and-dirs ( path -- files dirs ) directory-entries [ type>> +regular-file+ = ] partition ; PRIVATE> : ls ( path -- ) list-files-and-dirs "DIRECTORIES:" print "------------" print [ name>> print ] each "FILES:" print "------" print [ name>> print ] each ;

When we run our vocabulary, we will need to read arguments from the command line. Command-line arguments are stored under the command-line dynamic variable, which holds an array of strings. Hence - forgetting any error checking - we can define a word which runs ls on the first command-line argument with
: ls-run ( -- ) command-line get first ls ;

Finally, we use the word MAIN: to declare the main word of our vocabulary:
MAIN: ls-run

Having added those two lines to your vocabulary, you are now ready to run it. The simplest way is to run the vocabulary as a script with the -run flag passed to Factor. For instance to list the contents of my home I can do
$ ./factor -run=ls /home/andrea

In order to produce an executable, we must set some options and call the deploy word. The simplest way to do this graphically is to invoke the deploy-tool word. If you write "ls" deploy-tool, you will be presented with a window to choose deployment options. For our simple case, we will leave the default options and choose Deploy.

After a little while, you should be presented with an executable that you can run like
$ cd ls $ ./ls /home/andrea

Try making the ls program more robust by handling missing command-line arguments and non-existent or non-directory arguments.