S-expressions: Difference between revisions
m
→JS Functional: Tidied.
m (→{{header|Wren}}: Minor tidy) |
m (→JS Functional: Tidied.) |
||
Line 3,919:
"((data \"quoted data\" 123 4.5)",
" (data (!@# (4.5) \"(more\" \"data)\")))"
]
const [parse, residue] = parseExpr(
Line 3,925 ⟶ 3,926:
);
return 0 < residue.length
? `Unparsed tokens: ${JSON.stringify(residue)}`
parse.map(serialized).join(" ")
▲ ].join("\n\n")) : "Could not be parsed";
]
.join("\n\n"))
: "Could not be parsed";
};
Line 3,960 ⟶ 3,964:
// An open bracket introduces recursion over
// a sub-expression to define a sub-list.
return "(" === token
const [expr, rest] = parseExpr(ts);
return [xs.concat([expr]), rest.slice(1)];
: [xs.concat(atom(token)), ts];
};
Line 3,973 ⟶ 3,979:
// atom :: String -> Expr
const atom = s =>
0 < s.length
? isNaN(s)
: {name: s}
Line 3,990 ⟶ 3,996:
// Brackets and quoted or unquoted atomic strings.
quoteTokens("\"")(s).flatMap(
segment => "\"" !== segment[0]
? segment.replace(/([()])/gu, " $1 ")
.split(/\s+/u)
.filter(Boolean)
);
Line 4,002 ⟶ 4,008:
// Alternating unquoted and quoted segments.
s => s.split(q).flatMap(
(k, i) => even(i)
? [k]
);
Line 4,015 ⟶ 4,021:
const t = typeof e;
return "number" === t
? `${e}`
? `"${e}"`
? Array.isArray(e)
? `(${e.map(serialized).join(" ")})`
};
Line 4,042 ⟶ 4,048:
f => {
const go = x =>
p(x)
? x
: go(f(x));
return go;
|