From 82de78c1603e802133b9cc6b8f75b3a57174be3a Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Sat, 1 Nov 2025 16:26:55 +0000 Subject: [PATCH 1/2] [julia-parser] Unify some import/export code paths This is just a drive-by prepratory cleanup --- src/julia-parser.scm | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/julia-parser.scm b/src/julia-parser.scm index 1a11494b5c8e3..21adcf330f11a 100644 --- a/src/julia-parser.scm +++ b/src/julia-parser.scm @@ -1615,8 +1615,7 @@ (list 'module (if (eq? word 'module) '(true) '(false)) name `(block ,loc ,@(cdr body))))) ((export public) - (let ((es (map macrocall-to-atsym - (parse-comma-separated s parse-unary-prefix)))) + (let ((es (parse-comma-separated s parse-atsym))) (if (not (every symbol-or-interpolate? es)) (error (string "invalid \"" word "\" statement"))) `(,word ,@es))) @@ -1637,11 +1636,6 @@ ,(begin0 (parse-block s) (expect-end s 'do))))))) -(define (macrocall-to-atsym e) - (if (and (pair? e) (eq? (car e) 'macrocall)) - (cadr e) - e)) - (define (parse-imports s word) (let* ((first (parse-import s word #f)) (next (peek-token s)) @@ -1678,7 +1672,7 @@ (parse-atom s #f)))) (define (parse-atsym s) - (let ((t (peek-token s))) + (let ((t (require-token s))) (if (eqv? t #\@) (begin (take-token s) (macroify-name (parse-macro-name s))) From 3d2db6f8130feef2a474a194bfd750c63ec18ff2 Mon Sep 17 00:00:00 2001 From: Keno Fischer Date: Sat, 1 Nov 2025 16:45:38 +0000 Subject: [PATCH 2/2] Add parsing for `export foo as bar` In analogy to `import foo as bar`. However, no lowering is added for this. My intention is to use this in a macro. --- src/julia-parser.scm | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/julia-parser.scm b/src/julia-parser.scm index 21adcf330f11a..963b7a2e2e687 100644 --- a/src/julia-parser.scm +++ b/src/julia-parser.scm @@ -123,6 +123,13 @@ (and (pair? ex) (eq? '$ (car ex))))) +(define (symbol-as-or-interpolate? ex) + (or (symbol-or-interpolate? ex) + (and (pair? ex) + (eq? 'as (car ex)) + (symbol-or-interpolate? (cadr ex)) + (symbol-or-interpolate? (caddr ex))))) + (define (is-word-operator? op) (every identifier-start-char? (string->list (symbol->string op)))) @@ -1378,6 +1385,14 @@ (take-lineendings s)) s))) +(define (parse-export s) + (let ((ex (parse-atsym s))) + (if (eq? (peek-token s) 'as) + (begin + (take-token s) + `(as ,ex ,(parse-atsym s))) + ex))) + ;; parse expressions or blocks introduced by syntactic reserved words (define (parse-resword s word) (with-bindings @@ -1615,8 +1630,8 @@ (list 'module (if (eq? word 'module) '(true) '(false)) name `(block ,loc ,@(cdr body))))) ((export public) - (let ((es (parse-comma-separated s parse-atsym))) - (if (not (every symbol-or-interpolate? es)) + (let ((es (parse-comma-separated s (if (eq? word 'export) parse-export parse-atsym)))) + (if (not (every symbol-as-or-interpolate? es)) (error (string "invalid \"" word "\" statement"))) `(,word ,@es))) ((import using)