[-- Attachment #1: Type: text/plain, Size: 697 bytes --] Hey Ian! Happy to see you as the maintainer of the ob-java! I would like to propose a feature to ob-java. The feature allows a source code block to write and compile only, without executing. Here is a common use case for me. Class without a entry point have an :compile-only header. #+HEADER: :classname se/my_test_package/Hey #+HEADER: :dir src #+HEADER: :compile-only t #+HEADER: :results none #+BEGIN_SRC java package se.my_test_package; public class Hey { public static String hey(String name) { return "Hey " + name; } } #+END_SRC The provided diff works for my small use case. What do you think? -- Best regards John [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: ob-java-compile-only-header.diff --] [-- Type: text/x-patch, Size: 2145 bytes --] diff --git a/lisp/ob-java.el b/lisp/ob-java.el index fee695bb9..5c98a0417 100644 --- a/lisp/ob-java.el +++ b/lisp/ob-java.el @@ -60,6 +60,7 @@ parameters may be used, like javac -verbose" (cmpflag (or (cdr (assq :cmpflag params)) "")) (cmdline (or (cdr (assq :cmdline params)) "")) (cmdargs (or (cdr (assq :cmdargs params)) "")) + (compile-only (assq :compile-only params)) (full-body (org-babel-expand-body:generic body params))) ;; created package-name directories if missing (unless (or (not packagename) (file-exists-p packagename)) @@ -67,18 +68,19 @@ parameters may be used, like javac -verbose" (with-temp-file src-file (insert full-body)) (org-babel-eval (concat org-babel-java-compiler " " cmpflag " " src-file) "") - (let ((results (org-babel-eval (concat org-babel-java-command - " " cmdline " " classname " " cmdargs) ""))) - (org-babel-reassemble-table - (org-babel-result-cond (cdr (assq :result-params params)) - (org-babel-read results t) - (let ((tmp-file (org-babel-temp-file "c-"))) - (with-temp-file tmp-file (insert results)) - (org-babel-import-elisp-from-file tmp-file))) - (org-babel-pick-name - (cdr (assq :colname-names params)) (cdr (assq :colnames params))) - (org-babel-pick-name - (cdr (assq :rowname-names params)) (cdr (assq :rownames params))))))) + (unless compile-only + (let ((results (org-babel-eval (concat org-babel-java-command + " " cmdline " " classname " " cmdargs) ""))) + (org-babel-reassemble-table + (org-babel-result-cond (cdr (assq :result-params params)) + (org-babel-read results t) + (let ((tmp-file (org-babel-temp-file "c-"))) + (with-temp-file tmp-file (insert results)) + (org-babel-import-elisp-from-file tmp-file))) + (org-babel-pick-name + (cdr (assq :colname-names params)) (cdr (assq :colnames params))) + (org-babel-pick-name + (cdr (assq :rowname-names params)) (cdr (assq :rownames params)))))))) (provide 'ob-java)
[-- Attachment #1: Type: text/plain, Size: 1779 bytes --] Hi John, Thanks for the suggestion and patch. Is the reason for this so that you can have classes without needing dummy "main" methods? Did you consider using org-babel-tangle to generate the source files? This works for me: Steps: 1. put javatangle.org (below) on your local. 2. create "pkg" directory where javatangle.org is 3. run org-babel-tangle on javatangle.org (this writes two source files to the pkg dir) 4. run C-c C-c on the top source block (this compiles both source files and runs main) ----- javatangle.org ----- #+begin_src java :results output :classname pkg/Main :tangle pkg/Main.java package pkg; public class Main { public static void main(String[] args) { System.out.println(Hey.hey()); } } #+end_src #+begin_src java :results output :classname pkg/Hey :tangle pkg/Hey.java package pkg; public class Hey { public static String hey() { return "hey"; } } #+end_src On Sun, Sep 27, 2020 at 5:19 PM John Herrlin <jherrlin@gmail.com> wrote: > > Hey Ian! > > Happy to see you as the maintainer of the ob-java! > > I would like to propose a feature to ob-java. The feature allows a > source code block to write and compile only, without executing. > > Here is a common use case for me. > > Class without a entry point have an :compile-only header. > > #+HEADER: :classname se/my_test_package/Hey > #+HEADER: :dir src > #+HEADER: :compile-only t > #+HEADER: :results none > #+BEGIN_SRC java > package se.my_test_package; > > public class Hey { > public static String hey(String name) { > return "Hey " + name; > } > } > #+END_SRC > > The provided diff works for my small use case. What do you think? > > -- > Best regards > John > > [-- Attachment #2: Type: text/html, Size: 2711 bytes --]
Hey Ian,
Thank you for the quick feedback!
That workflow seems to work perfectly if it's Java all the way. Then it
compiles all the related files. I am mostly working with the classes
from Clojure.
Here is an example:
#+HEADER: :classname se/my_test_package/Hey
#+HEADER: :compile-only t
#+HEADER: :results none
#+HEADER: :dir src
#+BEGIN_SRC java
package se.my_test_package;
public class Hey {
public static String hey(String name) {
return "Hey " + name;
}
}
#+END_SRC
#+BEGIN_SRC clojure :results output code
(import [se.my_test_package Hey])
(Hey/hey "John")
#+END_SRC
Best regards
ian martins <ianxm@jhu.edu> writes:
> Hi John,
>
> Thanks for the suggestion and patch. Is the reason for this so that you can
> have classes without needing dummy "main" methods?
>
> Did you consider using org-babel-tangle to generate the source files? This
> works for me:
>
> Steps:
> 1. put javatangle.org (below) on your local.
> 2. create "pkg" directory where javatangle.org is
> 3. run org-babel-tangle on javatangle.org (this writes two source files to
> the pkg dir)
> 4. run C-c C-c on the top source block (this compiles both source files and
> runs main)
>
> ----- javatangle.org -----
>
> #+begin_src java :results output :classname pkg/Main :tangle pkg/Main.java
> package pkg;
>
> public class Main {
> public static void main(String[] args) {
> System.out.println(Hey.hey());
> }
> }
> #+end_src
>
> #+begin_src java :results output :classname pkg/Hey :tangle pkg/Hey.java
> package pkg;
>
> public class Hey {
> public static String hey() {
> return "hey";
> }
> }
> #+end_src
>
>
>
> On Sun, Sep 27, 2020 at 5:19 PM John Herrlin <jherrlin@gmail.com> wrote:
>
>>
>> Hey Ian!
>>
>> Happy to see you as the maintainer of the ob-java!
>>
>> I would like to propose a feature to ob-java. The feature allows a
>> source code block to write and compile only, without executing.
>>
>> Here is a common use case for me.
>>
>> Class without a entry point have an :compile-only header.
>>
>> #+HEADER: :classname se/my_test_package/Hey
>> #+HEADER: :dir src
>> #+HEADER: :compile-only t
>> #+HEADER: :results none
>> #+BEGIN_SRC java
>> package se.my_test_package;
>>
>> public class Hey {
>> public static String hey(String name) {
>> return "Hey " + name;
>> }
>> }
>> #+END_SRC
>>
>> The provided diff works for my small use case. What do you think?
>>
>> --
>> Best regards
>> John
>>
>>
--
Mvh John
[-- Attachment #1: Type: text/plain, Size: 3954 bytes --] Thanks for explaining. That makes sense. I'm hesitant to add the compile-only header for a couple reasons. Generally C-c C-c on a source block means "run this" but with compile-only it'll mean "run this but don't run it." It's semantically inconsistent. Also I want to bring more feature parity to ob-java, so that there's more consistency across babel. I'm reluctant to add headers not found elsewhere. Consider some alternatives: 1. one option is to add a dummy main to every class. it could do nothing or run unit tests. it's not a bad place to kick off unit tests, but I don't think you should have to. 2. you could use org-babel-tangle to write out the source files, and compile from an emacs compile buffer. this might be more convenient than compiling from babel since recompiles are a single keystroke. 3. a future version of ob-java will know if a class has a "public static void main." at that point it'll be easy to automatically skip execution of the class if it doesn't define a main, without the need for a new header. On Mon, Sep 28, 2020 at 4:11 AM John Herrlin <jherrlin@gmail.com> wrote: > > Hey Ian, > > Thank you for the quick feedback! > > That workflow seems to work perfectly if it's Java all the way. Then it > compiles all the related files. I am mostly working with the classes > from Clojure. > > Here is an example: > > #+HEADER: :classname se/my_test_package/Hey > #+HEADER: :compile-only t > #+HEADER: :results none > #+HEADER: :dir src > #+BEGIN_SRC java > package se.my_test_package; > > public class Hey { > public static String hey(String name) { > return "Hey " + name; > } > } > #+END_SRC > > #+BEGIN_SRC clojure :results output code > (import [se.my_test_package Hey]) > > (Hey/hey "John") > #+END_SRC > > > Best regards > > > > ian martins <ianxm@jhu.edu> writes: > > > Hi John, > > > > Thanks for the suggestion and patch. Is the reason for this so that you > can > > have classes without needing dummy "main" methods? > > > > Did you consider using org-babel-tangle to generate the source files? > This > > works for me: > > > > Steps: > > 1. put javatangle.org (below) on your local. > > 2. create "pkg" directory where javatangle.org is > > 3. run org-babel-tangle on javatangle.org (this writes two source files > to > > the pkg dir) > > 4. run C-c C-c on the top source block (this compiles both source files > and > > runs main) > > > > ----- javatangle.org ----- > > > > #+begin_src java :results output :classname pkg/Main :tangle > pkg/Main.java > > package pkg; > > > > public class Main { > > public static void main(String[] args) { > > System.out.println(Hey.hey()); > > } > > } > > #+end_src > > > > #+begin_src java :results output :classname pkg/Hey :tangle pkg/Hey.java > > package pkg; > > > > public class Hey { > > public static String hey() { > > return "hey"; > > } > > } > > #+end_src > > > > > > > > On Sun, Sep 27, 2020 at 5:19 PM John Herrlin <jherrlin@gmail.com> wrote: > > > >> > >> Hey Ian! > >> > >> Happy to see you as the maintainer of the ob-java! > >> > >> I would like to propose a feature to ob-java. The feature allows a > >> source code block to write and compile only, without executing. > >> > >> Here is a common use case for me. > >> > >> Class without a entry point have an :compile-only header. > >> > >> #+HEADER: :classname se/my_test_package/Hey > >> #+HEADER: :dir src > >> #+HEADER: :compile-only t > >> #+HEADER: :results none > >> #+BEGIN_SRC java > >> package se.my_test_package; > >> > >> public class Hey { > >> public static String hey(String name) { > >> return "Hey " + name; > >> } > >> } > >> #+END_SRC > >> > >> The provided diff works for my small use case. What do you think? > >> > >> -- > >> Best regards > >> John > >> > >> > > > -- > Mvh John > [-- Attachment #2: Type: text/html, Size: 5667 bytes --]
ian martins <ianxm@jhu.edu> writes: > Thanks for explaining. That makes sense. > > I'm hesitant to add the compile-only header for a couple reasons. Generally > C-c C-c on a source block means "run this" but with compile-only it'll mean > "run this but don't run it." It's semantically inconsistent. Also I want to > bring more feature parity to ob-java, so that there's more consistency > across babel. I'm reluctant to add headers not found elsewhere. Thank you for the feedback, I am all with you on that and I think consistency is very important! > > Consider some alternatives: > 1. one option is to add a dummy main to every class. it could do nothing or > run unit tests. it's not a bad place to kick off unit tests, but I don't > think you should have to. > 2. you could use org-babel-tangle to write out the source files, and > compile from an emacs compile buffer. this might be more convenient than > compiling from babel since recompiles are a single keystroke. > 3. a future version of ob-java will know if a class has a "public static > void main." at that point it'll be easy to automatically skip execution of > the class if it doesn't define a main, without the need for a new > header. The alternatives are nice and I will manage fine! Looking forward to see what will happen to ob-java! :) > > On Mon, Sep 28, 2020 at 4:11 AM John Herrlin <jherrlin@gmail.com> wrote: > >> >> Hey Ian, >> >> Thank you for the quick feedback! >> >> That workflow seems to work perfectly if it's Java all the way. Then it >> compiles all the related files. I am mostly working with the classes >> from Clojure. >> >> Here is an example: >> >> #+HEADER: :classname se/my_test_package/Hey >> #+HEADER: :compile-only t >> #+HEADER: :results none >> #+HEADER: :dir src >> #+BEGIN_SRC java >> package se.my_test_package; >> >> public class Hey { >> public static String hey(String name) { >> return "Hey " + name; >> } >> } >> #+END_SRC >> >> #+BEGIN_SRC clojure :results output code >> (import [se.my_test_package Hey]) >> >> (Hey/hey "John") >> #+END_SRC >> >> >> Best regards >> >> >> >> ian martins <ianxm@jhu.edu> writes: >> >> > Hi John, >> > >> > Thanks for the suggestion and patch. Is the reason for this so that you >> can >> > have classes without needing dummy "main" methods? >> > >> > Did you consider using org-babel-tangle to generate the source files? >> This >> > works for me: >> > >> > Steps: >> > 1. put javatangle.org (below) on your local. >> > 2. create "pkg" directory where javatangle.org is >> > 3. run org-babel-tangle on javatangle.org (this writes two source files >> to >> > the pkg dir) >> > 4. run C-c C-c on the top source block (this compiles both source files >> and >> > runs main) >> > >> > ----- javatangle.org ----- >> > >> > #+begin_src java :results output :classname pkg/Main :tangle >> pkg/Main.java >> > package pkg; >> > >> > public class Main { >> > public static void main(String[] args) { >> > System.out.println(Hey.hey()); >> > } >> > } >> > #+end_src >> > >> > #+begin_src java :results output :classname pkg/Hey :tangle pkg/Hey.java >> > package pkg; >> > >> > public class Hey { >> > public static String hey() { >> > return "hey"; >> > } >> > } >> > #+end_src >> > >> > >> > >> > On Sun, Sep 27, 2020 at 5:19 PM John Herrlin <jherrlin@gmail.com> wrote: >> > >> >> >> >> Hey Ian! >> >> >> >> Happy to see you as the maintainer of the ob-java! >> >> >> >> I would like to propose a feature to ob-java. The feature allows a >> >> source code block to write and compile only, without executing. >> >> >> >> Here is a common use case for me. >> >> >> >> Class without a entry point have an :compile-only header. >> >> >> >> #+HEADER: :classname se/my_test_package/Hey >> >> #+HEADER: :dir src >> >> #+HEADER: :compile-only t >> >> #+HEADER: :results none >> >> #+BEGIN_SRC java >> >> package se.my_test_package; >> >> >> >> public class Hey { >> >> public static String hey(String name) { >> >> return "Hey " + name; >> >> } >> >> } >> >> #+END_SRC >> >> >> >> The provided diff works for my small use case. What do you think? >> >> >> >> -- >> >> Best regards >> >> John >> >> >> >> >> >> >> -- >> Mvh John >> -- Mvh John