S-expressions: Difference between revisions
m
→JS Functional
(→{{header|JavaScript}}: hint to bugfix concerning \" and \n in strings) |
m (→JS Functional) |
||
(2 intermediate revisions by 2 users not shown) | |||
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")
};
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)
? "\"'".includes(s[0])
? s.slice(1, -1)
:
▲ ) : parseFloat(s, 10)
▲ ) : "";
Line 3,990 ⟶ 3,994:
// 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,006:
// Alternating unquoted and quoted segments.
s => s.split(q).flatMap(
(k, i) => even(i)
? [k]
);
Line 4,015 ⟶ 4,019:
const t = typeof e;
return "number" === t
? `${e}`
? `"${e}"`
? Array.isArray(e)
? `(${e.map(serialized).join(" ")})`
};
Line 4,042 ⟶ 4,046:
f => {
const go = x =>
p(x)
? x
: go(f(x));
return go;
Line 6,786 ⟶ 6,792:
{{libheader|Wren-pattern}}
{{libheader|Wren-fmt}}
<syntaxhighlight lang="
import "./fmt" for Fmt
var INDENT = 2
|