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

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

[nongnu] elpa/geiser-kawa 266413b 038/119: Refactor: replace Kawa proced


From: Philip Kaludercic
Subject: [nongnu] elpa/geiser-kawa 266413b 038/119: Refactor: replace Kawa procedures with primitive methods + update kawa-devutil dep
Date: Sun, 1 Aug 2021 18:30:34 -0400 (EDT)

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

    Refactor: replace Kawa procedures with primitive methods + update 
kawa-devutil dep
---
 elisp/geiser-kawa.el                               |   4 +-
 pom.xml                                            |   2 +-
 src/main/java/kawageiser/Geiser.java               |  76 +++++++++++++---
 src/main/java/kawageiser/GeiserAutodoc.java        | 101 ++++++++++-----------
 src/main/java/kawageiser/GeiserCompleteModule.java |  59 +++---------
 src/main/java/kawageiser/GeiserCompleteSymbol.java |  44 +--------
 src/main/java/kawageiser/GeiserEval.java           |  29 +-----
 src/main/java/kawageiser/GeiserLoadFile.java       |  24 +----
 src/main/java/kawageiser/GeiserMacroexpand.java    |  24 ++---
 src/main/java/kawageiser/GeiserNoValues.java       |  11 +--
 .../geiserDoc/ManualEpubUnzipToTmpDir.java         |  26 ++----
 .../java/kawageiser/java/GeiserCompleteJava.java   |  48 +++-------
 12 files changed, 165 insertions(+), 283 deletions(-)

diff --git a/elisp/geiser-kawa.el b/elisp/geiser-kawa.el
index cf55eb8..14b4f05 100644
--- a/elisp/geiser-kawa.el
+++ b/elisp/geiser-kawa.el
@@ -186,6 +186,7 @@
              (format
               "(geiser:eval (interaction-environment) %S)"
               (cadr args))))
