Skip to main content

eval

Arr.ai's eval (alias e) command evaluates its argument as an arr.ai expression and, by default, prints the result to stdout.

The eval command evaluates its argument as an arr.ai expression.

$ arrai eval '2 + 2'4

The e command is a shortcut and behaves identically to eval.

$ arrai e '2 + 2'4

Output controls#

The eval command supports the --out flag (shorthand -o), which changes arr.ai's output behaviour as follows:

optiondescription
--out=file:<path>Outputs the evaluated result, which must be a string or byte array, to the file specified by <path>. file may be abbreviated to f.
--out=dir:<path>Outputs the evaluated result to the directory specified by <path>. The result to be output must be a recursively nested dict of dicts, with strings and/or byte arrays at the leaves. Each dict represents the contents of a directory at the location given by its key while each string or byte array correspondingly represents the contents of a file. dir may be abbreviated to d.

For both --out=file and --out=dir, strings are UTF-8 encoded when written to the corresponding file.

More fine-grained control#

An arr.ai program can exercise more control over the --out=dir option by returning tuples in place of dicts (for directories) or strings (for files). The structure of these tuples is as follows:

atttributevalue(s)purpose
ifExists'fail' | 'ignore' | 'merge' | 'remove' | 'replace'Control the behaviour when encountering existing directory entries in the target directory. If ifExists is omitted, it defaults to 'merge' if the dir attribute is present, or 'replace' if the file attribute is present.
dira dictOutput the dict a directory.
filea string or byte arrayOutput the content as a file.

The tuple (dir: {}) can be used to output an empty directory with , since {} by itself is indistinguishable from an empty file, "".

Strings, byte arrays and dicts are in fact shorthands for the tuple form, as follows:

valueexampleequivalent
string or byte array"hello"(file: "hello")
dict{"foo.txt": "hello"}(dir: {"foo.txt": "hello"})

Examples#

$ arrai e --out=file:example.txt '$"Hello, ${//os.args(1)}!\n"' Bob$ cat example.txtHello, Bob!$ arrai e -o f:example.txt '"hello\n"'$ cat example.txthello$ arrai e -o :example.txt '"hello\n"'$ cat example.txthello$ arrai e -o example.txt '"hello\n"'$ cat example.txthello

Note that --out=file offers several shortenings. The final example above only works if the path itself doesn't have a : in it.

$ arrai e --out=dir:out 'let [_, name, ...] = //os.args;{    "foo.txt": $"Hello, ${name}.\n",    "bar": {        "baz.txt": <<"Goodbye, ", name, "!", 10>>,        "empty": (            ifExists: "replace",            dir: {},        ),        "template.c": (            ifExists: "remove",        ),        "template2.c": (            ifExists: "ignore",            file: $`                int main() {                    // Write some code here...                    return 1;                }            `,        ),    }}' Bob$ tree outoutโ”œโ”€โ”€ barโ”‚ย ย  โ””โ”€โ”€ baz.txtโ”‚ย ย  โ””โ”€โ”€ emptyโ”‚ย ย  โ””โ”€โ”€ template2.cโ””โ”€โ”€ foo.txt
1 directory, 2 files$ cat out/foo.txtHello, Bob.$ cat out/bar/baz.txtGoodbye, Bob!$ cat out/bar/template2.c$ cat out/bar/template2.cint main() {    // Write some code here...    return 1;}