emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/geiser-kawa 47a2956 044/119: Refactor kawageiser.Geiser.ja


From: Philip Kaludercic
Subject: [nongnu] elpa/geiser-kawa 47a2956 044/119: Refactor kawageiser.Geiser.java
Date: Sun, 1 Aug 2021 18:30:35 -0400 (EDT)

branch: elpa/geiser-kawa
commit 47a2956bf75a356dd5f2d21da20127e55f549990
Author: spellcard199 <spellcard199@protonmail.com>
Commit: spellcard199 <spellcard199@protonmail.com>

    Refactor kawageiser.Geiser.java
---
 src/main/java/kawageiser/Geiser.java | 68 ++++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 30 deletions(-)

diff --git a/src/main/java/kawageiser/Geiser.java 
b/src/main/java/kawageiser/Geiser.java
index 8b06efb..0599b9c 100644
--- a/src/main/java/kawageiser/Geiser.java
+++ b/src/main/java/kawageiser/Geiser.java
@@ -7,6 +7,9 @@ package kawageiser;
 
 import gnu.expr.Language;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public class Geiser implements Runnable {
 
     private static boolean prettyPrintResult = true;
@@ -29,9 +32,6 @@ public class Geiser implements Runnable {
 
     @Override
     public void run() {
-
-        Language lang = Language.getDefaultLanguage();
-
         // In a previous version, geiser's procedures definitions were like 
this:
         // lang.defineFunction(new GeiserEval("geiser:eval"));
         // That meant you had to extend Procedure1, Procedure2... which can 
only have
@@ -41,43 +41,51 @@ public class Geiser implements Runnable {
         // - parameter types in autodoc: because their types can be other than 
Object
         // - type warnings: for the same reason of the previous point
         // - less boilerplate for checking argument types
+
+        Language lang = Language.getDefaultLanguage();
+
+        // TODO: find out how to make a new working PrimProcedure from Method
+        //  and replace methods paths as string with PrimProcedure. This would 
avoid Kawa-specific syntax.
+        HashMap<String, String> procMap = new java.util.HashMap<>();
+        procMap.put("geiser:eval", "kawageiser.GeiserEval:evalStr");
+        procMap.put("geiser:autodoc", "kawageiser.GeiserAutodoc:autodoc");
+        procMap.put("geiser:module-completions", 
"kawageiser.GeiserCompleteModule:completeModule");
+        procMap.put("geiser:load-file", "kawageiser.GeiserLoadFile:loadFile");
+        procMap.put("geiser:completions", 
"kawageiser.GeiserCompleteSymbol:getCompletions");
+        procMap.put("geiser:no-values", "kawageiser.GeiserNoValues:noValues");
+        procMap.put("geiser:complete-java", 
"kawageiser.java.GeiserCompleteJava:completeJava");
+        procMap.put("geiser:manual-epub-unzip-to-tmp-dir", 
"kawageiser.geiserDoc.ManualEpubUnzipToTmpDir:unzipToTmpDir");
+        procMap.put("geiser:macroexpand", 
"kawageiser.GeiserMacroexpand:expand");
+
         try {
             if (lang.lookup("geiser:eval") == null) {
                 // The reason for this if block is that if someone re-imported 
this module
                 // and the following code was executed, this exception would 
happen:
                 // java.lang.IllegalStateException:
                 //   prohibited define/redefine of geiser:eval in 
#<environment kawa-environment>
-                lang.defineFunction(
-                        "geiser:eval",
-                        lang.eval("kawageiser.GeiserEval:evalStr"));
-                lang.defineFunction(
-                        "geiser:autodoc",
-                        lang.eval("kawageiser.GeiserAutodoc:autodoc"));
-                lang.defineFunction(
-                        "geiser:module-completions",
-                        
lang.eval("kawageiser.GeiserCompleteModule:completeModule"));
-                lang.defineFunction(
-                        "geiser:load-file",
-                        lang.eval("kawageiser.GeiserLoadFile:loadFile"));
-                lang.defineFunction(
-                        "geiser:completions",
-                        
lang.eval("kawageiser.GeiserCompleteSymbol:getCompletions"));
-                lang.defineFunction(
-                        "geiser:no-values",
-                        lang.eval("kawageiser.GeiserNoValues:noValues"));
-                lang.defineFunction(
-                        "geiser:complete-java",
-                        
lang.eval("kawageiser.java.GeiserCompleteJava:completeJava"));
-                lang.defineFunction(
-                        "geiser:manual-epub-unzip-to-tmp-dir",
-                        
lang.eval("kawageiser.geiserDoc.ManualEpubUnzipToTmpDir:unzipToTmpDir"));
-                lang.defineFunction(
-                        "geiser:macroexpand",
-                        lang.eval("kawageiser.GeiserMacroexpand:expand"));
+                for (Map.Entry<String, String> entry : procMap.entrySet()) {
+                    String procName = entry.getKey();
+                    String methodPathAsKawaCode = entry.getValue();
+                    // Since currently kawaDefineFunction uses lang.eval, lang 
can only be
+                    // Kawa scheme, because it supports the colon notation we 
used in procMap.
+                    kawaDefineFunction(lang, procName, methodPathAsKawaCode);
+                }
             }
         } catch (Throwable throwable) {
             throwable.printStackTrace();
         }
     }
 
+    public void kawaDefineFunction(Language lang, String procName, String 
methodPathAsKawaCode) throws Throwable {
+        // Using lang.eval is a workaround to the fact I don't know
+        // how to create a working PrimProcedure using Kawa's java api.
+        Object proc = lang.eval(methodPathAsKawaCode);
+        if (proc == null) {
+            throw new RuntimeException(String.format(
+                    "Provided kawa code for `%s' returns null: %s",
+                    procName, methodPathAsKawaCode));
+        }
+        lang.defineFunction(procName, proc);
+    }
+
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]