[ . | scan("[\\s,]*(~@|[\\[\\]{}()'`~^@]|\"(?:\\\\.|[^\\\\\"])*\"?|;.*|[^\\s\\[\\]{}('\"`,;)]*)") | select(.|length > 0)[0] | select(.[0:1] != ";") ];
def read_str:
- . | tokenize;
+ tokenize;
-# TODO
def read_string:
- . | fromjson;
+ fromjson;
def extract_string:
. as $val | if ["keyword", "symbol", "string"] | contains([$val.kind]) then
$val.value
else
- error("assoc called with non-string key of type \($val.kind)")
+ jqmal_error("assoc called with non-string key of type \($val.kind)")
end;
# stuff comes in as {tokens: [...], <stuff unrelated to us>}
}
}
else
- error("EOF while reading string")
+ jqmal_error("EOF while reading string")
end
else if $lookahead | test("^:") then
{
def read_form_(depth):
(.tokens | first) as $lookahead | . | (
if $lookahead == null then
- empty
+ null
# read_list
else
if $lookahead | test("^\\(") then
}
end)) ] | map(select(.tokens)) | last as $result |
if $result.tokens | first != ")" then
- error("unbalanced parentheses in \($result.tokens)")
+ jqmal_error("unbalanced parentheses in \($result.tokens)")
else
{
tokens: $result.tokens[1:],
}
end)) ] | map(select(.tokens)) | last as $result |
if $result.tokens | first != "]" then
- error("unbalanced brackets in \($result.tokens)")
+ jqmal_error("unbalanced brackets in \($result.tokens)")
else
{
tokens: $result.tokens[1:],
}
end)) ] | map(select(.tokens)) | last as $result |
if $result.tokens | first != "}" then
- error("unbalanced braces in \($result.tokens)")
+ jqmal_error("unbalanced braces in \($result.tokens)")
else
if $result.values | length % 2 == 1 then
# odd number of elements not allowed
- error("Odd number of parameters to assoc")
+ jqmal_error("Odd number of parameters to assoc")
else
{
tokens: $result.tokens[1:],
]
}
})
+ # with-meta
+ else if $lookahead == "^" then
+ (.tokens |= .[1:]) | read_form_(depth+1) as $meta | $meta | read_form_(depth+1) as $value | (
+ {
+ tokens: $value.tokens,
+ value: {
+ kind: "list",
+ values: [
+ {
+ kind: "symbol",
+ value: "with-meta"
+ },
+ $value.value,
+ $meta.value
+ ]
+ }
+ })
else
. as $prev | read_atom
- end end end end end end end end end);
+ end end end end end end end end end end);
def read_form:
{tokens: .} | read_form_(0);
include "reader";
include "printer";
+include "utils";
def read_line:
. as $in
read_str;
def EVAL:
- . | read_form | .value;
+ read_form | .value;
def PRINT:
- . | pr_str;
+ pr_str;
def rep:
- . | READ | EVAL | PRINT;
+ READ | EVAL |
+ if . != null then
+ PRINT
+ else
+ null
+ end;
def repl_:
- [
- ("user> " | stderr),
- (read_line | rep)
- ] | last;
+ ("user> " | stderr) |
+ (read_line | rep);
def repl:
- while(true; try repl_ catch "Error: \(.)");
+ {continue: true} | while(
+ .continue;
+ try {value: repl_, continue: true}
+ catch
+ if is_jqmal_error then
+ {value: "Error: \(.)", continue: true}
+ else
+ {value: ., continue: false}
+ end) | if .value then .value else empty end;
repl