Skip to content

Commit 775ea0c

Browse files
committed
Fixing LazySeq result
1 parent 2ccfb63 commit 775ea0c

File tree

3 files changed

+64
-21
lines changed

3 files changed

+64
-21
lines changed

src/com/github/beothorn/clojurecalc/ClojureCalcImpl.java

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
package com.github.beothorn.clojurecalc;
22

3-
import clojure.java.api.Clojure;
4-
import clojure.lang.IFn;
5-
import clojure.lang.LazySeq;
63
import com.sun.star.lang.XLocalizable;
74
import com.sun.star.lang.XServiceInfo;
85
import com.sun.star.lang.XSingleComponentFactory;
@@ -11,7 +8,6 @@
118
import com.sun.star.registry.XRegistryKey;
129
import com.sun.star.uno.XComponentContext;
1310
import com.sun.star.table.XCellRange;
14-
import java.util.Iterator;
1511

1612
public class ClojureCalcImpl extends WeakBase implements XServiceInfo, XLocalizable, XClojureCalc{
1713

@@ -80,23 +76,7 @@ public com.sun.star.lang.Locale getLocale()
8076

8177
public String clj(String exp)
8278
{
83-
String result;
84-
ClassLoader previous = Thread.currentThread().getContextClassLoader();
85-
final ClassLoader parentClassLoader = ClojureCalcImpl.class.getClassLoader();
86-
Thread.currentThread().setContextClassLoader(parentClassLoader);
87-
try {
88-
IFn eval = Clojure.var("clojure.core", "load-string");
89-
IFn str = Clojure.var("clojure.core", "str");
90-
IFn apply = Clojure.var("clojure.core", "apply");
91-
Object evalResult = eval.invoke(exp);
92-
result = apply.invoke(str, evalResult).toString();
93-
}catch(Exception e){
94-
result = e.getMessage();
95-
} finally {
96-
Thread.currentThread().setContextClassLoader(previous);
97-
}
98-
99-
return result;
79+
return ClojureInterpreter.runClojure(exp);
10080
}
10181

10282
public String clcol(XCellRange cells){
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.github.beothorn.clojurecalc;
2+
3+
import clojure.java.api.Clojure;
4+
import clojure.lang.IFn;
5+
import clojure.lang.LazySeq;
6+
import java.util.Iterator;
7+
8+
public class ClojureInterpreter {
9+
public static String runClojure(String exp){
10+
if(exp.equals("")) return "";
11+
String result;
12+
ClassLoader previous = Thread.currentThread().getContextClassLoader();
13+
final ClassLoader parentClassLoader = ClojureCalcImpl.class.getClassLoader();
14+
Thread.currentThread().setContextClassLoader(parentClassLoader);
15+
try {
16+
result = evalResultToString(exp);
17+
}catch(Exception e){
18+
result = e.getMessage();
19+
} finally {
20+
Thread.currentThread().setContextClassLoader(previous);
21+
}
22+
23+
return result;
24+
}
25+
26+
private static String evalResultToString(String exp) {
27+
String result;
28+
final IFn eval = Clojure.var("clojure.core", "load-string");
29+
Object evalResult = eval.invoke(exp);
30+
IFn str = Clojure.var("clojure.core", "str");
31+
if(evalResult instanceof LazySeq){
32+
LazySeq resultCollection = (LazySeq) evalResult;
33+
result = "[";
34+
for (Iterator it = resultCollection.iterator(); it.hasNext();) {
35+
Object object = it.next();
36+
result += str.invoke(object).toString()+" ";
37+
}
38+
result = result.substring(0, result.length() - 1);
39+
result += "]";
40+
}else{
41+
result = str.invoke(evalResult).toString();
42+
}
43+
return result;
44+
}
45+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.github.beothorn.clojurecalc;
2+
3+
import junit.framework.TestCase;
4+
5+
public class ClojureInterpreterTests extends TestCase{
6+
public void testExp(){
7+
runAndAssert("", "");
8+
//TODO: runAndAssert("(1)", "1");
9+
runAndAssert("(+ 1 2)", "3");
10+
runAndAssert("(map #(* % 2) [1 2 3])", "[2 4 6]");
11+
runAndAssert("[ [ 2 4 6 ] ]", "[[2 4 6]]");
12+
}
13+
14+
private void runAndAssert(final String exp, final String expected) {
15+
final String result = ClojureInterpreter.runClojure(exp);
16+
junit.framework.Assert.assertEquals(expected, result);
17+
}
18+
}

0 commit comments

Comments
 (0)