for
)A more familiar iteration loop to existing developers
This for
loop is fills a small niche where
foreach
or formap
are inappropriate in your
script. It’s generally not recommended to use for
because
it performs slower and doesn’t adhere to Murex’s design philosophy.
However it does offer additional flexibility around recursion.
for { variable; conditional; incrementor } { code-block } -> <stdout>
» for {$i=1; $i<6; $i++} { out "iteration $i" }
iteration 1
iteration 2
iteration 3
iteration 4
iteration 5
for
is a little naughty in terms of breaking Murex’s
style guidelines due to the first parameter being entered as one string
treated as 3 separate code blocks. The syntax is like this for two
reasons:
{ blocks }
would make
scripts unsightlyfor
loops in other
languagesTake the following example:
for {$i=1; $i<6; $i++} { out "iteration $i" }
The first parameter is: {$i=1; $i<6; $i++}
, this is
then converted into the following code:
$i=1
- declare the loop iteration variable$i<6
- if the condition is true then proceed to run
the code in the second parameter - { echo $i }
$i++
- increment the loop iterator variableThe second parameter is the code to execute upon each iteration
One of the drawbacks (or maybe advantages, depending on your perspective) of JSON is that parsers generally expect a complete file for processing in that the JSON specification requires closing tags for every opening tag. This means it’s not always suitable for streaming. For example
» ja [1..3] -> foreach i { out ({ "$i": $i }) }
{ "1": 1 }
{ "2": 2 }
{ "3": 3 }
What does this even mean and how can you build a JSON file up sequentially?
One answer if to write the output in a streaming file format and convert back to JSON
» ja [1..3] -> foreach i { out (- "$i": $i) }
- "1": 1
- "2": 2
- "3": 3
» ja [1..3] -> foreach i { out (- "$i": $i) } -> cast yaml -> format json
[
{
"1": 1
},
{
"2": 2
},
{
"3": 3
}
]
What if I’m returning an object rather than writing one?
The problem with building JSON structures from existing structures is that you can quickly end up with invalid JSON due to the specifications strict use of commas.
For example in the code below, each item block is it’s own object and
there are no [ ... ]
encapsulating them to denote it is an
array of objects, nor are the objects terminated by a comma.
» config -> [ shell ] -> formap k v { $v -> alter /Foo Bar }
{
"Data-Type": "bool",
"Default": true,
"Description": "Display the interactive shell's hint text helper. Please note, even when this is disabled, it will still appear when used for regexp searches and other readline-specific functions",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
}
{
"Data-Type": "block",
"Default": "{ progress $PID }",
"Description": "Murex function to execute when an `exec` process is stopped",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": "{ progress $PID }"
}
{
"Data-Type": "bool",
"Default": true,
"Description": "ANSI escape sequences in Murex builtins to highlight syntax errors, history completions, {SGR} variables, etc",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
}
...
Luckily JSON also has it’s own streaming format: JSON lines
(jsonl
). We can cast
this output as
jsonl
then format
it back into valid JSON:
» config -> [ shell ] -> formap k v { $v -> alter /Foo Bar } -> cast jsonl -> format json
[
{
"Data-Type": "bool",
"Default": true,
"Description": "Write shell history (interactive shell) to disk",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
},
{
"Data-Type": "int",
"Default": 4,
"Description": "Maximum number of lines with auto-completion suggestions to display",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": "6"
},
{
"Data-Type": "bool",
"Default": true,
"Description": "Display some status information about the stop process when ctrl+z is pressed (conceptually similar to ctrl+t / SIGINFO on some BSDs)",
"Dynamic": false,
"Foo": "Bar",
"Global": true,
"Value": true
},
...
foreach
will automatically cast it’s output as jsonl
if
it’s stdin type is json
» ja [Tom,Dick,Sally] -> foreach name { out Hello $name }
Hello Tom
Hello Dick
Hello Sally
» ja [Tom,Dick,Sally] -> foreach name { out Hello $name } -> debug -> [[ /Data-Type/Murex ]]
jsonl
» ja [Tom,Dick,Sally] -> foreach name { out Hello $name } -> format json
[
"Hello Tom",
"Hello Dick",
"Hello Sally"
]
ja
):
A sophisticated yet simply way to build a JSON arrayset
):
Define a variable (typically local) and set it’s valuebreak
):
Terminate execution of a block within your processes scopeforeach
): Iterate through an arrayformap
): Iterate through a map or other collection of
dataif
):
Conditional statement to execute different blocks of code depending on
the result of the conditionwhile
):
Loop until condition falsea
): A
sophisticated yet simple way to stream an array or list (mkarray)let
: Evaluate a
mathematical function and assign to variable (deprecated)This document was generated from builtins/core/structs/for_doc.yaml.
This site's content is rebuilt automatically from murex's source code after each merge to the master
branch. Downloadable murex binaries are also built with the website.
Last built on Wed Jan 15 23:07:50 UTC 2025 against commit b4c4296b4c429617fd41527ea0efef33c52c15ef2b64972.
Current version is 6.4.2063 (develop) which has been verified against tests cases.