Hello Org users!
I think I found a bug in how org-babel works with at least GNU Guile source
blocks. I could not reproduce this for example with a racket source block,
because somehow there is no ob-racket and I think I would need that. I could try
other Schemes like maybe Chicken, if there is ob-chicken or so available. The
issue happens on 2 separate machines.
I am not sure on which repository I should open an issue for this specific bug,
or if perhaps this mailing list is exactly the right place. Feel free to point
me elsewhere : )
What follows are my notes trying to narrow it down, as an org document.
~~~~START~~~~
* General
There seems to be an issue with returning multiple values, which result from
=:var= variables / whose computation involves =:var= variables. Handling
multiple trivial values like ~1~ or ~2~ seems to work fine.
* Primitive multiple values work
#+begin_src scheme :eval query-export :results output replace drawer
(import (except (rnrs base) error vector-map)
(only (guile)
lambda*
λ)
;; let-values
(srfi srfi-11))
(let-values ([(a b) (values 1 2)])
(simple-format #t "~a ~a\n" a b))
#+end_src
#+RESULTS:
:results:
1 2
:end:
* Multiple values involving =:var= variables
#+begin_src scheme :eval query-export :results output replace drawer :var x=1
:var y=2
(import (except (rnrs base) error vector-map)
(only (guile)
lambda*
λ)
;; let-values
(srfi srfi-11))
(let-values ([(a b) (values x y)])
(simple-format #t "~a ~a\n" a b))
#+end_src
#+RESULTS:
:results:
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Unbound variable: a
Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]>
:end:
** Is it about =:var= variables in values?
#+begin_src scheme :eval query-export :results output replace drawer :var x=1
:var y=2
(import (except (rnrs base) error vector-map)
(only (guile)
lambda*
λ)
;; let-values
(srfi srfi-11))
(define plus-x
(λ (num)
(+ num x)))
(define plus-y
(λ (num)
(+ num y)))
(let-values ([(a b) (values (plus-x 1) (plus-y 2))])
(simple-format #t "~a ~a\n" a b))
#+end_src
#+RESULTS:
:results:
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Unbound variable: a
Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]>
:end:
** Defining and using defined variables
What about defining and using the defined variables instead of the =:var=
variables directly?
#+begin_src scheme :eval query-export :results output replace drawer :var x=1
:var y=2
(import (except (rnrs base) error vector-map)
(only (guile)
lambda*
λ)
;; let-values
(srfi srfi-11))
(define inner-x x)
(define inner-y y)
(define plus-x
(λ (num)
(+ num inner-x)))
(define plus-y
(λ (num)
(+ num inner-y)))
(let-values ([(a b) (values (plus-x 1) (plus-y 2))])
(simple-format #t "~a ~a\n" a b))
#+end_src
#+RESULTS:
:results:
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Unbound variable: a
Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]>
:end:
It seems not to work whenever the ~(values ...)~ is not only trivial values,
but variables or function calls.
* With named :session
Works after running it once with error:
#+begin_src scheme :session mysession :eval query-export :results output
replace drawer :var x=1 :var y=2
(import (except (rnrs base) error vector-map)
(only (guile)
lambda*
λ)
;; let-values
(srfi srfi-11))
(let-values ([(a b) (values x y)])
(simple-format #t "~a ~a\n" a b))
#+end_src
#+RESULTS:
:results:
1 2
:end:
Seems like it gets stored in the session and then can be used in the second run
of the source block.
~~~~~END~~~~~
Versions of things:
+ guile @ =3.0.9=
+ org-mode @ =9.6.1=
+ org-babel @ (integrated into org-mode)
+ geiser-guile @ =0.28.1=
Workarounds:
Of course, I could return lists instead of multiple values and then pattern
match on them or use separate functions for getting the values separately.
Downside: Might be more computation and requires changing code just, because for
using it in org source blocks.
--
repositories:https://notabug.org/ZelphirKaltstahl