I did and it looks really good. The difference in this example:
#+BEGIN_SRC java import rx.Observable; Observable.range(5, 3) .subscribe((Integer i) -> { System.out.println("Got: " + i); }, (Throwable t) -> { t.printStackTrace();}, () -> { System.out.println("Ending stream"); }); #+END_SRC from the ones I posted yesterday is tremendous! I am not very experienced with Emacs lisp but I think it's pretty easy to understand how things works and follow the code. The comments are also of good help. I really appreciate the work you have done! What do you think about having a configurable list where the user can add =org-babel-java--import-maybe=? In my current use case I could then add RxJava imports to that list and the imports could be removed from the source code block. NIT Some spacing when writing =public static...= #+BEGIN_SRC diff diff --git a/lisp/ob-java.el b/lisp/ob-java.el index 94c3f69cf..4f3904871 100644 --- a/lisp/ob-java.el +++ b/lisp/ob-java.el @@ -220,7 +220,7 @@ RESULT-FILE is the temp file to write the result." (org-babel-java--move-past org-babel-java--class-re) (insert "\n public static void main(String[] args) { System.out.print(\"success\"); -}\n\n")) + }\n\n")) ;; special handling to return value (when (eq result-type 'value) #+END_SRC ian martins <ia...@jhu.edu> writes: > Thanks for testing, and thanks for pointing that out. I will fix it so that > `public` is optional. > > btw, in your example you didn't have to specify `:classname` since you > defined the class name in the source block. > > btw2, did you notice that you can C-c C-c on source blocks that don't have > main methods and it'll compile without error? > > On Tue, Oct 20, 2020 at 3:17 PM John Herrlin <jherr...@gmail.com> wrote: > >> >> Hey, >> >> Did some debugging and found out that my class didn't contained =public= >> and the patch requires it to be. >> >> This works fine: >> >> #+HEADER: :classname Main >> #+HEADER: :dir src >> #+HEADER: :cmdline -classpath ./rxjava-1.3.8.jar:. >> #+HEADER: :cmpflag -classpath ./rxjava-1.3.8.jar >> #+BEGIN_SRC java :results output code >> import rx.Observable; >> public class Main { >> public static void main(String[] args) { >> Observable.range(5, 5) >> .subscribe(System.out::println); >> } >> } >> #+END_SRC >> >> >> >> >> ian martins <ia...@jhu.edu> writes: >> >> > I noticed that the tests didn't run with "make test." This updates the >> > patch so that they can. I didn't add java to the list of default >> languages >> > because the java tests are slow. >> > >> > On Mon, Oct 5, 2020 at 9:23 AM ian martins <ia...@jhu.edu> wrote: >> > >> >> I wrote those examples in an org file so I could test as I wrote them, >> and >> >> then exported it to make it more readable, but the export resulted in >> >> source block headers being lost. Here is the same without export: >> >> ---- >> >> * Changes >> >> >> >> - support for functional mode (~:results value~) >> >> - accept variables >> >> - don't require package, class, and main definitions >> >> - write source and result tempfiles to ~org-babel-temporary-directory~, >> >> but respects the ~:dir~ header >> >> - work with tramp >> >> >> >> * Examples >> >> ** Example 1 >> >> This outputs "hello." If class and main definitions aren't given the >> >> code block will be wrapped in generic ones. >> >> >> >> #+begin_src java :results output silent >> >> System.out.print("hello"); >> >> #+end_src >> >> >> >> This is exactly equivalent: >> >> >> >> #+begin_src java :results output silent >> >> public class Main { >> >> public static void main(String[] args) { >> >> System.out.print("hello"); >> >> } >> >> } >> >> #+end_src >> >> >> >> ** Example 2 >> >> This also outputs "hello." >> >> >> >> #+begin_src java :results value silent >> >> return "hello"; >> >> #+end_src >> >> >> >> ** Example 3 >> >> This generates the class "Example" in the package "org.orgmode" in the >> >> current directory. >> >> >> >> #+begin_src java :results output silent :classname org.orgmode.Example >> >> :dir . >> >> System.out.print("hello, org-mode"); >> >> #+end_src >> >> >> >> ** Example 4 >> >> The "Hey" class defines a static method but no main. C-c C-c on the >> >> "Hey" source block will write "./org/orgmode/Hey.java" and compile it. >> >> >> >> The "Main" class calls the "Hey" class. C-c C-c on the "Main" source >> >> block will write "./org/orgmode/Main.java" and compile and run it. >> >> >> >> #+begin_src java :results output silent :dir . >> >> package org.orgmode; >> >> >> >> public class Hey { >> >> public static String say() { >> >> return "hey"; >> >> } >> >> } >> >> #+end_src >> >> >> >> #+begin_src java :results output silent :dir . >> >> package org.orgmode; >> >> >> >> public class Main { >> >> public static void main(String[] args) { >> >> System.out.print(Hey.say()); >> >> } >> >> } >> >> #+end_src >> >> >> >> Instead of C-c C-c, we could have added tangle headers and written the >> >> source files out by tangling. >> >> >> >> ** Example 5 >> >> This prints the variable from the header >> >> >> >> #+begin_src java :var msg="hello, org-mode" :results output silent >> >> System.out.print(msg); >> >> #+end_src >> >> >> >> ** Example 6 >> >> This prints "hello, org-mode." The table is provided to the method as a >> >> list of lists. >> >> >> >> #+name: table >> >> | message | hello, org-mode | >> >> >> >> #+begin_src java :var tbl=table :results output silent >> >> System.out.print(tbl.get(0).get(1)); >> >> #+end_src >> >> >> >> ** Example 7 >> >> This example returns a list. >> >> >> >> Note that you're allowed to specify imports without defining the class >> >> or main methods. >> >> >> >> #+begin_src java :results value :exports both >> >> import java.util.Arrays; >> >> >> >> return Arrays.asList("message", "hello, org-mode"); >> >> #+end_src >> >> >> >> #+RESULTS: >> >> | message | hello, org-mode | >> >> >> >> On Mon, Oct 5, 2020 at 8:35 AM ian martins <ia...@jhu.edu> wrote: >> >> >> >>> 1 Changes >> >>> ========= >> >>> >> >>> - support for functional mode (`:results value') >> >>> - accept variables >> >>> - don't require package, class, and main definitions >> >>> - write source and result tempfiles to >> >>> `org-babel-temporary-directory', but respects the `:dir' header >> >>> - work with tramp >> >>> >> >>> >> >>> 2 Examples >> >>> ========== >> >>> Some examples follow. See the tests for more examples. I'll write >> >>> proper docs after review. >> >>> >> >>> 2.1 Example 1 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> This outputs "hello." If class and main definitions aren't given the >> >>> code block will be wrapped in generic ones. >> >>> >> >>> ,---- >> >>> | System.out.print("hello"); >> >>> `---- >> >>> >> >>> This is exactly equivalent: >> >>> >> >>> ,---- >> >>> | public class Main { >> >>> | public static void main(String[] args) { >> >>> | System.out.print("hello"); >> >>> | } >> >>> | } >> >>> `---- >> >>> >> >>> >> >>> 2.2 Example 2 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> This also outputs "hello." >> >>> >> >>> ,---- >> >>> | return "hello"; >> >>> `---- >> >>> >> >>> >> >>> 2.3 Example 3 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> This generates the class "Example" in the package "org.orgmode" in >> the >> >>> current directory. >> >>> >> >>> ,---- >> >>> | System.out.print("hello, org-mode"); >> >>> `---- >> >>> >> >>> >> >>> 2.4 Example 4 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> The "Hey" class defines a static method but no main. C-c C-c on the >> >>> "Hey" source block will write "./org/orgmode/Hey.java" and compile >> it. >> >>> >> >>> The "Main" class calls the "Hey" class. C-c C-c on the "Main" source >> >>> block will write "./org/orgmode/Main.java" and compile and run it. >> >>> >> >>> ,---- >> >>> | package org.orgmode; >> >>> | >> >>> | public class Hey { >> >>> | public static String say() { >> >>> | return "hey"; >> >>> | } >> >>> | } >> >>> `---- >> >>> >> >>> ,---- >> >>> | package org.orgmode; >> >>> | >> >>> | public class Main { >> >>> | public static void main(String[] args) { >> >>> | System.out.print(Hey.say()); >> >>> | } >> >>> | } >> >>> `---- >> >>> >> >>> Instead of C-c C-c, we could have added tangle headers and written >> the >> >>> source files out by tangling. >> >>> >> >>> >> >>> 2.5 Example 5 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> This prints the variable from the header >> >>> >> >>> ,---- >> >>> | System.out.print(msg); >> >>> `---- >> >>> >> >>> >> >>> 2.6 Example 6 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> This prints "hello, org-mode." The table is provided to the method as >> >>> a list of lists. >> >>> >> >>> message hello, org-mode >> >>> >> >>> ,---- >> >>> | System.out.print(tbl.get(0).get(1)); >> >>> `---- >> >>> >> >>> >> >>> 2.7 Example 7 >> >>> ~~~~~~~~~~~~~ >> >>> >> >>> This example returns a list. >> >>> >> >>> Note that you're allowed to specify imports without defining the >> class >> >>> or main methods. >> >>> >> >>> ,---- >> >>> | import java.util.Arrays; >> >>> | >> >>> | return Arrays.asList("message", "hello, org-mode"); >> >>> `---- >> >>> >> >>> message hello, org-mode >> >>> >> >> >>