git » jacl.git » commit e3ce4ec

%lambda now takes name argument

author Alan Dipert
2020-06-19 03:32:05 UTC
committer Alan Dipert
2020-06-19 03:32:05 UTC
parent fd4932a86fa478a7ceca4bcbfab9fdbe8d33cfab

%lambda now takes name argument

boot.lisp +4 -4
jacl.js +14 -6

diff --git a/boot.lisp b/boot.lisp
index 0e35f13..cd137e7 100644
--- a/boot.lisp
+++ b/boot.lisp
@@ -27,14 +27,14 @@
 (\. *package* (|exportSymbol| (\. 'defmacro |name|)))
 (%js "(~{}.setMacro().fvalue = ~{})"
      'defmacro
-     (%lambda (env form name params &rest body)
+     (%lambda nil (env form name params &rest body)
        `(jacl:%progn
           (jacl:%js "(~{}.setMacro().fvalue = ~{})"
             ',name
             ;; TODO Macro lambda list parsing. Also, consider
             ;; incorportating a symbol's package into the name of its
             ;; generated local.
-            (jacl:%lambda (jacl::&environment jacl::&whole ,@params)
+            (jacl:%lambda nil (jacl::&environment jacl::&whole ,@params)
               ,@body))
           ',name)))
 
@@ -43,7 +43,7 @@
   `(jacl:%progn
      (jacl:%js "(~{}.fvalue = ~{})"
        ',name
-       (jacl:%lambda ,params ,@body))
+       (jacl:%lambda nil ,params ,@body))
      ',name))
 
 (defun %export (symbol &optional (package *package*))
@@ -273,7 +273,7 @@
 
 (%export 'lambda)
 (defmacro lambda (params &rest body)
-  `(jacl:%lambda ,params ,@body))
+  `(jacl:%lambda nil ,params ,@body))
 
 (%export 'list)
 (defun list (&rest objects)
diff --git a/jacl.js b/jacl.js
index 55d0ede..c6977bd 100644
--- a/jacl.js
+++ b/jacl.js
@@ -792,7 +792,7 @@ const munge = s => {
 
 const mungeSym = (sym, prefix = '') => {
   prefix = prefix !== '' ? (prefix + '_') : '';
-  if (sym.packageName === undefined || PACKAGE.val().name === sym.packageName) {
+  if (sym.packageName === undefined) {
     return prefix + munge(sym.name);
   } else {
     return prefix + munge(sym.packageName) + '$' + munge(sym.name);
@@ -1283,7 +1283,7 @@ const analyzeSpecials = new Map([
     return node;
   }],
   [JACLPKG.intern('%LAMBDA'), (env, parent, form) => {
-    let [, list, ...body] = form;
+    let [, name, list, ...body] = form;
     let declarations = [];
     if (body.length > 0
         && List.isProperList(body[0])
@@ -1291,8 +1291,16 @@ const analyzeSpecials = new Map([
       declarations = List.toArray(List.rest(body[0]));
       body = body.slice(1);
     }
-    node = makeNode('lambda', { env: env, parent: parent, form: form, declarations: declarations });
-    const { lambdaList, initforms, bodyEnv } = analyzeLambdaList(env.withContext('expr'), node, list, false);
+    node = makeNode('lambda', {
+      env: env,
+      parent: parent,
+      form: form,
+      name: name,
+      declarations: declarations
+    });
+    const { lambdaList, initforms, bodyEnv } = analyzeLambdaList(
+      env.withContext('expr'), node, list, false
+    );
     node.lambdaList = lambdaList;
     node = merge(node, analyzeBlock(bodyEnv, node, body));
     node.children = [...node.children, ...initforms];
@@ -1854,9 +1862,9 @@ const emitNode = (print, node) => {
     }
     case 'lambda': {
       if (node.declarations.find(x => List.first(x) === JACLPKG.intern('ASYNC'))) {
-        print('(async function(');
+        print(`(async function ${mungeSym(node.name)}(`);
       } else {
-        print('(function(');
+        print(`(function ${mungeSym(node.name)}(`);
       }
       // Emit required argument names
       // TODO Move lambda list production to a function for use by macro ll,