strange problem splitting one module in two
Damien Mattei
damien.mattei@gmail.com
Fri Jun 14 08:58:37 GMT 2024
the problem was coming from mixing 2 syntax allowed by kawa in 2 different
modules:
i was using r7rs in one :
(define-library (range) ; R7RS
(import (kawa base)
(for_next_step))
(export in-range
reversed)
and kawa module in other:
(module-name for_next_step)
kawa dislike that, all is ok now:
one module ok:
#|kawa:1|# (require for_next_step_range)
/Users/mattei/Scheme-PLUS-for-Kawa/for_next_step_range.scm:47:8: warning -
void-valued expression where value is needed
#|kawa:2|# in-range
#<procedure in-range>
#|kawa:3|# (in-range 5)
(0 1 2 3 4)
#|kawa:4|# (for ((define i 0) (< i 3) (set! i (+ 1 i))) (display i)
(newline))
/dev/tty:4:58: warning - void-valued expression where value is needed
0
1
2
#!null
#|kawa:5|# (reversed (in-range 5))
(4 3 2 1 0)
#|kawa:6|# (exit)
two modules in r7rs ok:
(base) mattei@mbp-touch-bar Scheme-PLUS-for-Kawa % kawa
-Dkawa.import.path=".:/Users/mattei/Scheme-PLUS-for-Kawa:"
#|kawa:1|# (import (range))
/Users/mattei/Scheme-PLUS-for-Kawa/range.scm:64:8: warning - void-valued
expression where value is needed
#|kawa:5|# (in-range 5)
(0 1 2 3 4)
#|kawa:6|# (for ((define i 0) (< i 3) (set! i (+ 1 i))) (display i)
(newline))
/dev/tty:6:7: define is only allowed in a <body>
/dev/tty:6:28: warning - void-valued expression where value is needed
/dev/tty:6:46: warning - void-valued expression where value is needed
/dev/tty:6:58: warning - void-valued expression where value is needed
/dev/tty:6:2: warning - no declaration seen for for
/dev/tty:6:23: warning - no declaration seen for i
/dev/tty:6:28: warning - no declaration seen for i
/dev/tty:6:41: warning - no declaration seen for i
/dev/tty:6:55: warning - no declaration seen for i
#|kawa:7|# (import (for_next_step))
#|kawa:8|# (exit)
(base) mattei@mbp-touch-bar Scheme-PLUS-for-Kawa % kawa
-Dkawa.import.path=".:/Users/mattei/Scheme-PLUS-for-Kawa:"
#|kawa:1|# (import (for_next_step))
#|kawa:2|# (for ((define i 0) (< i 3) (set! i (+ 1 i))) (display i)
(newline))
/dev/tty:2:58: warning - void-valued expression where value is needed
0
1
2
#!null
#|kawa:3|#
On Fri, Jun 14, 2024 at 10:40 AM Damien Mattei <damien.mattei@gmail.com>
wrote:
> hello,
>
> i had a code that worked when in the same module but not split in 2 files
>
> i have this code now in 2 modules:
>
>
> (module-name for_next_step)
>
> (export for)
>
>
> (include "increment.scm")
>
> ;; #|kawa:1|# (import (for_next_step))
> ;; #|kawa:2|# (for ((define i 0) (< i 3) (set! i (+ 1 i))) (display i)
> (newline))
> ;; /dev/tty:2:58: warning - void-valued expression where value is needed
> ;; 0
> ;; 1
> ;; 2
> ;; #!null
>
>
> (define-syntax for
> (lambda (stx)
> (syntax-case stx ()
> ((kwd (init test incrmt) body ...)
> (with-syntax ((BREAK (datum->syntax (syntax kwd) 'break))
> (CONTINUE (datum->syntax (syntax kwd) 'continue)))
> (syntax
> (call/cc
> (lambda (escape)
> (let-syntax ((BREAK (identifier-syntax (escape))))
> init
> (let loop ((res 0)) ;; now we will return a result at the end if no
> break but if we continue? what happens?
> (if test
> (begin
> (call/cc
> (lambda (next)
> (set! res (let-syntax ((CONTINUE (identifier-syntax (next))))
> (let () ;; allow definitions
> body ...)))))
> incrmt
> (loop res))
> res)
> ))))
> ) ;; close syntax
>
> )))))
>
> in for_next_step.scm
>
>
> (define-library (range) ; R7RS
>
> (import (kawa base)
> (for_next_step))
>
> (export in-range
> reversed)
>
>
>
> ;; |kawa:2|# (in-range 5)
> ;; (0 1 2 3 4)
> ;; #|kawa:3|# (in-range 1 5)
> ;; (1 2 3 4)
> ;; #|kawa:4|# (in-range 1 5 2)
> ;;(1 3)
> (define (in-range . arg-lst)
> (define n (length arg-lst))
> (when (or (= n 0) (> n 3))
> (error "in-range: bad number of arguments"))
> (define start 0)
> (define stop 1)
> (define step 1)
> (define res '())
>
> (case n
> ((0) (error "in-range : too few arguments"))
> ((1) (set! stop (car arg-lst)))
> ((2) (begin (set! start (car arg-lst))
> (set! stop (cadr arg-lst))))
> ((3) (begin (set! start (car arg-lst))
> (set! stop (cadr arg-lst))
> (when (= 0 step)
> (error "in-range: step is equal to zero"))
> (set! step (caddr arg-lst)))))
>
> (define (arret step index stop)
> (if (> step 0)
> (< index stop)
> (> index stop)))
>
> (define i start)
> ;;(for ((define i start) (arret step i stop) (set! i (+ step i)))
> (for ('() (arret step i stop) (set! i (+ step i)))
> (set! res (cons i res)))
>
> (reverse res))
>
>
>
>
>
> ;; #|kawa:3|# (in-range 1 11 3)
> ;; (1 4 7 10)
> ;; #|kawa:4|# (reversed (in-range 1 11 3))
> ;; (10 7 4 1)
> ;; #|kawa:5|# (in-range 8 1 -2)
> ;; (8 6 4 2)
> ;; #|kawa:6|# (reversed (in-range 8 1 -2))
> ;; (2 4 6 8)
> ;; #|kawa:7|# (in-range 8 1 -1)
> ;; (8 7 6 5 4 3 2)
> ;; #|kawa:8|# (reversed (in-range 8 1 -1))
>
> (define reversed reverse)
>
> ) ; end module
>
> in range.scm
>
> when all was in one file i had no error
>
> now for works:
> #|kawa:1|# (import (for_next_step))
> #|kawa:2|# (for ((define i 0) (< i 3) (set! i (+ 1 i))) (display i)
> (newline))
> /dev/tty:2:58: warning - void-valued expression where value is needed
> 0
> 1
> 2
> #!null
>
> but when i use range, error:
>
> (base) mattei@mbp-touch-bar Scheme-PLUS-for-Kawa % kawa
> -Dkawa.import.path=".:/Users/mattei/Scheme-PLUS-for-Kawa:"
> #|kawa:1|# (require range)
> /Users/mattei/Scheme-PLUS-for-Kawa/range.scm:61:9: define is only allowed
> in a <body>
>
> the problem is with that line:
>
> (for ((define i start) (arret step i stop) (set! i (+ step i)))
> (set! res (cons i res)))
>
> now define is forbidden but it worked when all was in a file
>
> so i have to make this (see code more above):
> (define i start)
> ;;(for ((define i start) (arret step i stop) (set! i (+ step i)))
> (for ('() (arret step i stop) (set! i (+ step i)))
> (set! res (cons i res)))
>
> seems kawa do not understand that (define i start) is used in a macro ,not
> a procedure.
>
> i do not know where the problem comes , i know it was working for years
> and now it is broken...
>
> regards,
>
> damien
>
>
More information about the Kawa
mailing list