+       (setq moo send-this)
        send-this))
 
     ((load-file compile-file)
@@ -248,9 +249,8 @@
 
 ;;;; Support for manual in .epub format
 
-;; FIXME: port old scheme logic to java
 (cl-defun geiser-kawa--manual-epub-unzip-to-tmpdir
-    (&optional (epub-path geiser-kawa--manual))
+    (&optional (epub-path geiser-kawa-manual-path))
   "Unzip the .epub file with kawa/java, since:
 - kawa is already a dependency
 - kawa/java is more portable that using emacs' arc-mode, which relies
diff --git a/pom.xml b/pom.xml
index 37e1ed1..8efbdb8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,7 +63,7 @@
         <dependency>
             <groupId>com.gitlab.spellcard199</groupId>
             <artifactId>kawa-devutil</artifactId>
-            <version>833e0805034a5479496e454f4d9645a46d8f136b</version>
+            <version>5f6dd112820e2c56bb2456edb069d4e2c8c5bc64</version>
         </dependency>
 
         <!-- https://mvnrepository.com/artifact/org.testng/testng -->
diff --git a/src/main/java/kawageiser/Geiser.java 
b/src/main/java/kawageiser/Geiser.java
index 4c57b92..4574c7d 100644
--- a/src/main/java/kawageiser/Geiser.java
+++ b/src/main/java/kawageiser/Geiser.java
@@ -6,27 +6,73 @@
 package kawageiser;
 
 import gnu.expr.Language;
-import kawageiser.geiserDoc.ManualEpubUnzipToTmpDir;
-import kawageiser.java.GeiserCompleteJava;
 
 public class Geiser implements Runnable {
+
     private static boolean prettyPrintResult = true;
-    public static boolean isPrettyPrintResult() { return prettyPrintResult; }
-    public static boolean isPrettyPrintOutput() { return 
GeiserEval.evaluator.isPrettyPrintOutput(); }
-    public static void setPrettyPrintResult(boolean v) { prettyPrintResult = 
v; }
-    public static void setPrettyPrintOutput(boolean v) { 
GeiserEval.evaluator.setPrettyPrintOutput(v); }
+
+    public static boolean isPrettyPrintResult() {
+        return prettyPrintResult;
+    }
+
+    public static boolean isPrettyPrintOutput() {
+        return GeiserEval.evaluator.isPrettyPrintOutput();
+    }
+
+    public static void setPrettyPrintResult(boolean v) {
+        prettyPrintResult = v;
+    }
+
+    public static void setPrettyPrintOutput(boolean v) {
+        GeiserEval.evaluator.setPrettyPrintOutput(v);
+    }
 
     @Override
     public void run() {
+
         Language lang = Language.getDefaultLanguage();
-        lang.defineFunction(new GeiserEval("geiser:eval"));
-        lang.defineFunction(new GeiserNoValues("geiser:no-values"));
-        lang.defineFunction(new GeiserLoadFile("geiser:load-file"));
-        lang.defineFunction(new GeiserCompleteSymbol("geiser:completions"));
-        lang.defineFunction(new 
GeiserCompleteModule("geiser:module-completions"));
-        lang.defineFunction(new GeiserAutodoc("geiser:autodoc", lang));
-        lang.defineFunction(new GeiserCompleteJava("geiser:complete-java"));
-        lang.defineFunction(new 
ManualEpubUnzipToTmpDir("geiser:manual-epub-unzip-to-tmp-dir"));
-        lang.defineFunction(new GeiserMacroexpand("geiser:macroexpand"));
+
+        // In a previous version definitions were like this:
+        // lang.defineFunction(new GeiserEval("geiser:eval"));
+        // However, that meant you were forced to extend Procedure1, 
Procedure2, ...
+        // which can only have arguments of type Object and must be instanced 
to be used.
+        // This means that compared to static methods you don't have:
+        // - parameter names in autodoc: I couldn't find a way to get 
parameter names for instance methods
+        // - parameter types in autodoc: because their types must be be Object
+        // - type warnings: for the same reason of the previous point
+        // Another advantage with this new approach is we don't have to add 
all the boilerplate
+        // for checking argument types.
+        try {
+            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"));
+        } catch (Throwable throwable) {
+            throwable.printStackTrace();
+        }
     }
+
 }
diff --git a/src/main/java/kawageiser/GeiserAutodoc.java 
b/src/main/java/kawageiser/GeiserAutodoc.java
index 5a49a46..f393cb4 100644
--- a/src/main/java/kawageiser/GeiserAutodoc.java
+++ b/src/main/java/kawageiser/GeiserAutodoc.java
@@ -11,43 +11,38 @@ import gnu.kawa.functions.Format;
 import gnu.lists.LList;
 import gnu.mapping.Environment;
 import gnu.mapping.Procedure;
-import gnu.mapping.Procedure1or2;
 import gnu.mapping.Symbol;
 import kawadevutil.data.ParamData;
 import kawadevutil.data.ProcDataGeneric;
 import kawadevutil.data.ProcDataNonGeneric;
+import kawadevutil.eval.EvalResult;
 import kawadevutil.kawa.GnuMappingLocation;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
-public class GeiserAutodoc extends Procedure1or2 {
+public class GeiserAutodoc {
 
     public static boolean showTypes = true;
-    Language lang;
 
-    GeiserAutodoc(String name, Language lang) {
-        super(name);
-        this.lang = lang;
-    }
-
-    // TODO: find the "right" way to get modules for symbols.
-    // TODO: support for procedures defined in java, like `append'
-    // TODO: support for macros (possible?)
-    // TODO: support for getting parameter names for java instance
+    // TODO: Find the "right" way to get modules for symbols.
+    // TODO: Support for macros (possible?)
+    // TODO: Support for getting parameter names for java instance
     //       methods getMethods bytecode with ClassType (not so simple)
-    // TODO: support names with special characters, like |a[)|
+    // TODO: Support names with special characters, like |a[)|
+    //       Problem is that resulting name is without the || around
+    //       the name and since the name that emacs is different from
+    //       the one we are given back autodoc is not accepted as valid
     //       Maybe we can:
     //       1. keep a list of special chars
     //       2. when `id' contains one: surround with || (e.g. |id|)
-    // TODO: consider multiple ids:
+    // TODO: Consider multiple ids:
     //  - Examples: to get more add (message (format "(geiser:%s %s)" proc 
form))
     //              in the t clause of the geiser-kawa--geiser-procedure:
     //   - (display [cursor] -> (geiser:autodoc ’(display))
     //   - (display (symbol? (string->symbol [cursor] -> (geiser:autodoc 
’(string->symbol symbol? display))
 
-
     // At the moment arguments are enclosed in double quotes. The
     // reason is that geiser's output is `read' by elisp, but java types
     // may contain characters that are not valid in elisp symbols
@@ -61,38 +56,32 @@ public class GeiserAutodoc extends Procedure1or2 {
     // return (new SymToAutodoc()).apply2(symId, env);
     // })
 
-    // @Override
-    public Object apply1(Object ids) {
-        return apply2(ids, Language.getDefaultLanguage().getEnvironment());
+    public static String autodoc(LList ids) {
+        Language language = Language.getDefaultLanguage();
+        return autodoc(ids, language, language.getEnvironment());
     }
 
-    // @Override
-    public Object apply2(Object ids, Object env) {
+    public static String autodoc(LList ids, Environment env) {
+        Language language = Language.getDefaultLanguage();
+        return autodoc(ids, language, env);
+    }
 
-        if (!LList.class.isAssignableFrom(ids.getClass())) {
-            throw new IllegalArgumentException(String.format(
-                    "GeiserAutodoc's 1st arg should be a gnu.lists.LList"));
-        }
-        if (!Environment.class.isAssignableFrom(env.getClass())) {
-            throw new IllegalArgumentException(String.format(
-                    "GeiserAutodoc's 2nd arg should be a 
gnu.mapping.Environment"));
-        }
+    public static String autodoc(LList ids, Language lang, Environment env) {
+        String formattedAutodoc = null;
         try {
             ArrayList<Object> autodocList = new ArrayList<>();
             for (Object symId : (LList) ids) {
                 AutodocDataForSymId autodocDataForSymId =
-                        new AutodocDataForSymId((Symbol) symId, (Environment) 
env, this.lang);
+                        new AutodocDataForSymId((Symbol) symId, env, lang);
                 autodocList.add(autodocDataForSymId.toLList());
             }
-            String formattedAutodoc =
-                    Format
-                            .format("~S", LList.makeList(autodocList))
-                            .toString();
-            return formattedAutodoc;
+            formattedAutodoc = Format
+                    .format("~S", LList.makeList(autodocList))
+                    .toString();
         } catch (Throwable throwable) {
             throwable.printStackTrace();
-            return throwable;
         }
+        return formattedAutodoc;
     }
 
     public static class OperatorArgListData {
@@ -129,7 +118,7 @@ public class GeiserAutodoc extends Procedure1or2 {
             } else if (!isOptionalParam && !showTypes) {
                 return formatParam(param, "~a");
             } else {
-                throw new Error("No worries, can't happen (2 booleans == 4 
possibilities)." +
+                throw new Error("No worries, this clause can't happen (2 
booleans == 4 possibilities)." +
                         "Just silencing the \"Missing return statement\" 
error.");
             }
         }
@@ -195,7 +184,7 @@ public class GeiserAutodoc extends Procedure1or2 {
     public static class AutodocDataForSymId {
         private boolean symExists;
         private Symbol symId;
-        private Object operator;
+        private Optional<Object> operatorMaybe;
         private Environment environment;
         private Optional<OperatorArgListData> operatorArgListMaybe;
         // TODO: fix type, write way to get it
@@ -206,33 +195,35 @@ public class GeiserAutodoc extends Procedure1or2 {
             this.symId = symId;
             this.environment = env;
 
+            Optional<Object> operatorMaybe = Optional.empty();
             Optional<OperatorArgListData> operatorArgListMaybe = 
Optional.empty();
-            Object operator = null;
-            boolean symExists = false;
             try {
-                // env.get(symId) works with the < procedure, while 
lang.eval(symId.toString())
-                // raises NullPointerException (maybe a bug?).
+                // env.get(symId) works with the < procedure, while
+                // lang.eval(symId.toString()) raises NullPointerException 
(maybe a bug?).
                 // On the other hand, env.get(symId) does not work with 
procedures defined
                 // from java with lang.defineFunction(), like the various 
geiser:...
                 // Since kawadevutil's eval works for both we are using that 
for now.
-                operator = GeiserEval.evaluator.eval(lang, env, 
symId).getResult();
-                symExists = true;  // If it didn't exist env.get(symId) would 
have raised UnboundLocationException
-                if (!Procedure.class.isAssignableFrom(operator.getClass())) {
+                EvalResult evalResult = GeiserEval.evaluator.eval(lang, env, 
symId);
+                operatorMaybe = evalResult.getResult() != null
+                        ? Optional.of(evalResult.getResult())
+                        : Optional.empty();
+                if (operatorMaybe.isPresent() && 
Procedure.class.isAssignableFrom(operatorMaybe.get().getClass())) {
+                    Procedure operator = (Procedure) operatorMaybe.get();
+                    ProcDataGeneric procDataGeneric = 
ProcDataGeneric.makeForProcedure(operator);
+                    operatorArgListMaybe = Optional.of(new 
OperatorArgListData(procDataGeneric));
+                } else {
                     // Not a procedure
                     // TODO : is it possible to implement autodoc for macros?
                     //        If not: write a comment why.
                     operatorArgListMaybe = Optional.empty();
-                } else {
-                    ProcDataGeneric procDataGeneric = 
ProcDataGeneric.makeForProcedure((Procedure) operator);
-                    operatorArgListMaybe = Optional.of(new 
OperatorArgListData(procDataGeneric));
                 }
             } catch (Throwable throwable) {
                 throwable.printStackTrace();
             }
 
             this.operatorArgListMaybe = operatorArgListMaybe;
-            this.operator = operator;
-            this.symExists = symExists;
+            this.operatorMaybe = operatorMaybe;
+            this.symExists = operatorMaybe.isPresent();
         }
 
         public LList toLList() {
@@ -251,8 +242,8 @@ public class GeiserAutodoc extends Procedure1or2 {
             // TODO: When we find the correct way to do it, refactor 
moduleValue inside
             //       ProcDataNonGeneric or a generic wrapper for Procedure data
             LList moduleValue = null;
-            if (operator.getClass() == CompiledProc.class) {
-                CompiledProc compProc = (CompiledProc) operator;
+            if (operatorMaybe.isPresent() && operatorMaybe.get().getClass() == 
CompiledProc.class) {
+                CompiledProc compProc = (CompiledProc) operatorMaybe.get();
                 moduleValue = LList.makeList(
                         java.util.Arrays
                                 .asList(compProc
@@ -289,26 +280,26 @@ public class GeiserAutodoc extends Procedure1or2 {
             //   java.lang.String:format
             // so geiser ignores it.
             String symIdAsStr = symId.toString();
-            LList returnMe;
+            LList res;
             if (moduleValue.size() > 0) {
                 ArrayList<Object> moduleList = new ArrayList<>();
                 moduleList.add("module");
                 for (Object m : moduleValue) {
                     moduleList.add(Symbol.valueOf(m.toString()));
                 }
-                returnMe = LList.list3(
+                res = LList.list3(
                         symIdAsStr,
                         operatorArgListAsLList,
                         LList.makeList(moduleList)
                 );
             } else {
-                returnMe = LList.list2(
+                res = LList.list2(
                         symIdAsStr,
                         operatorArgListAsLList
                 );
             }
 
-            return returnMe;
+            return res;
         }
     }
 }
diff --git a/src/main/java/kawageiser/GeiserCompleteModule.java 
b/src/main/java/kawageiser/GeiserCompleteModule.java
index fe00508..4a7d1f4 100644
--- a/src/main/java/kawageiser/GeiserCompleteModule.java
+++ b/src/main/java/kawageiser/GeiserCompleteModule.java
@@ -6,59 +6,31 @@
 package kawageiser;
 
 import gnu.expr.Language;
-import gnu.lists.IString;
 import gnu.lists.LList;
 import gnu.mapping.Environment;
-import gnu.mapping.Procedure1or2;
+import gnu.mapping.NamedLocation;
 import kawadevutil.kawa.GnuMappingLocation;
 
 import java.util.ArrayList;
 
+public class GeiserCompleteModule {
 
-public class GeiserCompleteModule extends Procedure1or2 {
-
-    GeiserCompleteModule(String name) {
-        super(name);
-    }
-
-    @Override
-    public Object apply1(Object prefix) throws Throwable {
-        return apply2(
-                prefix,
-                Language.getDefaultLanguage().getEnvironment());
+    public static String completeModule(String prefix) {
+        return completeModule(prefix, 
Language.getDefaultLanguage().getEnvironment());
     }
 
-    @Override
-    public Object apply2(Object prefix, Object env) throws Throwable {
-
-        String prefixStr = null;
-        if (prefix instanceof String) {
-            prefixStr = (String) prefix;
-        } else if (prefix instanceof IString) {
-            prefixStr = prefix.toString();
-        } else {
-            throw new IllegalArgumentException(
-                    "`prefix' arg should be either a String or an IString");
-        }
-
-        Environment castedEnv;
-        if (Environment.class.isAssignableFrom(env.getClass())) {
-            castedEnv = (Environment) env;
-        } else {
-            throw new IllegalArgumentException(
-                    "`env' arg should be an gnu.mapping.Environment");
-        }
-
-        ArrayList<String> moduleCompletions = getCompletions(prefixStr, 
castedEnv);
+    public static String completeModule(String prefix, Environment env) {
+        ArrayList<String> moduleCompletions = getCompletions(prefix, env);
         // Geiser protocol wants modules in the result to be printed
         // between double quotes
         // ("(... ... ...)" "(... ...)")
         // Kawa repl doesn't show returned strings with surrounding
         // quotes, so we have to manually surround completions.
-        return gnu.kawa.functions.Format.format("~S", 
LList.makeList(moduleCompletions));
+        return gnu.kawa.functions.Format.format(
+                "~S", LList.makeList(moduleCompletions)).toString();
     }
 
-    private ArrayList<String> getCompletions(String prefix, Environment env) {
+    public static ArrayList<String> getCompletions(String prefix, Environment 
env) {
 
         ArrayList<String> moduleCompletions = new ArrayList<>();
 
@@ -68,14 +40,11 @@ public class GeiserCompleteModule extends Procedure1or2 {
         // TODO: this is an hack. If it exists, find a way to list
         //       modules directly.
         env.enumerateAllLocations().forEachRemaining(
-                loc ->
-                {
-                    String moduleStrRepr = GnuMappingLocation
-                            .baseLocationToModuleName(loc.getBase());
-                    if ((!moduleCompletions.contains(moduleStrRepr))
-                            && (!(moduleStrRepr.equals("")))
-                            && (moduleStrRepr.startsWith(prefix))
-                    ) {
+                (NamedLocation loc) -> {
+                    String moduleStrRepr = 
GnuMappingLocation.baseLocationToModuleName(loc.getBase());
+                    if (!moduleCompletions.contains(moduleStrRepr)
+                            && !moduleStrRepr.equals("")
+                            && moduleStrRepr.startsWith(prefix)) {
                         moduleCompletions.add(moduleStrRepr);
                     }
                 }
diff --git a/src/main/java/kawageiser/GeiserCompleteSymbol.java 
b/src/main/java/kawageiser/GeiserCompleteSymbol.java
index 5dda5c7..7c17397 100644
--- a/src/main/java/kawageiser/GeiserCompleteSymbol.java
+++ b/src/main/java/kawageiser/GeiserCompleteSymbol.java
@@ -5,56 +5,20 @@
 
 package kawageiser;
 
-import gnu.expr.Language;
 import gnu.lists.IString;
 import gnu.lists.LList;
 import gnu.mapping.Environment;
-import gnu.mapping.Procedure1or2;
 import gnu.mapping.Symbol;
 
 import java.util.ArrayList;
 
-public class GeiserCompleteSymbol extends Procedure1or2 {
+public class GeiserCompleteSymbol {
 
-    GeiserCompleteSymbol(String name) {
-        super(name);
+    public static LList getCompletions(IString prefix) {
+        return getCompletions(prefix, Environment.user());
     }
 
-    @Override
-    public Object apply1(Object prefix) {
-        return apply2(
-                prefix,
-                Language.getDefaultLanguage().getEnvironment());
-    }
-
-    @Override
-    public Object apply2(Object prefix, Object module) {
-
-        String prefixStr = null;
-        if (prefix instanceof String) {
-            prefixStr = (String) prefix;
-        } else if (prefix instanceof IString) {
-            prefixStr = prefix.toString();
-        } else {
-            throw new IllegalArgumentException(
-                    "prefix arg should be either String or IString");
-        }
-
-        Environment env = null;
-        if (Environment.class.isAssignableFrom(module.getClass())) {
-            // already an Environment
-            env = (Environment) module;
-        } else if (kawa.lib.lists.isList(module)) {
-            env = kawa.lib.scheme.eval.environment$V(((LList) module));
-        } else {
-            throw new IllegalArgumentException(
-                    "module argument should be either a proper list or an 
Environment.");
-        }
-
-        return getCompletions(prefixStr, env);
-    }
-
-    private LList getCompletions(String prefix, Environment env) {
+    public static LList getCompletions(IString prefix, Environment env) {
         ArrayList<Symbol> resultArrList = new ArrayList<>();
         env.enumerateAllLocations().forEachRemaining(
                 loc -> {
diff --git a/src/main/java/kawageiser/GeiserEval.java 
b/src/main/java/kawageiser/GeiserEval.java
index 842d7b1..1d99542 100644
--- a/src/main/java/kawageiser/GeiserEval.java
+++ b/src/main/java/kawageiser/GeiserEval.java
@@ -10,13 +10,12 @@ import gnu.lists.IString;
 import gnu.lists.LList;
 import gnu.lists.Pair;
 import gnu.mapping.Environment;
-import gnu.mapping.Procedure2;
 import gnu.mapping.Symbol;
 import kawadevutil.eval.EvalResult;
 import kawadevutil.eval.EvalResultAndOutput;
 import kawadevutil.redirect.RedirectedOutErr;
 
-public class GeiserEval extends Procedure2 {
+public class GeiserEval {
     /*
      *  Actual evaluation happens in kawadevutil.eval.Eval.
      *  Here we are just sending arguments and converting our own
@@ -24,13 +23,8 @@ public class GeiserEval extends Procedure2 {
      */
     public static kawadevutil.eval.Eval evaluator = new 
kawadevutil.eval.Eval();
 
-    GeiserEval(String procName) {
-        super(procName);
-    }
-
-    @Override
-    public String
-    apply2(Object module, Object codeStr) {
+    public static String
+    evalStr(Environment module, IString codeIStr) {
         // The reason this method takes a string instead of a quoted sexpr has 
been solved
         // on 2019-12-19 in Kawa's master branch:
         // 
https://gitlab.com/kashell/Kawa/-/commit/537e135c0101194702ebee53faf92b98a4ea8c6b
@@ -45,22 +39,7 @@ public class GeiserEval extends Procedure2 {
         //      (print send-this)
         //      send-this))
         //
-
-        String code;
-        if (codeStr instanceof IString) {
-            code = ((IString) codeStr).toString();
-        } else if (codeStr instanceof String) {
-            code = (String) codeStr;
-        } else {
-            throw new IllegalArgumentException(
-                    "`codeStr' arg should be either a String or an IString");
-        }
-        return evalStr((Environment) module, code);
-    }
-
-    public static String
-    evalStr(Environment module, String codeStr) {
-        EvalResultAndOutput resOutErr = evaluator.evalCatchingOutErr(module, 
codeStr);
+        EvalResultAndOutput resOutErr = evaluator.evalCatchingOutErr(module, 
codeIStr.toString());
         return formatGeiserProtocol(evaluationDataToGeiserProtocol(resOutErr));
     }
 
diff --git a/src/main/java/kawageiser/GeiserLoadFile.java 
b/src/main/java/kawageiser/GeiserLoadFile.java
index 0ad10f1..6904c84 100644
--- a/src/main/java/kawageiser/GeiserLoadFile.java
+++ b/src/main/java/kawageiser/GeiserLoadFile.java
@@ -6,32 +6,12 @@
 package kawageiser;
 
 import gnu.expr.Language;
-import gnu.lists.IString;
 import gnu.lists.LList;
-import gnu.mapping.Procedure1;
 import kawa.standard.load;
 
-public class GeiserLoadFile extends Procedure1 {
+public class GeiserLoadFile {
 
-    GeiserLoadFile(String name) {
-        super(name);
-    }
-
-    @Override
-    public Object apply1(Object o) throws Throwable {
-        String filepath;
-        if (o instanceof String) {
-            filepath = (String) o;
-        } else if (o instanceof IString) {
-            filepath = ((IString) o).toString();
-        } else {
-            throw new IllegalArgumentException(
-                    "geiser:load should take a String or an IString as 
argument");
-        }
-        return load(filepath);
-    }
-
-    public Object load(String filepath) {
+    public static String loadFile(String filepath) {
         return GeiserEval.evalForm(
                 Language.getDefaultLanguage().getEnvironment(),
                 LList.list2(load.load, filepath));
diff --git a/src/main/java/kawageiser/GeiserMacroexpand.java 
b/src/main/java/kawageiser/GeiserMacroexpand.java
index 32e982f..e0295b8 100644
--- a/src/main/java/kawageiser/GeiserMacroexpand.java
+++ b/src/main/java/kawageiser/GeiserMacroexpand.java
@@ -9,28 +9,20 @@ import gnu.expr.Language;
 import gnu.kawa.functions.Format;
 import gnu.kawa.slib.syntaxutils;
 import gnu.mapping.Environment;
-import gnu.mapping.Procedure1or2;
 
-public class GeiserMacroexpand extends Procedure1or2 {
+public class GeiserMacroexpand {
 
-    GeiserMacroexpand(String name) {
-        super(name);
+    public static String expand(Object form) throws Throwable {
+        return expand(form, true);
     }
 
-    @Override
-    public Object apply1(Object form) throws Throwable {
-        return apply2(form, false);
-    }
-
-    @Override
-    public Object apply2(Object form, Object all) throws Throwable {
-        // I think Kawa macro expansion can only expand to the whole tree, so:
-        // 1. There is no macroexpand-1
-        // 2. The `all' argument that geiser passes is ignored
+    public static String expand(Object form, boolean all) throws Throwable {
+        // `all' is ignored: geiser passes #t or #f depending on whether it 
needs
+        // expand-1 or expand-all, but Kawa's `expand' can only expand the 
whole tree.
         return expand(form, Language.getDefaultLanguage().getEnvironment());
     }
 
-    public Object expand(Object form, Environment env) throws Throwable {
+    public static String expand(Object form, Environment env) throws Throwable 
{
         // TODO: How do you invoke kawa procedures with keyword arguments from 
java?
         //  - ignoring env and using apply1, for now
         //  - an alternative would be to port gnu.kawa.slib.syntaxutils.expand 
from scheme to java (it's easy)
@@ -69,6 +61,6 @@ public class GeiserMacroexpand extends Procedure1or2 {
         // Double formatting so that double quotes around strings are not lost.
         return Format.format(
                 "~S",
-                Format.format("~S", expanded));
+                Format.format("~S", expanded)).toString();
     }
 }
diff --git a/src/main/java/kawageiser/GeiserNoValues.java 
b/src/main/java/kawageiser/GeiserNoValues.java
index b15b29c..dddade4 100644
--- a/src/main/java/kawageiser/GeiserNoValues.java
+++ b/src/main/java/kawageiser/GeiserNoValues.java
@@ -5,20 +5,15 @@
 
 package kawageiser;
 
-import gnu.mapping.Procedure0;
 import gnu.mapping.Values;
 
-public class GeiserNoValues extends Procedure0 {
+public class GeiserNoValues {
 
-    GeiserNoValues(String name) {
-        super(name);
-    }
-
-    @Override
-    public Object apply0() throws Throwable {
+    public static Object noValues() {
         gnu.kawa.io.InPort.inDefault().setLineNumber(
                 gnu.kawa.io.InPort.inDefault().getLineNumber() - 1);
         // apply0 signature doesn't allow us to return void
         return Values.FromArray.make();
     }
+
 }
diff --git a/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java 
b/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java
index f24b035..170c2de 100644
--- a/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java
+++ b/src/main/java/kawageiser/geiserDoc/ManualEpubUnzipToTmpDir.java
@@ -1,31 +1,17 @@
 /*
- * Copyright (C) 2020 spellcard199 <spellcard199@protonmail.com>           
+ * Copyright (C) 2020 spellcard199 <spellcard199@protonmail.com>
  * This is free software;  for terms and warranty disclaimer see ./COPYING.
  */
 
 package kawageiser.geiserDoc;
 
-import gnu.lists.IString;
-import gnu.mapping.Procedure1;
-
 import java.io.File;
+import java.io.IOException;
 import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.List;
-
-public class ManualEpubUnzipToTmpDir extends Procedure1 {
 
-    public ManualEpubUnzipToTmpDir(String name) {
-        super(name);
-    }
+public class ManualEpubUnzipToTmpDir {
 
-    @Override
-    public Object apply1(Object kawaEpubManualPath) throws Throwable {
-        if (! (kawaEpubManualPath.getClass() == String.class ||
-                kawaEpubManualPath.getClass() == IString.class)) {
-            throw new IllegalArgumentException(
-                    "`kawaEpubManualPath' arg must be either String or 
IString");
-        }
+    public static String unzipToTmpDir(String kawaEpubManualPath) throws 
IOException {
         String systemTmpDir = System.getProperty("java.io.tmpdir");
         String manualUnzippedTmpDir = String.join(
                 File.separator,
@@ -33,10 +19,10 @@ public class ManualEpubUnzipToTmpDir extends Procedure1 {
                 "geiser-kawa",
                 "manual-epub-unzipped");
 
-        File zipArchiveFile = new File(kawaEpubManualPath.toString());
+        File zipArchiveFile = new File(kawaEpubManualPath);
         Path destDirPath = new File(manualUnzippedTmpDir).toPath();
 
         kawadevutil.util.ZipExtractor.unzip(zipArchiveFile, destDirPath);
-        return gnu.kawa.functions.Format.format("~S", manualUnzippedTmpDir);
+        return gnu.kawa.functions.Format.format("~S", 
manualUnzippedTmpDir).toString();
     }
 }
diff --git a/src/main/java/kawageiser/java/GeiserCompleteJava.java 
b/src/main/java/kawageiser/java/GeiserCompleteJava.java
index b9cb060..ec4d2b7 100644
--- a/src/main/java/kawageiser/java/GeiserCompleteJava.java
+++ b/src/main/java/kawageiser/java/GeiserCompleteJava.java
@@ -9,7 +9,6 @@ import gnu.expr.Language;
 import gnu.lists.IString;
 import gnu.lists.LList;
 import gnu.mapping.Environment;
-import gnu.mapping.Procedure4;
 import gnu.math.IntNum;
 import kawadevutil.complete.*;
 
@@ -19,44 +18,24 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
 
-public class GeiserCompleteJava extends Procedure4 {
+public class GeiserCompleteJava {
 
-    public static boolean showTypes = true;
-
-    public GeiserCompleteJava(String name) {
-        super(name);
-    }
-
-    @Override
-    public Object
-    apply4(Object codeStr, Object cursorIndex, Object lang, Object env) throws 
Throwable {
-
-        String codeStrChecked = null;
-        if (codeStr.getClass().equals(IString.class) || 
codeStr.getClass().equals(String.class)) {
-            codeStrChecked = codeStr.toString();
-        } else {
-            throw new IllegalArgumentException(
-                    "`codeStr` must be either String or IString: " + 
codeStr.getClass().toString());
-        }
-
-        Integer cursorIndexChecked = null;
-        if (cursorIndex.getClass().equals(Integer.class)) {
-            cursorIndexChecked = (Integer) cursorIndex;
-        } else if (cursorIndex.getClass().equals(IntNum.class)) {
-            cursorIndexChecked = ((IntNum) cursorIndex).intValue();
-        } else {
-            throw new IllegalArgumentException(
-                    "`cursorIndex` must be either Integer or IntNum: "
-                            + cursorIndex.getClass().toString());
-        }
+    public static String
+    completeJava(IString codeStr, IntNum cursorIndex, Language lang, 
Environment env)
+            throws Throwable {
 
         // Get Data
         Optional<CompletionDataForJava> complDataMaybe = 
kawadevutil.complete.Complete.complete(
-                codeStrChecked, cursorIndexChecked, (Language) lang, 
(Environment) env, (String name) -> true);
+                codeStr.toString(),
+                Integer.valueOf(cursorIndex.toString()),
+                lang,
+                env,
+                (String name) -> true);
 
         // Wrap data of interest in Scheme's LList
+        String resAsStr;
         if (!complDataMaybe.isPresent()) {
-            return LList.Empty;
+            resAsStr = gnu.kawa.functions.Format.format("~A", 
LList.Empty).toString();
         } else {
             CompletionDataForJava complData = complDataMaybe.get();
             LList res = null;
@@ -69,8 +48,10 @@ public class GeiserCompleteJava extends Procedure4 {
                 throw new Error("[BUG SPOTTED] `complData's class is one not 
expected: "
                         + complData.getClass().toString());
             }
-            return gnu.kawa.functions.Format.format("~S", res);
+            resAsStr = gnu.kawa.functions.Format.format("~S", res).toString();
         }
+
+        return resAsStr;
     }
 
     private static LList toLList(CompletionDataForJavaFOM complData) {
@@ -112,5 +93,4 @@ public class GeiserCompleteJava extends Procedure4 {
         );
         return res;
     }
-
 }



reply via email to

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