Implement importing and exporting ES Modules

Moritz.Hedtke Moritz.Hedtke at t-online.de
Wed Apr 3 20:05:53 UTC 2019


Hello,


recently I tried to use ES Modules with Parenscript so I modified the 
code. I just wanted to share the patch - maybe you want to include it in 
the official repository.


Kind regards,

Moritz Hedtke


 From 4862600435c3dfbf4b329b5d4578e5ae77f9eaa2 Mon Sep 17 00:00:00 2001
From: mohe2015 <mohe2015 at users.noreply.github.com>
Date: Sun, 24 Mar 2019 13:00:31 +0100
Subject: [PATCH] Implement importing and exporting ES Modules

---
  src/js-ir-package.lisp     |  4 ++++
  src/package.lisp           |  6 ++++++
  src/printer.lisp           | 15 +++++++++++++++
  src/special-operators.lisp | 12 ++++++++++++
  4 files changed, 37 insertions(+)

diff --git a/src/js-ir-package.lisp b/src/js-ir-package.lisp
index dd5fa80..46aefc7 100644
--- a/src/js-ir-package.lisp
+++ b/src/js-ir-package.lisp
@@ -144,4 +144,8 @@
     #:funcall
     #:escape
     #:regex
+   #:export
+   #:export-default
+   #:import
+   #:import-default
     ))
diff --git a/src/package.lisp b/src/package.lisp
index 2a39628..3262cc8 100644
--- a/src/package.lisp
+++ b/src/package.lisp
@@ -150,6 +150,12 @@
     ;; compile-time stuff
     #:eval-when

+   ;; modules
+   #:export
+   #:export-default
+   #:import
+   #:import-default
+
     ;; body forms
     #:progn

diff --git a/src/printer.lisp b/src/printer.lisp
index fc52e71..df94dfa 100644
--- a/src/printer.lisp
+++ b/src/printer.lisp
@@ -415,3 +415,18 @@ vice-versa.")
    ;; literal-js should be a form that evaluates to a string containing
    ;; valid JavaScript
    (psw literal-js))
+
+(defprinter ps-js:export (object)
+  "export " (ps-print object))
+
+(defprinter ps-js:export-default (object)
+  "export default " (ps-print object))
+
+(defprinter ps-js:import (file objects)
+  "import { "
+  (loop for (object . remaining) on objects do
+       (psw object) (when remaining (psw ", ")))
+  " } from " (ps-print file))
+
+(defprinter ps-js:import-default (file name)
+  "import " (psw name) " from " (ps-print file))
diff --git a/src/special-operators.lisp b/src/special-operators.lisp
index a3abc90..4a90683 100644
--- a/src/special-operators.lisp
+++ b/src/special-operators.lisp
@@ -702,3 +702,15 @@ code in :execute."
    (if (member :execute situation-list)
        (ps-compile `(progn , at body))
        (ps-compile `(progn))))
+
+(define-expression-operator export (object)
+  `(ps-js:export ,(ps-compile object)))
+
+(define-expression-operator export-default (object)
+  `(ps-js:export-default ,(ps-compile object)))
+
+(define-expression-operator import (file &rest objects)
+  `(ps-js:import ,file ,objects))
+
+(define-expression-operator import-default (file name)
+  `(ps-js:import-default ,file ,name))

-------------- next part --------------
A non-text attachment was scrubbed...
Name: js-modules-squashed.patch
Type: text/x-patch
Size: 2438 bytes
Desc: not available
URL: <https://mailman.common-lisp.net/pipermail/parenscript-devel/attachments/20190403/a30cfd68/attachment.bin>


More information about the parenscript-devel mailing list