From 46955edbe6cea9f367562b9fb17cef526109d9e0 Mon Sep 17 00:00:00 2001
From: Eduardo Julian
Date: Sat, 2 Dec 2017 01:10:12 -0400
Subject: - Added new "lux in-module" procedure for changing the module while
 analysing an expression.

---
 .../source/luxc/lang/analysis/procedure/common.lux | 28 ++++++++++++++++++----
 1 file changed, 23 insertions(+), 5 deletions(-)

(limited to 'new-luxc/source/luxc')

diff --git a/new-luxc/source/luxc/lang/analysis/procedure/common.lux b/new-luxc/source/luxc/lang/analysis/procedure/common.lux
index b003edfa7..ecdcd0bfd 100644
--- a/new-luxc/source/luxc/lang/analysis/procedure/common.lux
+++ b/new-luxc/source/luxc/lang/analysis/procedure/common.lux
@@ -20,6 +20,7 @@
                         [".A" type]))))
 
 (exception: #export Incorrect-Procedure-Arity)
+(exception: #export Invalid-Syntax)
 
 ## [Utils]
 (type: #export Proc
@@ -80,7 +81,7 @@
 
 ## [Analysers]
 ## "lux is" represents reference/pointer equality.
-(def: (lux-is proc)
+(def: (lux//is proc)
   (-> Text Proc)
   (function [analyse eval args]
     (do macro.Monad<Meta>
@@ -90,7 +91,7 @@
 
 ## "lux try" provides a simple way to interact with the host platform's
 ## error-handling facilities.
-(def: (lux-try proc)
+(def: (lux//try proc)
   (-> Text Proc)
   (function [analyse eval args]
     (case args
@@ -127,6 +128,22 @@
       _
       (&.throw Incorrect-Procedure-Arity (wrong-arity proc +2 (list.size args))))))
 
+(def: (lux//in-module proc)
+  (-> Text Proc)
+  (function [analyse eval argsC+]
+    (case argsC+
+      (^ (list [_ (#.Text module-name)] exprC))
+      (&.with-current-module module-name
+        (analyse exprC))
+      
+      _
+      (&.throw Invalid-Syntax (format "Procedure: " proc "\n"
+                                      "   Inputs:" (|> argsC+
+                                                       list.enumerate
+                                                       (list/map (function [[idx argC]]
+                                                                   (format "\n  " (%n idx) " " (%code argC))))
+                                                       (text.join-with "")) "\n")))))
+
 (do-template [<name> <analyser>]
   [(def: (<name> proc)
      (-> Text Proc)
@@ -158,13 +175,14 @@
 (def: lux-procs
   Bundle
   (|> (dict.new text.Hash<Text>)
-      (install "is" lux-is)
-      (install "try" lux-try)
+      (install "is" lux//is)
+      (install "try" lux//try)
       (install "function" lux//function)
       (install "case" lux//case)
       (install "check" lux//check)
       (install "coerce" lux//coerce)
-      (install "check type" lux//check//type)))
+      (install "check type" lux//check//type)
+      (install "in-module" lux//in-module)))
 
 (def: io-procs
   Bundle
-- 
cgit v1.2.3