S-expressions: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
m (→‎JS Functional: Tidied.)
Line 3,919:
"((data \"quoted data\" 123 4.5)",
" (data (!@# (4.5) \"(more\" \"data)\")))"
].join("\n");
].join("\n\n")) : "Could not be parsed";
 
const [parse, residue] = parseExpr(
Line 3,925 ⟶ 3,926:
);
 
return 0 < residue.length ? (
? `Unparsed tokens: ${JSON.stringify(residue)}`
) : 0 < parse.length ? ([
JSON.stringify(parse, null, 2), ? ([
"Reserialized from JSON.stringify(parse:", null, 2),
parse.map(serialized).join( "Reserialized from parse:"),
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);{
const [expr, rest] = parseExpr(ts);
 
return [xs.concat([expr]), rest.slice(1)];
})() : ")" === token ? })()
[xs,: ")" === token]
) : ? [xs.concat(atom(token)), tstoken];
: [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"\"'".sliceincludes(1, -1s[0])
) : { ? s.slice(1, -1)
: {name: s}
})
) : parseFloat(s, 10)
) : "";
 
 
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)
) : [segment]
);
 
Line 4,002 ⟶ 4,008:
// Alternating unquoted and quoted segments.
s => s.split(q).flatMap(
(k, i) => even(i) ? (
Boolean(k) ? (0 < k.length
? [k]
) : []
) : [`${q}${k}${q}`]
);
 
Line 4,015 ⟶ 4,021:
const t = typeof e;
 
return "number" === t ? (
? `${e}`
) : "string" === t ? (
? `"${e}"`
) : "object" === t ? (
? Array.isArray(e) ? (
? `(${e.map(serialized).join(" ")})`
) : e.name
) : "?";
};
 
Line 4,042 ⟶ 4,048:
f => {
const go = x =>
p(x) ? x : go(f(x));
? x
: go(f(x));
 
return go;
9,655

edits