emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [PATCH] ob-java


From: John Herrlin
Subject: Re: [PATCH] ob-java
Date: Wed, 21 Oct 2020 07:59:26 +0200
User-agent: mu4e 1.4.13; emacs 27.1

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 <ianxm@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 <jherrlin@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 <ianxm@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 <ianxm@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 <ianxm@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
>> >>>
>> >>
>>



reply via email to

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