unofficial mirror of bug-guile@gnu.org 
 help / color / mirror / Atom feed
* 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).