author | Alan Dipert
<alan@dipert.org> 2019-09-04 13:56:47 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-09-04 13:56:47 UTC |
parent | 289b4681bcfe0d6062ce58d62687d95f182e6dda |
jacl.js | +31 | -1 |
diff --git a/jacl.js b/jacl.js index cfc75d4..c35348f 100644 --- a/jacl.js +++ b/jacl.js @@ -63,6 +63,9 @@ class LispSymbol { popBinding() { this.value = this.stack.pop(); } + getPackage() { + return Package.get(this.packageName); + } static intern(packageName, name) { if (readInteger(packageName)[0]) throw new Error(`Symbol package must not be number: '${packageName}'`); @@ -152,7 +155,7 @@ class Package { } } -Package.makePackage('JACL-SYS'); +Package.makePackage('JACL'); Package.makePackage('COMMON-LISP', 'CL'); Package.makePackage('COMMON-LISP-USER'); Package.makePackage('KEYWORD'); @@ -442,6 +445,33 @@ class Reader { } } +const compileDot = (form, env, retctx) => { + [, topic, ...[arg, ...more]] = form; + const ctopic = compile(topic, env, retctx); + if (arg instanceof LispSymbol) { + return `${ctopic}.${arg.name}`; + } +}; + +const compile = (form, env, retctx) => { + if (retctx) { + if (form instanceof Number || typeof form === 'number') { + return form.toString(); + } else if (form instanceof LispString) { + return `(LispString.fromString("${form}"))`; + } else if (form instanceof Cons) { + const car = form.car; + if (car instanceof LispSymbol + && car.getPackage().name === 'JACL' + && car.name === '.') { + return compileDot(form, env, retctx); + } + } + } else { + // TODO + } +}; + var buf = new BufferedStream(), rdr = new Reader(buf);