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