git » jacl.git » commit b68c6c5

starting compiler

author Alan Dipert
2019-09-04 13:56:47 UTC
committer Alan Dipert
2019-09-04 13:56:47 UTC
parent 289b4681bcfe0d6062ce58d62687d95f182e6dda

starting compiler

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);