* bug#36682: Error in Guile scripting examples
@ 2019-07-15 22:39 Hans-Werner Roitzsch
2019-07-15 23:44 ` Arne Babenhauserheide
0 siblings, 1 reply; 4+ messages in thread
From: Hans-Werner Roitzsch @ 2019-07-15 22:39 UTC (permalink / raw)
To: 36682
[-- Attachment #1: Type: text/plain, Size: 2859 bytes --]
Hello GNU Team!
I wish to report a bug in either Guile's documentation or Guile's code
with regard to running scripts.
There are some examples of that given in Guile's documentation at:
https://www.gnu.org/software/guile/manual/html_node/Scripting-Examples.html#Scripting-Examples
In the following I will describe the problem.
I have the file `modules.scm` with the following code:
----8<----start-of-code---->8----
#!/usr/bin/env sh
exec guile -l fact.scm -e '(@ (my-module) main)' -s "$0" "$@"
!#
;; Explanation:
;; -e (my-module)
;; If run as a script run the `my-module` module's `main`.
;; (Use `@@` to reference not exported procedures.)
;; -s
;; Run the script.
(define-module (my-module)
#:export (main))
;; Create a module named `fac`.
;; Export the `main` procedure as part of `fac`.
(define (n-choose-k n k)
(/ (fact n)
(* (fact k)
(fact (- n k)))))
(define (main args)
(let ((n (string->number (cadr args)))
(k (string->number (caddr args))))
(display (n-choose-k n k))
(newline)))
----8<----end-of-code---->8----
And I have the following `fact.scm`:
----8<----start-of-code---->8----
#!/usr/local/bin/guile \
-e main -s
!#
;; How to run this program?
;; Example:
;; guile -e main -s factorial-script.scm 50
;; Explanation:
;; -e specifies the procedure to run
;; -s specifies to run this as a script
;; 50 is the number we take as input to the script
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
(define (main args)
(display (fact (string->number (cadr args))))
(newline))
----8<----end-of-code---->8----
The script is made executable by doing:
chmod +x modules.scm
Then I call the script as follows:
./modules.scm 10 3
This results in the error:
----8<----start-of-code---->8----
Backtrace:
4 (apply-smob/1 #<catch-closure 119cb80>)
In ice-9/boot-9.scm:
705:2 3 (call-with-prompt ("prompt") #<procedure 11aa8e0 at ice-9/eval.scm:330:13 ()> #<procedure default-prom…>)
In ice-9/eval.scm:
619:8 2 (_ #(#(#<directory (guile-user) 1233140>)))
In /home/xiaolong/development/Guile/scripting/./modules.scm:
26:13 1 (main _)
18:0 0 (n-choose-k _ _)
/home/xiaolong/development/Guile/scripting/./modules.scm:18:0: In procedure n-choose-k:
In procedure module-lookup: Unbound variable: fact
----8<----end-of-code---->8----
According to my understanding of the tutorial in the Guile documentation
that I linked to above this code should work.
I also described the problem some time ago at:
https://stackoverflow.com/questions/50272618/guile-scheme-scripting-tutorial-loading-scripts
My Guile version is:
guile (GNU Guile) 2.2.4
Best regards,
Hans-Werner Roitzsch
[-- Attachment #2: Type: text/html, Size: 3660 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* bug#36682: Error in Guile scripting examples
2019-07-15 22:39 bug#36682: Error in Guile scripting examples Hans-Werner Roitzsch
@ 2019-07-15 23:44 ` Arne Babenhauserheide
2022-12-12 21:17 ` Maxim Cournoyer
0 siblings, 1 reply; 4+ messages in thread
From: Arne Babenhauserheide @ 2019-07-15 23:44 UTC (permalink / raw)
To: 36682
[-- Attachment #1: Type: text/plain, Size: 2488 bytes --]
Hello Hans-Werner Roitzsch,
It looks like you’re mixing up two concepts: the fac creates a module
and loads the fact which is not a module, so basically main and choose
live in another namespace than fact (define-module starts a new
namespace).
And it seems that this is indeed a bug in the documentation, because
https://www.gnu.org/software/guile/manual/html_node/Scripting-Examples.html#Scripting-Examples
jumps to defining fac as a module but does not at the same time define
and import fact as a module, too.
Hans-Werner Roitzsch <hwroitzsch@posteo.net> writes:
> I have the file `modules.scm` with the following code:
>
> ----8<----start-of-code---->8----
> #!/usr/bin/env sh
> exec guile -l fact.scm -e '(@ (my-module) main)' -s "$0" "$@"
> !#
>
> ;; Explanation:
> ;; -e (my-module)
> ;; If run as a script run the `my-module` module's `main`.
> ;; (Use `@@` to reference not exported procedures.)
> ;; -s
> ;; Run the script.
>
> (define-module (my-module)
> #:export (main))
At this point you need
(use-modules (fact))
> ;; Create a module named `fac`.
> ;; Export the `main` procedure as part of `fac`.
>
> (define (n-choose-k n k)
> (/ (fact n)
> (* (fact k)
> (fact (- n k)))))
>
> (define (main args)
> (let ((n (string->number (cadr args)))
> (k (string->number (caddr args))))
> (display (n-choose-k n k))
> (newline)))
> ----8<----end-of-code---->8----
>
> And I have the following `fact.scm`:
>
> ----8<----start-of-code---->8----
> #!/usr/local/bin/guile \
> -e main -s
> !#
>
> ;; How to run this program?
> ;; Example:
> ;; guile -e main -s factorial-script.scm 50
> ;; Explanation:
> ;; -e specifies the procedure to run
> ;; -s specifies to run this as a script
> ;; 50 is the number we take as input to the script
To be usable as module, this needs to be defined as module:
(define-module (fact)
#:export (fact))
> (define (fact n)
> (if (zero? n) 1
> (* n (fact (- n 1)))))
>
> (define (main args)
> (display (fact (string->number (cadr args))))
> (newline))
> ----8<----end-of-code---->8----
…
> chmod +x modules.scm
> ./modules.scm 10 3
Does it work with the added module definition and import?
If yes, then this looks like a bug in the documentation.
> Best regards,
>
> Hans-Werner Roitzsch
Best wishes, and thank you for reporting!
Arne
--
Unpolitisch sein
heißt politisch sein
ohne es zu merken
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 1076 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* bug#36682: Error in Guile scripting examples
2019-07-15 23:44 ` Arne Babenhauserheide
@ 2022-12-12 21:17 ` Maxim Cournoyer
2022-12-13 1:08 ` Maxim Cournoyer
0 siblings, 1 reply; 4+ messages in thread
From: Maxim Cournoyer @ 2022-12-12 21:17 UTC (permalink / raw)
To: Arne Babenhauserheide; +Cc: 36682, Hans-Werner Roitzsch
Hello,
Arne Babenhauserheide <arne_bab@web.de> writes:
> Hello Hans-Werner Roitzsch,
>
> It looks like you’re mixing up two concepts: the fac creates a module
> and loads the fact which is not a module, so basically main and choose
> live in another namespace than fact (define-module starts a new
> namespace).
>
> And it seems that this is indeed a bug in the documentation, because
> https://www.gnu.org/software/guile/manual/html_node/Scripting-Examples.html#Scripting-Examples
> jumps to defining fac as a module but does not at the same time define
> and import fact as a module, too.
>
> Hans-Werner Roitzsch <hwroitzsch@posteo.net> writes:
>> I have the file `modules.scm` with the following code:
>>
>> ----8<----start-of-code---->8----
>> #!/usr/bin/env sh
>> exec guile -l fact.scm -e '(@ (my-module) main)' -s "$0" "$@"
>> !#
>>
>> ;; Explanation:
>> ;; -e (my-module)
>> ;; If run as a script run the `my-module` module's `main`.
>> ;; (Use `@@` to reference not exported procedures.)
>> ;; -s
>> ;; Run the script.
>>
>> (define-module (my-module)
>> #:export (main))
>
> At this point you need
>
> (use-modules (fact))
>
>> ;; Create a module named `fac`.
>> ;; Export the `main` procedure as part of `fac`.
>>
>> (define (n-choose-k n k)
>> (/ (fact n)
>> (* (fact k)
>> (fact (- n k)))))
>>
>> (define (main args)
>> (let ((n (string->number (cadr args)))
>> (k (string->number (caddr args))))
>> (display (n-choose-k n k))
>> (newline)))
>> ----8<----end-of-code---->8----
>>
>> And I have the following `fact.scm`:
>>
>> ----8<----start-of-code---->8----
>> #!/usr/local/bin/guile \
>> -e main -s
>> !#
>>
>> ;; How to run this program?
>> ;; Example:
>> ;; guile -e main -s factorial-script.scm 50
>> ;; Explanation:
>> ;; -e specifies the procedure to run
>> ;; -s specifies to run this as a script
>> ;; 50 is the number we take as input to the script
>
> To be usable as module, this needs to be defined as module:
>
> (define-module (fact)
> #:export (fact))
>
>> (define (fact n)
>> (if (zero? n) 1
>> (* n (fact (- n 1)))))
>>
>> (define (main args)
>> (display (fact (string->number (cadr args))))
>> (newline))
>> ----8<----end-of-code---->8----
> …
>> chmod +x modules.scm
>> ./modules.scm 10 3
>
> Does it work with the added module definition and import?
Thank you for the above explanations. I got confused by the this in the
documentation as well. Trying the above suggestions, I still have a
problem.
I have the following two files:
fact:
--8<---------------cut here---------------start------------->8---
#!/run/current-system/profile/bin/guile \
-e main -s
!#
(define-module (fact)
#:export (fact))
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
(define (main args)
(display (fact (string->number (cadr args))))
(newline))
--8<---------------cut here---------------end--------------->8---
fac:
--8<---------------cut here---------------start------------->8---
#!/run/current-system/profile/bin/guile \
-e (@@ (fac) main) -s
!#
(define-module (fac)
#:export (main))
(use-modules (fact))
(define (choose n m)
(/ (fact m) (* (fact (- m n)) (fact n))))
(define (main args)
(let ((n (string->number (cadr args)))
(m (string->number (caddr args))))
(display (choose n m))
(newline)))
--8<---------------cut here---------------end--------------->8---
But with Guile 3.0.8, this gives me:
--8<---------------cut here---------------start------------->8---
./fac 5 20
ice-9/read.scm:126:4: In procedure lp:
#<unknown port>:1:4: unexpected end of input while searching for: )
--8<---------------cut here---------------end--------------->8---
Which I don't understand.
--
Thanks,
Maxim
^ permalink raw reply [flat|nested] 4+ messages in thread
* bug#36682: Error in Guile scripting examples
2022-12-12 21:17 ` Maxim Cournoyer
@ 2022-12-13 1:08 ` Maxim Cournoyer
0 siblings, 0 replies; 4+ messages in thread
From: Maxim Cournoyer @ 2022-12-13 1:08 UTC (permalink / raw)
To: Arne Babenhauserheide; +Cc: 36682, Hans-Werner Roitzsch
Hi,
Maxim Cournoyer <maxim.cournoyer@gmail.com> writes:
[...]
> I have the following two files:
>
> fact:
>
> #!/run/current-system/profile/bin/guile \
> -e main -s
> !#
> (define-module (fact)
> #:export (fact))
>
> (define (fact n)
> (if (zero? n) 1
> (* n (fact (- n 1)))))
>
> (define (main args)
> (display (fact (string->number (cadr args))))
> (newline))
>
>
> fac:
>
> #!/run/current-system/profile/bin/guile \
> -e (@@ (fac) main) -s
> !#
> (define-module (fac)
> #:export (main))
>
> (use-modules (fact))
>
> (define (choose n m)
> (/ (fact m) (* (fact (- m n)) (fact n))))
>
> (define (main args)
> (let ((n (string->number (cadr args)))
> (m (string->number (caddr args))))
> (display (choose n m))
> (newline)))
>
>
> But with Guile 3.0.8, this gives me:
>
> ./fac 5 20
> ice-9/read.scm:126:4: In procedure lp:
> #<unknown port>:1:4: unexpected end of input while searching for: )
>
> Which I don't understand.
OK, so what is apparently problematic with modules is the use of '-e (@@
(module-name) proc-name)' with Guil modules. For the 'fac' file above,
modifying it like this:
--8<---------------cut here---------------start------------->8---
#!/run/current-system/profile/bin/guile \
-e (fac) -s
!#
(define-module (fac)
#:export (main))
(use-modules (fact))
(define (choose n m)
(/ (fact m) (* (fact (- m n)) (fact n))))
(define (main args)
(let ((n (string->number (cadr args)))
(m (string->number (caddr args))))
(display (choose n m))
(newline)))
--8<---------------cut here---------------end--------------->8---
works. This relies on 'main' being defined and public. I hope that
helps!
--
Thanks,
Maxim
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-12-13 1:08 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-15 22:39 bug#36682: Error in Guile scripting examples Hans-Werner Roitzsch
2019-07-15 23:44 ` Arne Babenhauserheide
2022-12-12 21:17 ` Maxim Cournoyer
2022-12-13 1:08 ` Maxim Cournoyer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).