emacs-orgmode
[Top][All Lists]
Advanced

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

org-babel guile source block bug in handling multiple values


From: Zelphir Kaltstahl
Subject: org-babel guile source block bug in handling multiple values
Date: Tue, 7 Mar 2023 11:27:02 +0000

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

reply via email to

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