branch: elpa/geiser-kawa commit 47a2956bf75a356dd5f2d21da20127e55f549990 Author: spellcard199 <spellcard...@protonmail.com> Commit: spellcard199 <spellcard...@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); + } + }