author | Alan Dipert
<alan@dipert.org> 2019-09-26 13:33:24 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-09-26 13:33:24 UTC |
parent | 8b2f22fa95c9f3b52596cdf38c58aeae3e806332 |
jacl.js | +31 | -12 |
diff --git a/jacl.js b/jacl.js index 9ba7698..73289d1 100644 --- a/jacl.js +++ b/jacl.js @@ -403,24 +403,26 @@ const readList = async stream => { return new Values(new Cons(car, (await readList(stream))[0])); } +const readString = async stream => { + let str = new LispString(); + for await(const x of stream) { + if (x === '"') { + return new Values(str); + } else if(x === '\\') { + str.push(await stream.read()); + } else { + str.push(x); + } + } +}; + READTABLE.value = new ReadTable() .setMacro(';', true, async stream => { for await(const ch of stream) { if (ch === '\n') return new Values(); } }) - .setMacro('"', true, async stream => { - let str = new LispString(); - for await(const x of stream) { - if (x === '"') { - return new Values(str); - } else if(x === '\\') { - str.push(await stream.read()); - } else { - str.push(x); - } - } - }) + .setMacro('"', true, readString) .setMacro('(', true, readList) .setMacro("'", true, async stream => { return new Values(Cons.listOf( @@ -591,6 +593,21 @@ JACLPKG.intern('.').setMacro().fvalue = function(topic, ...ops) { }; JACLPKG.exportSymbol('.'); +const readJsString = async stream => { + // TODO make this a real JS string reader + const [clStr] = await readString(stream); + return new Values(clStr.toString()); +}; + +JACLPKG.intern('ENABLE-JS-SYNTAX').fvalue = () => { + READTABLE + .val() + .makeDispatchMacroChar('@', true) + .setDispatchMacroChar('@', '"', readJsString); + return null; +}; +JACLPKG.exportSymbol('ENABLE-JS-SYNTAX'); + const isMacroForm = form => { return form instanceof Cons && form.car @@ -601,6 +618,8 @@ const isMacroForm = form => { const compile = (form, env) => { if (form instanceof Number || typeof form === 'number') { return form.toString(); + } else if (form instanceof String || typeof form === 'string') { + return JSON.stringify(form); } else if (form instanceof LispString) { return `(LispString.fromString("${form}"))`; } else if (isMacroForm(form)) {