Org-mode mailing list
 help / color / mirror / Atom feed
From: ian martins <ianxm@jhu.edu>
To: John Herrlin <jherrlin@gmail.com>
Cc: Org-Mode mailing list <emacs-orgmode@gnu.org>
Subject: Re: [PATCH] ob-java
Date: Wed, 21 Oct 2020 08:47:32 -0400
Message-ID: <CAC=rjb5EcgFDhzT3sh=VjcoT=VKBCm_5MW2BxfYr_OiWzzHt2w@mail.gmail.com> (raw)
In-Reply-To: <87d01cglvm.fsf@gmail.com>

[-- Attachment #1: Type: text/plain, Size: 11367 bytes --]

>
> 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.


I think this can already be done. imports can be added to the headers, and
babel allows file-wide headers, so you could add a =#+HEADER: :import
rx.Observable= line to the file and all source blocks would get it.  it's
slightly different in that =org-babel-java--import-maybe= skips imports
that it thinks aren't needed. also if there are any non-java source blocks
in the same file, these imports could be added to them which would be bad,
so when mixing multiple languages in the same file this wouldn't be an
option.

NIT
> Some spacing when writing =public static...=
>

Thanks for fixing the spacing. I don't think I can give you credit for the
patch, though, without leaving it out until ob-java is accepted.

On Wed, Oct 21, 2020 at 1:59 AM John Herrlin <jherrlin@gmail.com> wrote:

>
> 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
> >> >>>
> >> >>
> >>
>

[-- Attachment #2: Type: text/html, Size: 17865 bytes --]

  reply	other threads:[~2020-10-21 12:48 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-05 12:35 ian martins
2020-10-05 13:23 ` ian martins
2020-10-09 11:15   ` ian martins
2020-10-20 18:28     ` John Herrlin
2020-10-20 19:17     ` John Herrlin
2020-10-21  2:37       ` ian martins
2020-10-21  5:59         ` John Herrlin
2020-10-21 12:47           ` ian martins [this message]
2020-10-21 13:54             ` John Herrlin
2020-10-22 12:23               ` ian martins
2020-10-22 12:56                 ` John Herrlin
2020-10-24 17:05     ` Kyle Meyer
2020-10-25  2:10       ` ian martins
2020-10-25  2:40         ` Kyle Meyer
2020-10-25 19:36           ` ian martins
2020-11-05 16:29             ` Jarmo Hurri
2020-11-05 17:10               ` ian martins
2020-11-06  5:21                 ` Jarmo Hurri
2020-11-06 23:00                   ` ian martins
2020-11-09 14:06                     ` Jarmo Hurri
2020-11-10 13:14                       ` ian martins
2020-11-10  6:29                     ` Jarmo Hurri
2020-11-14 11:47                       ` Jarmo Hurri
2020-11-14 15:46                         ` ian martins
2020-11-15  4:36                           ` Jarmo Hurri
2020-11-17 12:07                             ` ian martins
2020-12-14  5:55                               ` Bastien
2020-11-11  7:45                   ` Bastien
2020-10-24 11:58 ` Bastien
2020-10-25  0:30   ` ian martins
2020-10-28  9:13     ` Bastien
2020-10-31 11:03       ` ian martins

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://orgmode.org

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAC=rjb5EcgFDhzT3sh=VjcoT=VKBCm_5MW2BxfYr_OiWzzHt2w@mail.gmail.com' \
    --to=ianxm@jhu.edu \
    --cc=emacs-orgmode@gnu.org \
    --cc=jherrlin@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Org-mode mailing list

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://orgmode.org/list/0 list/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 list list/ https://orgmode.org/list \
		emacs-orgmode@gnu.org
	public-inbox-index list

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.yhetil.org/yhetil.emacs.orgmode
	nntp://news.gmane.io/gmane.emacs.orgmode


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git