public inbox for kawa@sourceware.org
 help / color / mirror / Atom feed
* unbound location: *
@ 2023-11-01  8:39 Damien Mattei
  2023-11-01 12:22 ` Damien Mattei
  0 siblings, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-01  8:39 UTC (permalink / raw)
  To: kawa mailing list

hello,

i created a module this way:

(module-name "matrix")

(export multiply-matrix-matrix
    multiply-matrix-vector
    matrix
    matrix-v
    create-matrix-by-function
    dim-matrix
    matrix-ref
    matrix-set!
    matrix-line-ref
    matrix-line-set!
    vector->matrix-column
    matrix-column->vector
    *)

(require Scheme+)


;; (matrix #(1 2 3))
;; matrix@4612b856


(define-simple-class matrix ()

  (v :: vector)

  ((*init* (vParam :: vector))
   (set! v vParam))

  )

(display "multiply : * =") (display *) (newline)


;; (define M (create-matrix-by-function (lambda (i j) (+ i j)) 2 3))
(define (create-matrix-by-function fct lin col)
  (matrix (create-vector-2d fct lin col)))


;; return the line and column values of dimension
;; (dim-matrix M)
;; 2 3
(define (dim-matrix M)

  (when (not (matrix? M))
    (error "argument is not of type matrix"))

  {v <+ (matrix-v M)}
  {lin <+ (vector-length v)}
  {col <+ (vector-length {v[0]})}
  (values lin col))

;; #|kawa:85|# (define M1 (create-matrix-by-function (lambda (i j) (+
i j)) 2 3))
;; #|kawa:86|# (define M2 (create-matrix-by-function (lambda (i j) (+
i j)) 3 2))
;; #|kawa:87|# (multiply-matrix-matrix M1 M2)
;; matrix@3fc1abf
;; #|kawa:88|# (define M1*M2 (multiply-matrix-matrix M1 M2))
;; #|kawa:89|# M1*M2
;; matrix@3bf5911d
;; #|kawa:90|# (matrix-v M1*M2)
;; #(#(5 8) #(8 14))
;; #|kawa:91|# (matrix-v M1)
;; #(#(0 1 2) #(1 2 3))
;; #|kawa:92|# (matrix-v M2)
;; #(#(0 1) #(1 2) #(2 3))
(define (multiply-matrix-matrix M1 M2)

  {(n1 p1) <+ (dim-matrix M1)}
  {(n2 p2) <+ (dim-matrix M2)}

  (when {p1 ≠ n2} (error "matrix.* : matrix product impossible,
incompatible dimensions"))

  {v1 <+ (matrix-v M1)}
  {v2 <+ (matrix-v M2)}

  (define (res i j)
    {sum <+ 0}
    (for ({k <+ 0} {k < p1} {k <- k + 1})
     {sum <- sum + v1[i][k] * v2[k][j]})
    (display "sum=")(display sum) (newline)
    sum)

  {v <+ (create-vector-2d res n1 p2)}

  (matrix v))



(overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))



....

i cut off the whole code, the code used to works with 'include' , now
that i try with modules i stuck on this error at the line
(overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))

note that matrix+.scm is converted externally in matrix.scm :

(module-name "matrix")
(export multiply-matrix-matrix multiply-matrix-vector matrix matrix-v
 create-matrix-by-function dim-matrix matrix-ref matrix-set! matrix-line-ref
 matrix-line-set! vector->matrix-column matrix-column->vector *)
(require Scheme+)
(define-simple-class matrix () (v :: vector)
 ((*init* (vParam :: vector)) (set! v vParam)))
(display "multiply : * =")
(display *)
(newline)
(define (create-matrix-by-function fct lin col)
 (matrix (create-vector-2d fct lin col)))
(define (dim-matrix M)
 (when (not (matrix? M)) (error "argument is not of type matrix"))
 (<+ v (matrix-v M)) (<+ lin (vector-length v))
 (<+ col (vector-length (bracket-apply v 0))) (values lin col))
(define (multiply-matrix-matrix M1 M2) (<+ (n1 p1) (dim-matrix M1))
 (<+ (n2 p2) (dim-matrix M2))
 (when (|≠| p1 n2)
  (error "matrix.* : matrix product impossible, incompatible dimensions"))
 (<+ v1 (matrix-v M1)) (<+ v2 (matrix-v M2))
 (define (res i j) (<+ sum 0)
  (for ((<+ k 0) (< k p1) ($nfx$ k <- k + 1))
   ($nfx$ sum <- sum + (bracket-apply (bracket-apply v1 i) k) *
    (bracket-apply (bracket-apply v2 k) j)))
  (display "sum=") (display sum) (newline) sum)
 (<+ v (create-vector-2d res n1 p2)) (matrix v))
(overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
(define (matrix-v M) (slot-ref M (quote v)))
(define (vector->matrix-column v)
 (matrix (vector-map (lambda (x) (make-vector 1 x)) v)))
(define (matrix-column->vector Mc) (<+ v (matrix-v Mc))
 (vector-map (lambda (v2) (bracket-apply v2 0)) v))
(define (multiply-matrix-vector M v) (<+ Mc (vector->matrix-column v))
 (matrix-column->vector (multiply-matrix-matrix M Mc)))
(define (matrix-ref M lin col) (<+ v (matrix-v M))
 (bracket-apply (bracket-apply v lin) col))
(define (matrix-set! M lin col x) (<+ v (matrix-v M))
 (<- (bracket-apply (bracket-apply v lin) col) x))
(define (matrix-line-ref M lin) (<+ v (matrix-v M)) (bracket-apply v lin))
(define (matrix-line-set! M lin vect-line) (<+ v (matrix-v M))
 (<- (bracket-apply v lin) vect-line))
(overload-square-brackets matrix-ref matrix-set! (matrix? number? number?))
(overload-square-brackets matrix-line-ref matrix-line-set! (matrix? number?))


overload-existing-operator redefine the * operator , so basically it
needs the original one to not loose the * between numbers
the code is:

(define-syntax overload-existing-operator

  (syntax-rules ()

    ((_ orig-funct funct (pred-arg1 ...))
       (define orig-funct (create-overloaded-existing-operator
orig-funct funct (list pred-arg1 ...))))))

(define (create-overloaded-existing-operator orig-funct funct
pred-list) ;; works for associative operators

  (display "create-overloaded-existing-operator")
  (display " : pred-list = ") (display pred-list) (newline)
  (define old-funct orig-funct)
  (define new-funct (lambda args ;; args is the list of arguments
              ;; (display "new-funct: new-funct = ") (display
new-funct) (newline)
              ;; (display "new-funct : pred-list = ") (display
pred-list) (newline)
              ;; (display "new-funct : args = ") (display args) (newline)
              (define nb-args (length args))
              ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
              (cond ((check-arguments pred-list args) ;;(begin
                                ;;(display "new funct :calling:")
(display funct) (newline)
                                (apply funct args));;)
                ((> nb-args 2) (new-funct (car args)
                              (apply new-funct (cdr args)))) ;;
op(a,b,...) = op(a,op(b,...))
                (else
                 ;;(begin
                   ;;(display "new funct :calling: ") (display
old-funct) (newline)
                   (apply old-funct args)))));;)

  (display "funct: ") (display funct) (newline)
  (display "orig-funct: ") (display orig-funct) (newline)
  (display "old-funct: ") (display old-funct) (newline)
  (display "new-funct: ") (display new-funct) (newline)

  (replace-operator! orig-funct new-funct)

  new-funct)

this weird code  return the new-funct which is the overloaded * , at
the line  (overload-existing-operator * multiply-matrix-matrix
(matrix? matrix?))

i got this error:
Exception in thread "main" java.lang.ExceptionInInitializerError
    at atInteractiveLevel-8.run(exo_retropropagationNhidden_layers_matrix_v2_by_vectors4kawa+.scm:43)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.runFile(Shell.java:551)
    at kawa.standard.load.apply2(load.java:67)
    at kawa.standard.load.apply1(load.java:27)
    at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
    at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
    at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.run(Shell.java:196)
    at kawa.Shell.run(Shell.java:183)
    at kawa.repl.processArgs(repl.java:724)
    at kawa.repl.main(repl.java:830)
Caused by: /Users/mattei/Library/CloudStorage/Dropbox/git/AI_Deep_Learning/kawa/matrix.scm:9:10:
unbound location: *
    at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
    at matrix.<clinit>(matrix.scm:9)
    ... 17 more

ok * seems not bound to any procedure

when i display it for debug i got:

multiply : * =%

note that % is in reversed colors (white on black background) i cannot
copy/paste it....

all the code is called from a main file:

(require matrix)
(require array)

(require Scheme+)

it seems in a module * is not bound to anything, i had a same problem
in Racket where i need to import racket/base, is there such a need in
Kawa? ,i can find anything related in the doc.

regards,
damien

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01  8:39 unbound location: * Damien Mattei
@ 2023-11-01 12:22 ` Damien Mattei
  2023-11-01 12:50   ` Damien Mattei
  2023-11-01 14:55   ` Per Bothner
  0 siblings, 2 replies; 12+ messages in thread
From: Damien Mattei @ 2023-11-01 12:22 UTC (permalink / raw)
  To: kawa mailing list

here is a counter example:

;; test-define.scm

(module-name test-define)

(export *)

(display *) (newline)

(define * +)

(display *) (newline)

;; main-test-define.scm

(require test-define)

(define rv (* 2 3))
(display rv) (newline)

#|kawa:1|# (load
"/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
#<procedure +>
#<procedure +>
5

but i do not quite understand , first display shoud have display #<procedure *>
but no it displays #<procedure +>


On Wed, Nov 1, 2023 at 9:39 AM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> hello,
>
> i created a module this way:
>
> (module-name "matrix")
>
> (export multiply-matrix-matrix
>     multiply-matrix-vector
>     matrix
>     matrix-v
>     create-matrix-by-function
>     dim-matrix
>     matrix-ref
>     matrix-set!
>     matrix-line-ref
>     matrix-line-set!
>     vector->matrix-column
>     matrix-column->vector
>     *)
>
> (require Scheme+)
>
>
> ;; (matrix #(1 2 3))
> ;; matrix@4612b856
>
>
> (define-simple-class matrix ()
>
>   (v :: vector)
>
>   ((*init* (vParam :: vector))
>    (set! v vParam))
>
>   )
>
> (display "multiply : * =") (display *) (newline)
>
>
> ;; (define M (create-matrix-by-function (lambda (i j) (+ i j)) 2 3))
> (define (create-matrix-by-function fct lin col)
>   (matrix (create-vector-2d fct lin col)))
>
>
> ;; return the line and column values of dimension
> ;; (dim-matrix M)
> ;; 2 3
> (define (dim-matrix M)
>
>   (when (not (matrix? M))
>     (error "argument is not of type matrix"))
>
>   {v <+ (matrix-v M)}
>   {lin <+ (vector-length v)}
>   {col <+ (vector-length {v[0]})}
>   (values lin col))
>
> ;; #|kawa:85|# (define M1 (create-matrix-by-function (lambda (i j) (+
> i j)) 2 3))
> ;; #|kawa:86|# (define M2 (create-matrix-by-function (lambda (i j) (+
> i j)) 3 2))
> ;; #|kawa:87|# (multiply-matrix-matrix M1 M2)
> ;; matrix@3fc1abf
> ;; #|kawa:88|# (define M1*M2 (multiply-matrix-matrix M1 M2))
> ;; #|kawa:89|# M1*M2
> ;; matrix@3bf5911d
> ;; #|kawa:90|# (matrix-v M1*M2)
> ;; #(#(5 8) #(8 14))
> ;; #|kawa:91|# (matrix-v M1)
> ;; #(#(0 1 2) #(1 2 3))
> ;; #|kawa:92|# (matrix-v M2)
> ;; #(#(0 1) #(1 2) #(2 3))
> (define (multiply-matrix-matrix M1 M2)
>
>   {(n1 p1) <+ (dim-matrix M1)}
>   {(n2 p2) <+ (dim-matrix M2)}
>
>   (when {p1 ≠ n2} (error "matrix.* : matrix product impossible,
> incompatible dimensions"))
>
>   {v1 <+ (matrix-v M1)}
>   {v2 <+ (matrix-v M2)}
>
>   (define (res i j)
>     {sum <+ 0}
>     (for ({k <+ 0} {k < p1} {k <- k + 1})
>      {sum <- sum + v1[i][k] * v2[k][j]})
>     (display "sum=")(display sum) (newline)
>     sum)
>
>   {v <+ (create-vector-2d res n1 p2)}
>
>   (matrix v))
>
>
>
> (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
>
>
>
> ....
>
> i cut off the whole code, the code used to works with 'include' , now
> that i try with modules i stuck on this error at the line
> (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
>
> note that matrix+.scm is converted externally in matrix.scm :
>
> (module-name "matrix")
> (export multiply-matrix-matrix multiply-matrix-vector matrix matrix-v
>  create-matrix-by-function dim-matrix matrix-ref matrix-set! matrix-line-ref
>  matrix-line-set! vector->matrix-column matrix-column->vector *)
> (require Scheme+)
> (define-simple-class matrix () (v :: vector)
>  ((*init* (vParam :: vector)) (set! v vParam)))
> (display "multiply : * =")
> (display *)
> (newline)
> (define (create-matrix-by-function fct lin col)
>  (matrix (create-vector-2d fct lin col)))
> (define (dim-matrix M)
>  (when (not (matrix? M)) (error "argument is not of type matrix"))
>  (<+ v (matrix-v M)) (<+ lin (vector-length v))
>  (<+ col (vector-length (bracket-apply v 0))) (values lin col))
> (define (multiply-matrix-matrix M1 M2) (<+ (n1 p1) (dim-matrix M1))
>  (<+ (n2 p2) (dim-matrix M2))
>  (when (|≠| p1 n2)
>   (error "matrix.* : matrix product impossible, incompatible dimensions"))
>  (<+ v1 (matrix-v M1)) (<+ v2 (matrix-v M2))
>  (define (res i j) (<+ sum 0)
>   (for ((<+ k 0) (< k p1) ($nfx$ k <- k + 1))
>    ($nfx$ sum <- sum + (bracket-apply (bracket-apply v1 i) k) *
>     (bracket-apply (bracket-apply v2 k) j)))
>   (display "sum=") (display sum) (newline) sum)
>  (<+ v (create-vector-2d res n1 p2)) (matrix v))
> (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> (define (matrix-v M) (slot-ref M (quote v)))
> (define (vector->matrix-column v)
>  (matrix (vector-map (lambda (x) (make-vector 1 x)) v)))
> (define (matrix-column->vector Mc) (<+ v (matrix-v Mc))
>  (vector-map (lambda (v2) (bracket-apply v2 0)) v))
> (define (multiply-matrix-vector M v) (<+ Mc (vector->matrix-column v))
>  (matrix-column->vector (multiply-matrix-matrix M Mc)))
> (define (matrix-ref M lin col) (<+ v (matrix-v M))
>  (bracket-apply (bracket-apply v lin) col))
> (define (matrix-set! M lin col x) (<+ v (matrix-v M))
>  (<- (bracket-apply (bracket-apply v lin) col) x))
> (define (matrix-line-ref M lin) (<+ v (matrix-v M)) (bracket-apply v lin))
> (define (matrix-line-set! M lin vect-line) (<+ v (matrix-v M))
>  (<- (bracket-apply v lin) vect-line))
> (overload-square-brackets matrix-ref matrix-set! (matrix? number? number?))
> (overload-square-brackets matrix-line-ref matrix-line-set! (matrix? number?))
>
>
> overload-existing-operator redefine the * operator , so basically it
> needs the original one to not loose the * between numbers
> the code is:
>
> (define-syntax overload-existing-operator
>
>   (syntax-rules ()
>
>     ((_ orig-funct funct (pred-arg1 ...))
>        (define orig-funct (create-overloaded-existing-operator
> orig-funct funct (list pred-arg1 ...))))))
>
> (define (create-overloaded-existing-operator orig-funct funct
> pred-list) ;; works for associative operators
>
>   (display "create-overloaded-existing-operator")
>   (display " : pred-list = ") (display pred-list) (newline)
>   (define old-funct orig-funct)
>   (define new-funct (lambda args ;; args is the list of arguments
>               ;; (display "new-funct: new-funct = ") (display
> new-funct) (newline)
>               ;; (display "new-funct : pred-list = ") (display
> pred-list) (newline)
>               ;; (display "new-funct : args = ") (display args) (newline)
>               (define nb-args (length args))
>               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
>               (cond ((check-arguments pred-list args) ;;(begin
>                                 ;;(display "new funct :calling:")
> (display funct) (newline)
>                                 (apply funct args));;)
>                 ((> nb-args 2) (new-funct (car args)
>                               (apply new-funct (cdr args)))) ;;
> op(a,b,...) = op(a,op(b,...))
>                 (else
>                  ;;(begin
>                    ;;(display "new funct :calling: ") (display
> old-funct) (newline)
>                    (apply old-funct args)))));;)
>
>   (display "funct: ") (display funct) (newline)
>   (display "orig-funct: ") (display orig-funct) (newline)
>   (display "old-funct: ") (display old-funct) (newline)
>   (display "new-funct: ") (display new-funct) (newline)
>
>   (replace-operator! orig-funct new-funct)
>
>   new-funct)
>
> this weird code  return the new-funct which is the overloaded * , at
> the line  (overload-existing-operator * multiply-matrix-matrix
> (matrix? matrix?))
>
> i got this error:
> Exception in thread "main" java.lang.ExceptionInInitializerError
>     at atInteractiveLevel-8.run(exo_retropropagationNhidden_layers_matrix_v2_by_vectors4kawa+.scm:43)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.runFile(Shell.java:551)
>     at kawa.standard.load.apply2(load.java:67)
>     at kawa.standard.load.apply1(load.java:27)
>     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
>     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
>     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.run(Shell.java:196)
>     at kawa.Shell.run(Shell.java:183)
>     at kawa.repl.processArgs(repl.java:724)
>     at kawa.repl.main(repl.java:830)
> Caused by: /Users/mattei/Library/CloudStorage/Dropbox/git/AI_Deep_Learning/kawa/matrix.scm:9:10:
> unbound location: *
>     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
>     at matrix.<clinit>(matrix.scm:9)
>     ... 17 more
>
> ok * seems not bound to any procedure
>
> when i display it for debug i got:
>
> multiply : * =%
>
> note that % is in reversed colors (white on black background) i cannot
> copy/paste it....
>
> all the code is called from a main file:
>
> (require matrix)
> (require array)
>
> (require Scheme+)
>
> it seems in a module * is not bound to anything, i had a same problem
> in Racket where i need to import racket/base, is there such a need in
> Kawa? ,i can find anything related in the doc.
>
> regards,
> damien

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 12:22 ` Damien Mattei
@ 2023-11-01 12:50   ` Damien Mattei
  2023-11-01 14:02     ` Damien Mattei
  2023-11-01 14:55   ` Per Bothner
  1 sibling, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-01 12:50 UTC (permalink / raw)
  To: kawa mailing list

a simpler example that lead to the same error:

(module-name test-define)

(require Scheme+)

(export +)

; first stage overloading
(define-overload-existing-operator +)



; second stage overloading
(overload-existing-operator + vector-append (vector? vector?))


(display +) (newline)


a main file:

(require test-define)

(define rv (+ #(1 2) #(3 4 5)))
(newline) (display "rv=") (display rv) (newline)

result:
#|kawa:1|# (load
"/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:89:6:
warning - void-valued expression where value is needed
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:15:10:
warning - no use of only-one?
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:18:10:
warning - no use of pair-list?
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:21:10:
warning - no use of empty?
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:54:10:
warning - no use of insertNoDups
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:61:10:
warning - no use of remove-duplicates
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:67:10:
warning - no use of singleton-list?
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:73:10:
warning - no use of create-list
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:88:10:
warning - no use of uniq
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:97:10:
warning - no use of remove-firsts-elements
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:115:10:
warning - no use of remove-last
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:157:10:
warning - no use of debut
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:162:10:
warning - no use of debut-iter
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:173:10:
warning - no use of not-list?
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:181:10:
warning - no use of before-element
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:189:10:
warning - no use of start-with-element
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:198:10:
warning - no use of pair-list-elements
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/overload.scm:399:10:
warning - no use of
find-getter-and-setter-for-overloaded-square-brackets
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:332:7:
warning - void-valued expression where value is needed
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:337:7:
warning - void-valued expression where value is needed
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:
note - skipped 0 errors, 29 warnings, 0 notes
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:13:29:
unbound location: +
    at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
    at test-define.run(test-define.scm:13)
    at gnu.expr.ModuleBody.run(ModuleBody.java:51)
    at gnu.expr.ModuleBody.run(ModuleBody.java:35)
    at atInteractiveLevel-2.run(main-test-define.scm:1)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.runFile(Shell.java:551)
    at kawa.standard.load.apply2(load.java:67)
    at kawa.standard.load.apply1(load.java:27)
    at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
    at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
    at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.run(Shell.java:196)
    at kawa.Shell.run(Shell.java:183)
    at kawa.repl.processArgs(repl.java:724)
    at kawa.repl.main(repl.java:830)

why + is unbound? in the worse case i should still have the default addition,no?

seems something is crashing in this code without any element to debug:
(define (create-overloaded-existing-operator orig-funct funct
pred-list) ;; works for associative operators

  (display "create-overloaded-existing-operator")
  (display " : pred-list = ") (display pred-list) (newline)
  (define old-funct orig-funct)
  (define new-funct (lambda args ;; args is the list of arguments
              ;; (display "new-funct: new-funct = ") (display
new-funct) (newline)
              ;; (display "new-funct : pred-list = ") (display
pred-list) (newline)
              ;; (display "new-funct : args = ") (display args) (newline)
              (define nb-args (length args))
              ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
              (cond ((check-arguments pred-list args) ;;(begin
                                ;;(display "new funct :calling:")
(display funct) (newline)
                                (apply funct args));;)
                ((> nb-args 2) (new-funct (car args)
                              (apply new-funct (cdr args)))) ;;
op(a,b,...) = op(a,op(b,...))
                (else
                 ;;(begin
                   ;;(display "new funct :calling: ") (display
old-funct) (newline)
                   (apply old-funct args)))));;)

  (display "funct: ") (display funct) (newline)
  (display "orig-funct: ") (display orig-funct) (newline)
  (display "old-funct: ") (display old-funct) (newline)
  (display "new-funct: ") (display new-funct) (newline)

  (replace-operator! orig-funct new-funct)

  new-funct)

On Wed, Nov 1, 2023 at 1:22 PM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> here is a counter example:
>
> ;; test-define.scm
>
> (module-name test-define)
>
> (export *)
>
> (display *) (newline)
>
> (define * +)
>
> (display *) (newline)
>
> ;; main-test-define.scm
>
> (require test-define)
>
> (define rv (* 2 3))
> (display rv) (newline)
>
> #|kawa:1|# (load
> "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> #<procedure +>
> #<procedure +>
> 5
>
> but i do not quite understand , first display shoud have display #<procedure *>
> but no it displays #<procedure +>
>
>
> On Wed, Nov 1, 2023 at 9:39 AM Damien Mattei <damien.mattei@gmail.com> wrote:
> >
> > hello,
> >
> > i created a module this way:
> >
> > (module-name "matrix")
> >
> > (export multiply-matrix-matrix
> >     multiply-matrix-vector
> >     matrix
> >     matrix-v
> >     create-matrix-by-function
> >     dim-matrix
> >     matrix-ref
> >     matrix-set!
> >     matrix-line-ref
> >     matrix-line-set!
> >     vector->matrix-column
> >     matrix-column->vector
> >     *)
> >
> > (require Scheme+)
> >
> >
> > ;; (matrix #(1 2 3))
> > ;; matrix@4612b856
> >
> >
> > (define-simple-class matrix ()
> >
> >   (v :: vector)
> >
> >   ((*init* (vParam :: vector))
> >    (set! v vParam))
> >
> >   )
> >
> > (display "multiply : * =") (display *) (newline)
> >
> >
> > ;; (define M (create-matrix-by-function (lambda (i j) (+ i j)) 2 3))
> > (define (create-matrix-by-function fct lin col)
> >   (matrix (create-vector-2d fct lin col)))
> >
> >
> > ;; return the line and column values of dimension
> > ;; (dim-matrix M)
> > ;; 2 3
> > (define (dim-matrix M)
> >
> >   (when (not (matrix? M))
> >     (error "argument is not of type matrix"))
> >
> >   {v <+ (matrix-v M)}
> >   {lin <+ (vector-length v)}
> >   {col <+ (vector-length {v[0]})}
> >   (values lin col))
> >
> > ;; #|kawa:85|# (define M1 (create-matrix-by-function (lambda (i j) (+
> > i j)) 2 3))
> > ;; #|kawa:86|# (define M2 (create-matrix-by-function (lambda (i j) (+
> > i j)) 3 2))
> > ;; #|kawa:87|# (multiply-matrix-matrix M1 M2)
> > ;; matrix@3fc1abf
> > ;; #|kawa:88|# (define M1*M2 (multiply-matrix-matrix M1 M2))
> > ;; #|kawa:89|# M1*M2
> > ;; matrix@3bf5911d
> > ;; #|kawa:90|# (matrix-v M1*M2)
> > ;; #(#(5 8) #(8 14))
> > ;; #|kawa:91|# (matrix-v M1)
> > ;; #(#(0 1 2) #(1 2 3))
> > ;; #|kawa:92|# (matrix-v M2)
> > ;; #(#(0 1) #(1 2) #(2 3))
> > (define (multiply-matrix-matrix M1 M2)
> >
> >   {(n1 p1) <+ (dim-matrix M1)}
> >   {(n2 p2) <+ (dim-matrix M2)}
> >
> >   (when {p1 ≠ n2} (error "matrix.* : matrix product impossible,
> > incompatible dimensions"))
> >
> >   {v1 <+ (matrix-v M1)}
> >   {v2 <+ (matrix-v M2)}
> >
> >   (define (res i j)
> >     {sum <+ 0}
> >     (for ({k <+ 0} {k < p1} {k <- k + 1})
> >      {sum <- sum + v1[i][k] * v2[k][j]})
> >     (display "sum=")(display sum) (newline)
> >     sum)
> >
> >   {v <+ (create-vector-2d res n1 p2)}
> >
> >   (matrix v))
> >
> >
> >
> > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> >
> >
> >
> > ....
> >
> > i cut off the whole code, the code used to works with 'include' , now
> > that i try with modules i stuck on this error at the line
> > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> >
> > note that matrix+.scm is converted externally in matrix.scm :
> >
> > (module-name "matrix")
> > (export multiply-matrix-matrix multiply-matrix-vector matrix matrix-v
> >  create-matrix-by-function dim-matrix matrix-ref matrix-set! matrix-line-ref
> >  matrix-line-set! vector->matrix-column matrix-column->vector *)
> > (require Scheme+)
> > (define-simple-class matrix () (v :: vector)
> >  ((*init* (vParam :: vector)) (set! v vParam)))
> > (display "multiply : * =")
> > (display *)
> > (newline)
> > (define (create-matrix-by-function fct lin col)
> >  (matrix (create-vector-2d fct lin col)))
> > (define (dim-matrix M)
> >  (when (not (matrix? M)) (error "argument is not of type matrix"))
> >  (<+ v (matrix-v M)) (<+ lin (vector-length v))
> >  (<+ col (vector-length (bracket-apply v 0))) (values lin col))
> > (define (multiply-matrix-matrix M1 M2) (<+ (n1 p1) (dim-matrix M1))
> >  (<+ (n2 p2) (dim-matrix M2))
> >  (when (|≠| p1 n2)
> >   (error "matrix.* : matrix product impossible, incompatible dimensions"))
> >  (<+ v1 (matrix-v M1)) (<+ v2 (matrix-v M2))
> >  (define (res i j) (<+ sum 0)
> >   (for ((<+ k 0) (< k p1) ($nfx$ k <- k + 1))
> >    ($nfx$ sum <- sum + (bracket-apply (bracket-apply v1 i) k) *
> >     (bracket-apply (bracket-apply v2 k) j)))
> >   (display "sum=") (display sum) (newline) sum)
> >  (<+ v (create-vector-2d res n1 p2)) (matrix v))
> > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > (define (matrix-v M) (slot-ref M (quote v)))
> > (define (vector->matrix-column v)
> >  (matrix (vector-map (lambda (x) (make-vector 1 x)) v)))
> > (define (matrix-column->vector Mc) (<+ v (matrix-v Mc))
> >  (vector-map (lambda (v2) (bracket-apply v2 0)) v))
> > (define (multiply-matrix-vector M v) (<+ Mc (vector->matrix-column v))
> >  (matrix-column->vector (multiply-matrix-matrix M Mc)))
> > (define (matrix-ref M lin col) (<+ v (matrix-v M))
> >  (bracket-apply (bracket-apply v lin) col))
> > (define (matrix-set! M lin col x) (<+ v (matrix-v M))
> >  (<- (bracket-apply (bracket-apply v lin) col) x))
> > (define (matrix-line-ref M lin) (<+ v (matrix-v M)) (bracket-apply v lin))
> > (define (matrix-line-set! M lin vect-line) (<+ v (matrix-v M))
> >  (<- (bracket-apply v lin) vect-line))
> > (overload-square-brackets matrix-ref matrix-set! (matrix? number? number?))
> > (overload-square-brackets matrix-line-ref matrix-line-set! (matrix? number?))
> >
> >
> > overload-existing-operator redefine the * operator , so basically it
> > needs the original one to not loose the * between numbers
> > the code is:
> >
> > (define-syntax overload-existing-operator
> >
> >   (syntax-rules ()
> >
> >     ((_ orig-funct funct (pred-arg1 ...))
> >        (define orig-funct (create-overloaded-existing-operator
> > orig-funct funct (list pred-arg1 ...))))))
> >
> > (define (create-overloaded-existing-operator orig-funct funct
> > pred-list) ;; works for associative operators
> >
> >   (display "create-overloaded-existing-operator")
> >   (display " : pred-list = ") (display pred-list) (newline)
> >   (define old-funct orig-funct)
> >   (define new-funct (lambda args ;; args is the list of arguments
> >               ;; (display "new-funct: new-funct = ") (display
> > new-funct) (newline)
> >               ;; (display "new-funct : pred-list = ") (display
> > pred-list) (newline)
> >               ;; (display "new-funct : args = ") (display args) (newline)
> >               (define nb-args (length args))
> >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> >               (cond ((check-arguments pred-list args) ;;(begin
> >                                 ;;(display "new funct :calling:")
> > (display funct) (newline)
> >                                 (apply funct args));;)
> >                 ((> nb-args 2) (new-funct (car args)
> >                               (apply new-funct (cdr args)))) ;;
> > op(a,b,...) = op(a,op(b,...))
> >                 (else
> >                  ;;(begin
> >                    ;;(display "new funct :calling: ") (display
> > old-funct) (newline)
> >                    (apply old-funct args)))));;)
> >
> >   (display "funct: ") (display funct) (newline)
> >   (display "orig-funct: ") (display orig-funct) (newline)
> >   (display "old-funct: ") (display old-funct) (newline)
> >   (display "new-funct: ") (display new-funct) (newline)
> >
> >   (replace-operator! orig-funct new-funct)
> >
> >   new-funct)
> >
> > this weird code  return the new-funct which is the overloaded * , at
> > the line  (overload-existing-operator * multiply-matrix-matrix
> > (matrix? matrix?))
> >
> > i got this error:
> > Exception in thread "main" java.lang.ExceptionInInitializerError
> >     at atInteractiveLevel-8.run(exo_retropropagationNhidden_layers_matrix_v2_by_vectors4kawa+.scm:43)
> >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> >     at kawa.Shell.run(Shell.java:289)
> >     at kawa.Shell.runFile(Shell.java:551)
> >     at kawa.standard.load.apply2(load.java:67)
> >     at kawa.standard.load.apply1(load.java:27)
> >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> >     at kawa.Shell.run(Shell.java:289)
> >     at kawa.Shell.run(Shell.java:196)
> >     at kawa.Shell.run(Shell.java:183)
> >     at kawa.repl.processArgs(repl.java:724)
> >     at kawa.repl.main(repl.java:830)
> > Caused by: /Users/mattei/Library/CloudStorage/Dropbox/git/AI_Deep_Learning/kawa/matrix.scm:9:10:
> > unbound location: *
> >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> >     at matrix.<clinit>(matrix.scm:9)
> >     ... 17 more
> >
> > ok * seems not bound to any procedure
> >
> > when i display it for debug i got:
> >
> > multiply : * =%
> >
> > note that % is in reversed colors (white on black background) i cannot
> > copy/paste it....
> >
> > all the code is called from a main file:
> >
> > (require matrix)
> > (require array)
> >
> > (require Scheme+)
> >
> > it seems in a module * is not bound to anything, i had a same problem
> > in Racket where i need to import racket/base, is there such a need in
> > Kawa? ,i can find anything related in the doc.
> >
> > regards,
> > damien

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 12:50   ` Damien Mattei
@ 2023-11-01 14:02     ` Damien Mattei
  2023-11-01 16:11       ` Damien Mattei
  0 siblings, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-01 14:02 UTC (permalink / raw)
  To: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 21213 bytes --]

i post a version of my problem independent to Scheme+.
in two attached files containing this kawa code code:
(module-name test-define)

(require 'srfi-1)

(export +)


(define (check-arguments pred-list args)
  (if (= (length pred-list) (length args))
      (let ((pred-arg-list (map cons pred-list args)))
    ;;(andmap (lambda (p) ((car p) (cdr p)))
    ;; replace andmap with every in Guile
    (every (lambda (p) ((car p) (cdr p)))
           pred-arg-list))
      #f))


(define (create-overloaded-existing-operator orig-funct funct
pred-list) ;; works for associative operators

  (display "create-overloaded-existing-operator")
  (display " : pred-list = ") (display pred-list) (newline)
  (define old-funct orig-funct)
  (define new-funct (lambda args ;; args is the list of arguments
              ;; (display "new-funct: new-funct = ") (display
new-funct) (newline)
              ;; (display "new-funct : pred-list = ") (display
pred-list) (newline)
              ;; (display "new-funct : args = ") (display args) (newline)
              (define nb-args (length args))
              ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
              (cond ((check-arguments pred-list args) ;;(begin
                                ;;(display "new funct :calling:")
(display funct) (newline)
                                (apply funct args));;)
                ((> nb-args 2) (new-funct (car args)
                              (apply new-funct (cdr args)))) ;;
op(a,b,...) = op(a,op(b,...))
                (else
                 ;;(begin
                   ;;(display "new funct :calling: ") (display
old-funct) (newline)
                   (apply old-funct args)))));;)

  (display "funct: ") (display funct) (newline)
  (display "orig-funct: ") (display orig-funct) (newline)
  (display "old-funct: ") (display old-funct) (newline)
  (display "new-funct: ") (display new-funct) (newline)

  ;;(replace-operator! orig-funct new-funct)

  new-funct)

(define-syntax overload-existing-operator

  (syntax-rules ()

    ((_ orig-funct funct (pred-arg1 ...))
       (define orig-funct (create-overloaded-existing-operator
orig-funct funct (list pred-arg1 ...))))))



; first stage overloading
;;(define-overload-existing-operator +) ;; dummy in this implementation



; second stage overloading
(overload-existing-operator + vector-append (vector? vector?))


(display +) (newline)



and a simple main:
(require test-define)

(define rv (+ #(1 2) #(3 4 5)))
(newline) (display "rv=") (display rv) (newline)

i load it this way:

kawa -Dkawa.import.path=".:/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa:./kawa"

(load "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")

#|kawa:1|# (load
"/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:63:29:
unbound location: +
    at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
    at test-define.run(test-define.scm:63)
    at gnu.expr.ModuleBody.run(ModuleBody.java:51)
    at gnu.expr.ModuleBody.run(ModuleBody.java:35)
    at atInteractiveLevel-2.run(main-test-define.scm:1)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.runFile(Shell.java:551)
    at kawa.standard.load.apply2(load.java:67)
    at kawa.standard.load.apply1(load.java:27)
    at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
    at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
    at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.run(Shell.java:196)
    at kawa.Shell.run(Shell.java:183)
    at kawa.repl.processArgs(repl.java:724)
    at kawa.repl.main(repl.java:830)

On Wed, Nov 1, 2023 at 1:50 PM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> a simpler example that lead to the same error:
>
> (module-name test-define)
>
> (require Scheme+)
>
> (export +)
>
> ; first stage overloading
> (define-overload-existing-operator +)
>
>
>
> ; second stage overloading
> (overload-existing-operator + vector-append (vector? vector?))
>
>
> (display +) (newline)
>
>
> a main file:
>
> (require test-define)
>
> (define rv (+ #(1 2) #(3 4 5)))
> (newline) (display "rv=") (display rv) (newline)
>
> result:
> #|kawa:1|# (load
> "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:89:6:
> warning - void-valued expression where value is needed
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:15:10:
> warning - no use of only-one?
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:18:10:
> warning - no use of pair-list?
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:21:10:
> warning - no use of empty?
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:54:10:
> warning - no use of insertNoDups
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:61:10:
> warning - no use of remove-duplicates
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:67:10:
> warning - no use of singleton-list?
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:73:10:
> warning - no use of create-list
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:88:10:
> warning - no use of uniq
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:97:10:
> warning - no use of remove-firsts-elements
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:115:10:
> warning - no use of remove-last
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:157:10:
> warning - no use of debut
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:162:10:
> warning - no use of debut-iter
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:173:10:
> warning - no use of not-list?
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:181:10:
> warning - no use of before-element
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:189:10:
> warning - no use of start-with-element
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:198:10:
> warning - no use of pair-list-elements
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/overload.scm:399:10:
> warning - no use of
> find-getter-and-setter-for-overloaded-square-brackets
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:332:7:
> warning - void-valued expression where value is needed
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:337:7:
> warning - void-valued expression where value is needed
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:
> note - skipped 0 errors, 29 warnings, 0 notes
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:13:29:
> unbound location: +
>     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
>     at test-define.run(test-define.scm:13)
>     at gnu.expr.ModuleBody.run(ModuleBody.java:51)
>     at gnu.expr.ModuleBody.run(ModuleBody.java:35)
>     at atInteractiveLevel-2.run(main-test-define.scm:1)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.runFile(Shell.java:551)
>     at kawa.standard.load.apply2(load.java:67)
>     at kawa.standard.load.apply1(load.java:27)
>     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
>     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
>     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.run(Shell.java:196)
>     at kawa.Shell.run(Shell.java:183)
>     at kawa.repl.processArgs(repl.java:724)
>     at kawa.repl.main(repl.java:830)
>
> why + is unbound? in the worse case i should still have the default addition,no?
>
> seems something is crashing in this code without any element to debug:
> (define (create-overloaded-existing-operator orig-funct funct
> pred-list) ;; works for associative operators
>
>   (display "create-overloaded-existing-operator")
>   (display " : pred-list = ") (display pred-list) (newline)
>   (define old-funct orig-funct)
>   (define new-funct (lambda args ;; args is the list of arguments
>               ;; (display "new-funct: new-funct = ") (display
> new-funct) (newline)
>               ;; (display "new-funct : pred-list = ") (display
> pred-list) (newline)
>               ;; (display "new-funct : args = ") (display args) (newline)
>               (define nb-args (length args))
>               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
>               (cond ((check-arguments pred-list args) ;;(begin
>                                 ;;(display "new funct :calling:")
> (display funct) (newline)
>                                 (apply funct args));;)
>                 ((> nb-args 2) (new-funct (car args)
>                               (apply new-funct (cdr args)))) ;;
> op(a,b,...) = op(a,op(b,...))
>                 (else
>                  ;;(begin
>                    ;;(display "new funct :calling: ") (display
> old-funct) (newline)
>                    (apply old-funct args)))));;)
>
>   (display "funct: ") (display funct) (newline)
>   (display "orig-funct: ") (display orig-funct) (newline)
>   (display "old-funct: ") (display old-funct) (newline)
>   (display "new-funct: ") (display new-funct) (newline)
>
>   (replace-operator! orig-funct new-funct)
>
>   new-funct)
>
> On Wed, Nov 1, 2023 at 1:22 PM Damien Mattei <damien.mattei@gmail.com> wrote:
> >
> > here is a counter example:
> >
> > ;; test-define.scm
> >
> > (module-name test-define)
> >
> > (export *)
> >
> > (display *) (newline)
> >
> > (define * +)
> >
> > (display *) (newline)
> >
> > ;; main-test-define.scm
> >
> > (require test-define)
> >
> > (define rv (* 2 3))
> > (display rv) (newline)
> >
> > #|kawa:1|# (load
> > "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> > #<procedure +>
> > #<procedure +>
> > 5
> >
> > but i do not quite understand , first display shoud have display #<procedure *>
> > but no it displays #<procedure +>
> >
> >
> > On Wed, Nov 1, 2023 at 9:39 AM Damien Mattei <damien.mattei@gmail.com> wrote:
> > >
> > > hello,
> > >
> > > i created a module this way:
> > >
> > > (module-name "matrix")
> > >
> > > (export multiply-matrix-matrix
> > >     multiply-matrix-vector
> > >     matrix
> > >     matrix-v
> > >     create-matrix-by-function
> > >     dim-matrix
> > >     matrix-ref
> > >     matrix-set!
> > >     matrix-line-ref
> > >     matrix-line-set!
> > >     vector->matrix-column
> > >     matrix-column->vector
> > >     *)
> > >
> > > (require Scheme+)
> > >
> > >
> > > ;; (matrix #(1 2 3))
> > > ;; matrix@4612b856
> > >
> > >
> > > (define-simple-class matrix ()
> > >
> > >   (v :: vector)
> > >
> > >   ((*init* (vParam :: vector))
> > >    (set! v vParam))
> > >
> > >   )
> > >
> > > (display "multiply : * =") (display *) (newline)
> > >
> > >
> > > ;; (define M (create-matrix-by-function (lambda (i j) (+ i j)) 2 3))
> > > (define (create-matrix-by-function fct lin col)
> > >   (matrix (create-vector-2d fct lin col)))
> > >
> > >
> > > ;; return the line and column values of dimension
> > > ;; (dim-matrix M)
> > > ;; 2 3
> > > (define (dim-matrix M)
> > >
> > >   (when (not (matrix? M))
> > >     (error "argument is not of type matrix"))
> > >
> > >   {v <+ (matrix-v M)}
> > >   {lin <+ (vector-length v)}
> > >   {col <+ (vector-length {v[0]})}
> > >   (values lin col))
> > >
> > > ;; #|kawa:85|# (define M1 (create-matrix-by-function (lambda (i j) (+
> > > i j)) 2 3))
> > > ;; #|kawa:86|# (define M2 (create-matrix-by-function (lambda (i j) (+
> > > i j)) 3 2))
> > > ;; #|kawa:87|# (multiply-matrix-matrix M1 M2)
> > > ;; matrix@3fc1abf
> > > ;; #|kawa:88|# (define M1*M2 (multiply-matrix-matrix M1 M2))
> > > ;; #|kawa:89|# M1*M2
> > > ;; matrix@3bf5911d
> > > ;; #|kawa:90|# (matrix-v M1*M2)
> > > ;; #(#(5 8) #(8 14))
> > > ;; #|kawa:91|# (matrix-v M1)
> > > ;; #(#(0 1 2) #(1 2 3))
> > > ;; #|kawa:92|# (matrix-v M2)
> > > ;; #(#(0 1) #(1 2) #(2 3))
> > > (define (multiply-matrix-matrix M1 M2)
> > >
> > >   {(n1 p1) <+ (dim-matrix M1)}
> > >   {(n2 p2) <+ (dim-matrix M2)}
> > >
> > >   (when {p1 ≠ n2} (error "matrix.* : matrix product impossible,
> > > incompatible dimensions"))
> > >
> > >   {v1 <+ (matrix-v M1)}
> > >   {v2 <+ (matrix-v M2)}
> > >
> > >   (define (res i j)
> > >     {sum <+ 0}
> > >     (for ({k <+ 0} {k < p1} {k <- k + 1})
> > >      {sum <- sum + v1[i][k] * v2[k][j]})
> > >     (display "sum=")(display sum) (newline)
> > >     sum)
> > >
> > >   {v <+ (create-vector-2d res n1 p2)}
> > >
> > >   (matrix v))
> > >
> > >
> > >
> > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > >
> > >
> > >
> > > ....
> > >
> > > i cut off the whole code, the code used to works with 'include' , now
> > > that i try with modules i stuck on this error at the line
> > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > >
> > > note that matrix+.scm is converted externally in matrix.scm :
> > >
> > > (module-name "matrix")
> > > (export multiply-matrix-matrix multiply-matrix-vector matrix matrix-v
> > >  create-matrix-by-function dim-matrix matrix-ref matrix-set! matrix-line-ref
> > >  matrix-line-set! vector->matrix-column matrix-column->vector *)
> > > (require Scheme+)
> > > (define-simple-class matrix () (v :: vector)
> > >  ((*init* (vParam :: vector)) (set! v vParam)))
> > > (display "multiply : * =")
> > > (display *)
> > > (newline)
> > > (define (create-matrix-by-function fct lin col)
> > >  (matrix (create-vector-2d fct lin col)))
> > > (define (dim-matrix M)
> > >  (when (not (matrix? M)) (error "argument is not of type matrix"))
> > >  (<+ v (matrix-v M)) (<+ lin (vector-length v))
> > >  (<+ col (vector-length (bracket-apply v 0))) (values lin col))
> > > (define (multiply-matrix-matrix M1 M2) (<+ (n1 p1) (dim-matrix M1))
> > >  (<+ (n2 p2) (dim-matrix M2))
> > >  (when (|≠| p1 n2)
> > >   (error "matrix.* : matrix product impossible, incompatible dimensions"))
> > >  (<+ v1 (matrix-v M1)) (<+ v2 (matrix-v M2))
> > >  (define (res i j) (<+ sum 0)
> > >   (for ((<+ k 0) (< k p1) ($nfx$ k <- k + 1))
> > >    ($nfx$ sum <- sum + (bracket-apply (bracket-apply v1 i) k) *
> > >     (bracket-apply (bracket-apply v2 k) j)))
> > >   (display "sum=") (display sum) (newline) sum)
> > >  (<+ v (create-vector-2d res n1 p2)) (matrix v))
> > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > (define (matrix-v M) (slot-ref M (quote v)))
> > > (define (vector->matrix-column v)
> > >  (matrix (vector-map (lambda (x) (make-vector 1 x)) v)))
> > > (define (matrix-column->vector Mc) (<+ v (matrix-v Mc))
> > >  (vector-map (lambda (v2) (bracket-apply v2 0)) v))
> > > (define (multiply-matrix-vector M v) (<+ Mc (vector->matrix-column v))
> > >  (matrix-column->vector (multiply-matrix-matrix M Mc)))
> > > (define (matrix-ref M lin col) (<+ v (matrix-v M))
> > >  (bracket-apply (bracket-apply v lin) col))
> > > (define (matrix-set! M lin col x) (<+ v (matrix-v M))
> > >  (<- (bracket-apply (bracket-apply v lin) col) x))
> > > (define (matrix-line-ref M lin) (<+ v (matrix-v M)) (bracket-apply v lin))
> > > (define (matrix-line-set! M lin vect-line) (<+ v (matrix-v M))
> > >  (<- (bracket-apply v lin) vect-line))
> > > (overload-square-brackets matrix-ref matrix-set! (matrix? number? number?))
> > > (overload-square-brackets matrix-line-ref matrix-line-set! (matrix? number?))
> > >
> > >
> > > overload-existing-operator redefine the * operator , so basically it
> > > needs the original one to not loose the * between numbers
> > > the code is:
> > >
> > > (define-syntax overload-existing-operator
> > >
> > >   (syntax-rules ()
> > >
> > >     ((_ orig-funct funct (pred-arg1 ...))
> > >        (define orig-funct (create-overloaded-existing-operator
> > > orig-funct funct (list pred-arg1 ...))))))
> > >
> > > (define (create-overloaded-existing-operator orig-funct funct
> > > pred-list) ;; works for associative operators
> > >
> > >   (display "create-overloaded-existing-operator")
> > >   (display " : pred-list = ") (display pred-list) (newline)
> > >   (define old-funct orig-funct)
> > >   (define new-funct (lambda args ;; args is the list of arguments
> > >               ;; (display "new-funct: new-funct = ") (display
> > > new-funct) (newline)
> > >               ;; (display "new-funct : pred-list = ") (display
> > > pred-list) (newline)
> > >               ;; (display "new-funct : args = ") (display args) (newline)
> > >               (define nb-args (length args))
> > >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> > >               (cond ((check-arguments pred-list args) ;;(begin
> > >                                 ;;(display "new funct :calling:")
> > > (display funct) (newline)
> > >                                 (apply funct args));;)
> > >                 ((> nb-args 2) (new-funct (car args)
> > >                               (apply new-funct (cdr args)))) ;;
> > > op(a,b,...) = op(a,op(b,...))
> > >                 (else
> > >                  ;;(begin
> > >                    ;;(display "new funct :calling: ") (display
> > > old-funct) (newline)
> > >                    (apply old-funct args)))));;)
> > >
> > >   (display "funct: ") (display funct) (newline)
> > >   (display "orig-funct: ") (display orig-funct) (newline)
> > >   (display "old-funct: ") (display old-funct) (newline)
> > >   (display "new-funct: ") (display new-funct) (newline)
> > >
> > >   (replace-operator! orig-funct new-funct)
> > >
> > >   new-funct)
> > >
> > > this weird code  return the new-funct which is the overloaded * , at
> > > the line  (overload-existing-operator * multiply-matrix-matrix
> > > (matrix? matrix?))
> > >
> > > i got this error:
> > > Exception in thread "main" java.lang.ExceptionInInitializerError
> > >     at atInteractiveLevel-8.run(exo_retropropagationNhidden_layers_matrix_v2_by_vectors4kawa+.scm:43)
> > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > >     at kawa.Shell.run(Shell.java:289)
> > >     at kawa.Shell.runFile(Shell.java:551)
> > >     at kawa.standard.load.apply2(load.java:67)
> > >     at kawa.standard.load.apply1(load.java:27)
> > >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> > >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> > >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > >     at kawa.Shell.run(Shell.java:289)
> > >     at kawa.Shell.run(Shell.java:196)
> > >     at kawa.Shell.run(Shell.java:183)
> > >     at kawa.repl.processArgs(repl.java:724)
> > >     at kawa.repl.main(repl.java:830)
> > > Caused by: /Users/mattei/Library/CloudStorage/Dropbox/git/AI_Deep_Learning/kawa/matrix.scm:9:10:
> > > unbound location: *
> > >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> > >     at matrix.<clinit>(matrix.scm:9)
> > >     ... 17 more
> > >
> > > ok * seems not bound to any procedure
> > >
> > > when i display it for debug i got:
> > >
> > > multiply : * =%
> > >
> > > note that % is in reversed colors (white on black background) i cannot
> > > copy/paste it....
> > >
> > > all the code is called from a main file:
> > >
> > > (require matrix)
> > > (require array)
> > >
> > > (require Scheme+)
> > >
> > > it seems in a module * is not bound to anything, i had a same problem
> > > in Racket where i need to import racket/base, is there such a need in
> > > Kawa? ,i can find anything related in the doc.
> > >
> > > regards,
> > > damien

[-- Attachment #2: test-define.scm --]
[-- Type: application/octet-stream, Size: 2148 bytes --]

(module-name test-define)

(require 'srfi-1)

(export +)


(define (check-arguments pred-list args)
  (if (= (length pred-list) (length args))
      (let ((pred-arg-list (map cons pred-list args)))
	;;(andmap (lambda (p) ((car p) (cdr p)))
	;; replace andmap with every in Guile
	(every (lambda (p) ((car p) (cdr p)))
	       pred-arg-list))
      #f))


(define (create-overloaded-existing-operator orig-funct funct pred-list) ;; works for associative operators

  (display "create-overloaded-existing-operator")
  (display " : pred-list = ") (display pred-list) (newline)
  (define old-funct orig-funct)
  (define new-funct (lambda args ;; args is the list of arguments
		      ;; (display "new-funct: new-funct = ") (display new-funct) (newline)
		      ;; (display "new-funct : pred-list = ") (display pred-list) (newline)
		      ;; (display "new-funct : args = ") (display args) (newline)
		      (define nb-args (length args))
		      ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
		      (cond ((check-arguments pred-list args) ;;(begin
								;;(display "new funct :calling:") (display funct) (newline)
								(apply funct args));;)
			    ((> nb-args 2) (new-funct (car args)
						      (apply new-funct (cdr args)))) ;; op(a,b,...) = op(a,op(b,...))
			    (else
			     ;;(begin
			       ;;(display "new funct :calling: ") (display old-funct) (newline)
			       (apply old-funct args)))));;)
				    
  (display "funct: ") (display funct) (newline)
  (display "orig-funct: ") (display orig-funct) (newline)
  (display "old-funct: ") (display old-funct) (newline)
  (display "new-funct: ") (display new-funct) (newline)

  ;;(replace-operator! orig-funct new-funct)

  new-funct)

(define-syntax overload-existing-operator
  
  (syntax-rules ()

    ((_ orig-funct funct (pred-arg1 ...))
       (define orig-funct (create-overloaded-existing-operator orig-funct funct (list pred-arg1 ...))))))



; first stage overloading
;;(define-overload-existing-operator +) ;; dummy in this implementation



; second stage overloading
(overload-existing-operator + vector-append (vector? vector?))


(display +) (newline)


[-- Attachment #3: main-test-define.scm --]
[-- Type: application/octet-stream, Size: 105 bytes --]

(require test-define)

(define rv (+ #(1 2) #(3 4 5)))
(newline) (display "rv=") (display rv) (newline)


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 12:22 ` Damien Mattei
  2023-11-01 12:50   ` Damien Mattei
@ 2023-11-01 14:55   ` Per Bothner
  1 sibling, 0 replies; 12+ messages in thread
From: Per Bothner @ 2023-11-01 14:55 UTC (permalink / raw)
  To: Damien Mattei, kawa mailing list

On 11/1/23 05:22, Damien Mattei via Kawa wrote:
> here is a counter example:
> 
> ;; test-define.scm
> 
> (module-name test-define)
> 
> (export *)
> 
> (display *) (newline)
> 
> (define * +)
> 
> (display *) (newline)
> 
> ;; main-test-define.scm
> 
> (require test-define)
> 
> (define rv (* 2 3))
> (display rv) (newline)
> 
> #|kawa:1|# (load
> "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> #<procedure +>
> #<procedure +>
> 5
> 
> but i do not quite understand , first display shoud have display #<procedure *>
> but no it displays #<procedure +>

'define' is not an assignment. If there is a define in a module, that is the definition - any
other definition is not visible.

Now in some cases if you try to reference a definition before it has been given a value,
you might get an error or some kind of null/undefined value. However, it this particular
case it seems to work.

If you want the sort of dynamic definition you're expecting,
you can try define-variable.
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 14:02     ` Damien Mattei
@ 2023-11-01 16:11       ` Damien Mattei
  2023-11-01 16:47         ` Damien Mattei
  0 siblings, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-01 16:11 UTC (permalink / raw)
  To: kawa mailing list, Per Bothner

if i modify a bit  this version with define-variable instead of
define, it seems to go further as i got an infinite loop:

#|kawa:1|# (load
"/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
Exception in thread "main" java.lang.StackOverflowError
    at java.base/java.lang.ThreadLocal.get(ThreadLocal.java:172)
    at gnu.mapping.Environment.getCurrent(Environment.java:373)
    at gnu.mapping.DynamicLocation.lookup(DynamicLocation.java:28)
    at gnu.mapping.DynamicLocation.isBound(DynamicLocation.java:46)
    at gnu.kawa.reflect.FieldLocation.isBound(FieldLocation.java:360)
    at gnu.mapping.SharedLocation.isBound(SharedLocation.java:34)
    at gnu.mapping.InheritingEnvironment.getLocation(InheritingEnvironment.java:71)
    at gnu.mapping.DynamicLocation.lookup(DynamicLocation.java:29)
    at gnu.mapping.DynamicLocation.isBound(DynamicLocation.java:46)
    at gnu.kawa.reflect.FieldLocation.isBound(FieldLocation.java:360)
    at gnu.mapping.SharedLocation.isBound(SharedLocation.java:34)
    at gnu.mapping.InheritingEnvironment.getLocation(InheritingEnvironment.java:71)
    at gnu.mapping.DynamicLocation.lookup(DynamicLocation.java:29)
    at gnu.mapping.DynamicLocation.isBound(DynamicLocation.java:46)
    at gnu.kawa.reflect.FieldLocation.isBound(FieldLocation.java:360)
    at gnu.mapping.SharedLocation.isBound(SharedLocation.java:34)
    at gnu.mapping.InheritingEnvironment.getLocation(InheritingEnvironment.java:71)
    at gn

....

On Wed, Nov 1, 2023 at 3:02 PM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> i post a version of my problem independent to Scheme+.
> in two attached files containing this kawa code code:
> (module-name test-define)
>
> (require 'srfi-1)
>
> (export +)
>
>
> (define (check-arguments pred-list args)
>   (if (= (length pred-list) (length args))
>       (let ((pred-arg-list (map cons pred-list args)))
>     ;;(andmap (lambda (p) ((car p) (cdr p)))
>     ;; replace andmap with every in Guile
>     (every (lambda (p) ((car p) (cdr p)))
>            pred-arg-list))
>       #f))
>
>
> (define (create-overloaded-existing-operator orig-funct funct
> pred-list) ;; works for associative operators
>
>   (display "create-overloaded-existing-operator")
>   (display " : pred-list = ") (display pred-list) (newline)
>   (define old-funct orig-funct)
>   (define new-funct (lambda args ;; args is the list of arguments
>               ;; (display "new-funct: new-funct = ") (display
> new-funct) (newline)
>               ;; (display "new-funct : pred-list = ") (display
> pred-list) (newline)
>               ;; (display "new-funct : args = ") (display args) (newline)
>               (define nb-args (length args))
>               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
>               (cond ((check-arguments pred-list args) ;;(begin
>                                 ;;(display "new funct :calling:")
> (display funct) (newline)
>                                 (apply funct args));;)
>                 ((> nb-args 2) (new-funct (car args)
>                               (apply new-funct (cdr args)))) ;;
> op(a,b,...) = op(a,op(b,...))
>                 (else
>                  ;;(begin
>                    ;;(display "new funct :calling: ") (display
> old-funct) (newline)
>                    (apply old-funct args)))));;)
>
>   (display "funct: ") (display funct) (newline)
>   (display "orig-funct: ") (display orig-funct) (newline)
>   (display "old-funct: ") (display old-funct) (newline)
>   (display "new-funct: ") (display new-funct) (newline)
>
>   ;;(replace-operator! orig-funct new-funct)
>
>   new-funct)
>
> (define-syntax overload-existing-operator
>
>   (syntax-rules ()
>
>     ((_ orig-funct funct (pred-arg1 ...))
>        (define orig-funct (create-overloaded-existing-operator
> orig-funct funct (list pred-arg1 ...))))))
>
>
>
> ; first stage overloading
> ;;(define-overload-existing-operator +) ;; dummy in this implementation
>
>
>
> ; second stage overloading
> (overload-existing-operator + vector-append (vector? vector?))
>
>
> (display +) (newline)
>
>
>
> and a simple main:
> (require test-define)
>
> (define rv (+ #(1 2) #(3 4 5)))
> (newline) (display "rv=") (display rv) (newline)
>
> i load it this way:
>
> kawa -Dkawa.import.path=".:/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa:./kawa"
>
> (load "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
>
> #|kawa:1|# (load
> "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:63:29:
> unbound location: +
>     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
>     at test-define.run(test-define.scm:63)
>     at gnu.expr.ModuleBody.run(ModuleBody.java:51)
>     at gnu.expr.ModuleBody.run(ModuleBody.java:35)
>     at atInteractiveLevel-2.run(main-test-define.scm:1)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.runFile(Shell.java:551)
>     at kawa.standard.load.apply2(load.java:67)
>     at kawa.standard.load.apply1(load.java:27)
>     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
>     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
>     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.run(Shell.java:196)
>     at kawa.Shell.run(Shell.java:183)
>     at kawa.repl.processArgs(repl.java:724)
>     at kawa.repl.main(repl.java:830)
>
> On Wed, Nov 1, 2023 at 1:50 PM Damien Mattei <damien.mattei@gmail.com> wrote:
> >
> > a simpler example that lead to the same error:
> >
> > (module-name test-define)
> >
> > (require Scheme+)
> >
> > (export +)
> >
> > ; first stage overloading
> > (define-overload-existing-operator +)
> >
> >
> >
> > ; second stage overloading
> > (overload-existing-operator + vector-append (vector? vector?))
> >
> >
> > (display +) (newline)
> >
> >
> > a main file:
> >
> > (require test-define)
> >
> > (define rv (+ #(1 2) #(3 4 5)))
> > (newline) (display "rv=") (display rv) (newline)
> >
> > result:
> > #|kawa:1|# (load
> > "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:89:6:
> > warning - void-valued expression where value is needed
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:15:10:
> > warning - no use of only-one?
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:18:10:
> > warning - no use of pair-list?
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:21:10:
> > warning - no use of empty?
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:54:10:
> > warning - no use of insertNoDups
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:61:10:
> > warning - no use of remove-duplicates
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:67:10:
> > warning - no use of singleton-list?
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:73:10:
> > warning - no use of create-list
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:88:10:
> > warning - no use of uniq
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:97:10:
> > warning - no use of remove-firsts-elements
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:115:10:
> > warning - no use of remove-last
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:157:10:
> > warning - no use of debut
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:162:10:
> > warning - no use of debut-iter
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:173:10:
> > warning - no use of not-list?
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:181:10:
> > warning - no use of before-element
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:189:10:
> > warning - no use of start-with-element
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:198:10:
> > warning - no use of pair-list-elements
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/overload.scm:399:10:
> > warning - no use of
> > find-getter-and-setter-for-overloaded-square-brackets
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:332:7:
> > warning - void-valued expression where value is needed
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:337:7:
> > warning - void-valued expression where value is needed
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:
> > note - skipped 0 errors, 29 warnings, 0 notes
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:13:29:
> > unbound location: +
> >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> >     at test-define.run(test-define.scm:13)
> >     at gnu.expr.ModuleBody.run(ModuleBody.java:51)
> >     at gnu.expr.ModuleBody.run(ModuleBody.java:35)
> >     at atInteractiveLevel-2.run(main-test-define.scm:1)
> >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> >     at kawa.Shell.run(Shell.java:289)
> >     at kawa.Shell.runFile(Shell.java:551)
> >     at kawa.standard.load.apply2(load.java:67)
> >     at kawa.standard.load.apply1(load.java:27)
> >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> >     at kawa.Shell.run(Shell.java:289)
> >     at kawa.Shell.run(Shell.java:196)
> >     at kawa.Shell.run(Shell.java:183)
> >     at kawa.repl.processArgs(repl.java:724)
> >     at kawa.repl.main(repl.java:830)
> >
> > why + is unbound? in the worse case i should still have the default addition,no?
> >
> > seems something is crashing in this code without any element to debug:
> > (define (create-overloaded-existing-operator orig-funct funct
> > pred-list) ;; works for associative operators
> >
> >   (display "create-overloaded-existing-operator")
> >   (display " : pred-list = ") (display pred-list) (newline)
> >   (define old-funct orig-funct)
> >   (define new-funct (lambda args ;; args is the list of arguments
> >               ;; (display "new-funct: new-funct = ") (display
> > new-funct) (newline)
> >               ;; (display "new-funct : pred-list = ") (display
> > pred-list) (newline)
> >               ;; (display "new-funct : args = ") (display args) (newline)
> >               (define nb-args (length args))
> >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> >               (cond ((check-arguments pred-list args) ;;(begin
> >                                 ;;(display "new funct :calling:")
> > (display funct) (newline)
> >                                 (apply funct args));;)
> >                 ((> nb-args 2) (new-funct (car args)
> >                               (apply new-funct (cdr args)))) ;;
> > op(a,b,...) = op(a,op(b,...))
> >                 (else
> >                  ;;(begin
> >                    ;;(display "new funct :calling: ") (display
> > old-funct) (newline)
> >                    (apply old-funct args)))));;)
> >
> >   (display "funct: ") (display funct) (newline)
> >   (display "orig-funct: ") (display orig-funct) (newline)
> >   (display "old-funct: ") (display old-funct) (newline)
> >   (display "new-funct: ") (display new-funct) (newline)
> >
> >   (replace-operator! orig-funct new-funct)
> >
> >   new-funct)
> >
> > On Wed, Nov 1, 2023 at 1:22 PM Damien Mattei <damien.mattei@gmail.com> wrote:
> > >
> > > here is a counter example:
> > >
> > > ;; test-define.scm
> > >
> > > (module-name test-define)
> > >
> > > (export *)
> > >
> > > (display *) (newline)
> > >
> > > (define * +)
> > >
> > > (display *) (newline)
> > >
> > > ;; main-test-define.scm
> > >
> > > (require test-define)
> > >
> > > (define rv (* 2 3))
> > > (display rv) (newline)
> > >
> > > #|kawa:1|# (load
> > > "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> > > #<procedure +>
> > > #<procedure +>
> > > 5
> > >
> > > but i do not quite understand , first display shoud have display #<procedure *>
> > > but no it displays #<procedure +>
> > >
> > >
> > > On Wed, Nov 1, 2023 at 9:39 AM Damien Mattei <damien.mattei@gmail.com> wrote:
> > > >
> > > > hello,
> > > >
> > > > i created a module this way:
> > > >
> > > > (module-name "matrix")
> > > >
> > > > (export multiply-matrix-matrix
> > > >     multiply-matrix-vector
> > > >     matrix
> > > >     matrix-v
> > > >     create-matrix-by-function
> > > >     dim-matrix
> > > >     matrix-ref
> > > >     matrix-set!
> > > >     matrix-line-ref
> > > >     matrix-line-set!
> > > >     vector->matrix-column
> > > >     matrix-column->vector
> > > >     *)
> > > >
> > > > (require Scheme+)
> > > >
> > > >
> > > > ;; (matrix #(1 2 3))
> > > > ;; matrix@4612b856
> > > >
> > > >
> > > > (define-simple-class matrix ()
> > > >
> > > >   (v :: vector)
> > > >
> > > >   ((*init* (vParam :: vector))
> > > >    (set! v vParam))
> > > >
> > > >   )
> > > >
> > > > (display "multiply : * =") (display *) (newline)
> > > >
> > > >
> > > > ;; (define M (create-matrix-by-function (lambda (i j) (+ i j)) 2 3))
> > > > (define (create-matrix-by-function fct lin col)
> > > >   (matrix (create-vector-2d fct lin col)))
> > > >
> > > >
> > > > ;; return the line and column values of dimension
> > > > ;; (dim-matrix M)
> > > > ;; 2 3
> > > > (define (dim-matrix M)
> > > >
> > > >   (when (not (matrix? M))
> > > >     (error "argument is not of type matrix"))
> > > >
> > > >   {v <+ (matrix-v M)}
> > > >   {lin <+ (vector-length v)}
> > > >   {col <+ (vector-length {v[0]})}
> > > >   (values lin col))
> > > >
> > > > ;; #|kawa:85|# (define M1 (create-matrix-by-function (lambda (i j) (+
> > > > i j)) 2 3))
> > > > ;; #|kawa:86|# (define M2 (create-matrix-by-function (lambda (i j) (+
> > > > i j)) 3 2))
> > > > ;; #|kawa:87|# (multiply-matrix-matrix M1 M2)
> > > > ;; matrix@3fc1abf
> > > > ;; #|kawa:88|# (define M1*M2 (multiply-matrix-matrix M1 M2))
> > > > ;; #|kawa:89|# M1*M2
> > > > ;; matrix@3bf5911d
> > > > ;; #|kawa:90|# (matrix-v M1*M2)
> > > > ;; #(#(5 8) #(8 14))
> > > > ;; #|kawa:91|# (matrix-v M1)
> > > > ;; #(#(0 1 2) #(1 2 3))
> > > > ;; #|kawa:92|# (matrix-v M2)
> > > > ;; #(#(0 1) #(1 2) #(2 3))
> > > > (define (multiply-matrix-matrix M1 M2)
> > > >
> > > >   {(n1 p1) <+ (dim-matrix M1)}
> > > >   {(n2 p2) <+ (dim-matrix M2)}
> > > >
> > > >   (when {p1 ≠ n2} (error "matrix.* : matrix product impossible,
> > > > incompatible dimensions"))
> > > >
> > > >   {v1 <+ (matrix-v M1)}
> > > >   {v2 <+ (matrix-v M2)}
> > > >
> > > >   (define (res i j)
> > > >     {sum <+ 0}
> > > >     (for ({k <+ 0} {k < p1} {k <- k + 1})
> > > >      {sum <- sum + v1[i][k] * v2[k][j]})
> > > >     (display "sum=")(display sum) (newline)
> > > >     sum)
> > > >
> > > >   {v <+ (create-vector-2d res n1 p2)}
> > > >
> > > >   (matrix v))
> > > >
> > > >
> > > >
> > > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > >
> > > >
> > > >
> > > > ....
> > > >
> > > > i cut off the whole code, the code used to works with 'include' , now
> > > > that i try with modules i stuck on this error at the line
> > > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > >
> > > > note that matrix+.scm is converted externally in matrix.scm :
> > > >
> > > > (module-name "matrix")
> > > > (export multiply-matrix-matrix multiply-matrix-vector matrix matrix-v
> > > >  create-matrix-by-function dim-matrix matrix-ref matrix-set! matrix-line-ref
> > > >  matrix-line-set! vector->matrix-column matrix-column->vector *)
> > > > (require Scheme+)
> > > > (define-simple-class matrix () (v :: vector)
> > > >  ((*init* (vParam :: vector)) (set! v vParam)))
> > > > (display "multiply : * =")
> > > > (display *)
> > > > (newline)
> > > > (define (create-matrix-by-function fct lin col)
> > > >  (matrix (create-vector-2d fct lin col)))
> > > > (define (dim-matrix M)
> > > >  (when (not (matrix? M)) (error "argument is not of type matrix"))
> > > >  (<+ v (matrix-v M)) (<+ lin (vector-length v))
> > > >  (<+ col (vector-length (bracket-apply v 0))) (values lin col))
> > > > (define (multiply-matrix-matrix M1 M2) (<+ (n1 p1) (dim-matrix M1))
> > > >  (<+ (n2 p2) (dim-matrix M2))
> > > >  (when (|≠| p1 n2)
> > > >   (error "matrix.* : matrix product impossible, incompatible dimensions"))
> > > >  (<+ v1 (matrix-v M1)) (<+ v2 (matrix-v M2))
> > > >  (define (res i j) (<+ sum 0)
> > > >   (for ((<+ k 0) (< k p1) ($nfx$ k <- k + 1))
> > > >    ($nfx$ sum <- sum + (bracket-apply (bracket-apply v1 i) k) *
> > > >     (bracket-apply (bracket-apply v2 k) j)))
> > > >   (display "sum=") (display sum) (newline) sum)
> > > >  (<+ v (create-vector-2d res n1 p2)) (matrix v))
> > > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > > (define (matrix-v M) (slot-ref M (quote v)))
> > > > (define (vector->matrix-column v)
> > > >  (matrix (vector-map (lambda (x) (make-vector 1 x)) v)))
> > > > (define (matrix-column->vector Mc) (<+ v (matrix-v Mc))
> > > >  (vector-map (lambda (v2) (bracket-apply v2 0)) v))
> > > > (define (multiply-matrix-vector M v) (<+ Mc (vector->matrix-column v))
> > > >  (matrix-column->vector (multiply-matrix-matrix M Mc)))
> > > > (define (matrix-ref M lin col) (<+ v (matrix-v M))
> > > >  (bracket-apply (bracket-apply v lin) col))
> > > > (define (matrix-set! M lin col x) (<+ v (matrix-v M))
> > > >  (<- (bracket-apply (bracket-apply v lin) col) x))
> > > > (define (matrix-line-ref M lin) (<+ v (matrix-v M)) (bracket-apply v lin))
> > > > (define (matrix-line-set! M lin vect-line) (<+ v (matrix-v M))
> > > >  (<- (bracket-apply v lin) vect-line))
> > > > (overload-square-brackets matrix-ref matrix-set! (matrix? number? number?))
> > > > (overload-square-brackets matrix-line-ref matrix-line-set! (matrix? number?))
> > > >
> > > >
> > > > overload-existing-operator redefine the * operator , so basically it
> > > > needs the original one to not loose the * between numbers
> > > > the code is:
> > > >
> > > > (define-syntax overload-existing-operator
> > > >
> > > >   (syntax-rules ()
> > > >
> > > >     ((_ orig-funct funct (pred-arg1 ...))
> > > >        (define orig-funct (create-overloaded-existing-operator
> > > > orig-funct funct (list pred-arg1 ...))))))
> > > >
> > > > (define (create-overloaded-existing-operator orig-funct funct
> > > > pred-list) ;; works for associative operators
> > > >
> > > >   (display "create-overloaded-existing-operator")
> > > >   (display " : pred-list = ") (display pred-list) (newline)
> > > >   (define old-funct orig-funct)
> > > >   (define new-funct (lambda args ;; args is the list of arguments
> > > >               ;; (display "new-funct: new-funct = ") (display
> > > > new-funct) (newline)
> > > >               ;; (display "new-funct : pred-list = ") (display
> > > > pred-list) (newline)
> > > >               ;; (display "new-funct : args = ") (display args) (newline)
> > > >               (define nb-args (length args))
> > > >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> > > >               (cond ((check-arguments pred-list args) ;;(begin
> > > >                                 ;;(display "new funct :calling:")
> > > > (display funct) (newline)
> > > >                                 (apply funct args));;)
> > > >                 ((> nb-args 2) (new-funct (car args)
> > > >                               (apply new-funct (cdr args)))) ;;
> > > > op(a,b,...) = op(a,op(b,...))
> > > >                 (else
> > > >                  ;;(begin
> > > >                    ;;(display "new funct :calling: ") (display
> > > > old-funct) (newline)
> > > >                    (apply old-funct args)))));;)
> > > >
> > > >   (display "funct: ") (display funct) (newline)
> > > >   (display "orig-funct: ") (display orig-funct) (newline)
> > > >   (display "old-funct: ") (display old-funct) (newline)
> > > >   (display "new-funct: ") (display new-funct) (newline)
> > > >
> > > >   (replace-operator! orig-funct new-funct)
> > > >
> > > >   new-funct)
> > > >
> > > > this weird code  return the new-funct which is the overloaded * , at
> > > > the line  (overload-existing-operator * multiply-matrix-matrix
> > > > (matrix? matrix?))
> > > >
> > > > i got this error:
> > > > Exception in thread "main" java.lang.ExceptionInInitializerError
> > > >     at atInteractiveLevel-8.run(exo_retropropagationNhidden_layers_matrix_v2_by_vectors4kawa+.scm:43)
> > > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> > > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > > >     at kawa.Shell.run(Shell.java:289)
> > > >     at kawa.Shell.runFile(Shell.java:551)
> > > >     at kawa.standard.load.apply2(load.java:67)
> > > >     at kawa.standard.load.apply1(load.java:27)
> > > >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> > > >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> > > >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> > > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> > > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > > >     at kawa.Shell.run(Shell.java:289)
> > > >     at kawa.Shell.run(Shell.java:196)
> > > >     at kawa.Shell.run(Shell.java:183)
> > > >     at kawa.repl.processArgs(repl.java:724)
> > > >     at kawa.repl.main(repl.java:830)
> > > > Caused by: /Users/mattei/Library/CloudStorage/Dropbox/git/AI_Deep_Learning/kawa/matrix.scm:9:10:
> > > > unbound location: *
> > > >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> > > >     at matrix.<clinit>(matrix.scm:9)
> > > >     ... 17 more
> > > >
> > > > ok * seems not bound to any procedure
> > > >
> > > > when i display it for debug i got:
> > > >
> > > > multiply : * =%
> > > >
> > > > note that % is in reversed colors (white on black background) i cannot
> > > > copy/paste it....
> > > >
> > > > all the code is called from a main file:
> > > >
> > > > (require matrix)
> > > > (require array)
> > > >
> > > > (require Scheme+)
> > > >
> > > > it seems in a module * is not bound to anything, i had a same problem
> > > > in Racket where i need to import racket/base, is there such a need in
> > > > Kawa? ,i can find anything related in the doc.
> > > >
> > > > regards,
> > > > damien

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 16:11       ` Damien Mattei
@ 2023-11-01 16:47         ` Damien Mattei
  2023-11-01 16:57           ` Per Bothner
  0 siblings, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-01 16:47 UTC (permalink / raw)
  To: kawa mailing list, Per Bothner

and replacing 'define' by '!' and it works more:

https://www.gnu.org/software/kawa/tutorial/Variables.html


#|kawa:1|# (load
"/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
/Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:50:10:
warning - no use of create-overloaded-existing-operator2
create-overloaded-existing-operator : pred-list = (#<procedure vector?>
                                                   #<procedure vector?>)
funct: #<procedure vector-append>
orig-funct: #!null
old-funct: #!null
new-funct: #<procedure new-funct>

rv=#(1 2 3 4 5)
#|kawa:2|# +
#<procedure new-funct>
#|kawa:3|# (+ 2 3)
Argument #1 (null) to 'apply' has wrong type (expected: procedure,
sequence, or other operator)
    at gnu.kawa.functions.ApplyToArgs.applyRest(ApplyToArgs.java:209)
    at gnu.kawa.functions.ApplyToArgs.applyToConsumerA2A(ApplyToArgs.java:134)
    at gnu.kawa.functions.Apply.applyToConsumer(Apply.java:31)
    at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
    at gnu.mapping.CallContext.runUntilValue(CallContext.java:669)
    at gnu.mapping.Procedure.apply2(Procedure.java:160)
    at test-define$frame.lambda2newFunct$V(test-define.scm:38)
    at test-define$frame.lambda2newFunct$check(test-define.scm:24)
    at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
    at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.run(Shell.java:196)
    at kawa.Shell.run(Shell.java:183)
    at kawa.repl.processArgs(repl.java:724)
    at kawa.repl.main(repl.java:830)

but i have no more access to previous definition that is not keep in
the overloaded procedure,see #!null values:

here are my two attempt codes:

(define (create-overloaded-existing-operator orig-funct funct
pred-list) ;; works for associative operators

  (display "create-overloaded-existing-operator")
  (display " : pred-list = ") (display pred-list) (newline)
  (define old-funct orig-funct)
  (define new-funct (lambda args ;; args is the list of arguments
              ;; (display "new-funct: new-funct = ") (display
new-funct) (newline)
              ;; (display "new-funct : pred-list = ") (display
pred-list) (newline)
              ;; (display "new-funct : args = ") (display args) (newline)
              (define nb-args (length args))
              ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
              (cond ((check-arguments pred-list args) ;;(begin
                                ;;(display "new funct :calling:")
(display funct) (newline)
                                (apply funct args));;)
                ((> nb-args 2) (new-funct (car args)
                              (apply new-funct (cdr args)))) ;;
op(a,b,...) = op(a,op(b,...))
                (else
                 ;;(begin
                   ;;(display "new funct :calling: ") (display
old-funct) (newline)
                   (apply old-funct args)))));;)

  (display "funct: ") (display funct) (newline)
  (display "orig-funct: ") (display orig-funct) (newline)
  (display "old-funct: ") (display old-funct) (newline)
  (display "new-funct: ") (display new-funct) (newline)

  ;;(replace-operator! orig-funct new-funct)

  new-funct)


(define (create-overloaded-existing-operator2 orig-funct funct
pred-list) ;; works for associative operators

  (let ((old-funct orig-funct))
    (letrec ((new-funct (lambda args ;; args is the list of arguments
              ;; (display "new-funct: new-funct = ") (display
new-funct) (newline)
              ;; (display "new-funct : pred-list = ") (display
pred-list) (newline)
              ;; (display "new-funct : args = ") (display args) (newline)
              (define nb-args (length args))
              ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
              (cond ((check-arguments pred-list args) ;;(begin
                 ;;(display "new funct :calling:") (display funct) (newline)
                 (apply funct args));;)
                ((> nb-args 2) (new-funct (car args)
                              (apply new-funct (cdr args)))) ;;
op(a,b,...) = op(a,op(b,...))
                (else
                 ;;(begin
                 ;;(display "new funct :calling: ") (display
old-funct) (newline)
                 (apply old-funct args))))))
      (display "funct: ") (display funct) (newline)
      (display "orig-funct: ") (display orig-funct) (newline)
      (display "old-funct: ") (display old-funct) (newline)
      (display "new-funct: ") (display new-funct) (newline)
      new-funct)))


with define or let and letrec it give the same #!null ????

On Wed, Nov 1, 2023 at 5:11 PM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> if i modify a bit  this version with define-variable instead of
> define, it seems to go further as i got an infinite loop:
>
> #|kawa:1|# (load
> "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> Exception in thread "main" java.lang.StackOverflowError
>     at java.base/java.lang.ThreadLocal.get(ThreadLocal.java:172)
>     at gnu.mapping.Environment.getCurrent(Environment.java:373)
>     at gnu.mapping.DynamicLocation.lookup(DynamicLocation.java:28)
>     at gnu.mapping.DynamicLocation.isBound(DynamicLocation.java:46)
>     at gnu.kawa.reflect.FieldLocation.isBound(FieldLocation.java:360)
>     at gnu.mapping.SharedLocation.isBound(SharedLocation.java:34)
>     at gnu.mapping.InheritingEnvironment.getLocation(InheritingEnvironment.java:71)
>     at gnu.mapping.DynamicLocation.lookup(DynamicLocation.java:29)
>     at gnu.mapping.DynamicLocation.isBound(DynamicLocation.java:46)
>     at gnu.kawa.reflect.FieldLocation.isBound(FieldLocation.java:360)
>     at gnu.mapping.SharedLocation.isBound(SharedLocation.java:34)
>     at gnu.mapping.InheritingEnvironment.getLocation(InheritingEnvironment.java:71)
>     at gnu.mapping.DynamicLocation.lookup(DynamicLocation.java:29)
>     at gnu.mapping.DynamicLocation.isBound(DynamicLocation.java:46)
>     at gnu.kawa.reflect.FieldLocation.isBound(FieldLocation.java:360)
>     at gnu.mapping.SharedLocation.isBound(SharedLocation.java:34)
>     at gnu.mapping.InheritingEnvironment.getLocation(InheritingEnvironment.java:71)
>     at gn
>
> ....
>
> On Wed, Nov 1, 2023 at 3:02 PM Damien Mattei <damien.mattei@gmail.com> wrote:
> >
> > i post a version of my problem independent to Scheme+.
> > in two attached files containing this kawa code code:
> > (module-name test-define)
> >
> > (require 'srfi-1)
> >
> > (export +)
> >
> >
> > (define (check-arguments pred-list args)
> >   (if (= (length pred-list) (length args))
> >       (let ((pred-arg-list (map cons pred-list args)))
> >     ;;(andmap (lambda (p) ((car p) (cdr p)))
> >     ;; replace andmap with every in Guile
> >     (every (lambda (p) ((car p) (cdr p)))
> >            pred-arg-list))
> >       #f))
> >
> >
> > (define (create-overloaded-existing-operator orig-funct funct
> > pred-list) ;; works for associative operators
> >
> >   (display "create-overloaded-existing-operator")
> >   (display " : pred-list = ") (display pred-list) (newline)
> >   (define old-funct orig-funct)
> >   (define new-funct (lambda args ;; args is the list of arguments
> >               ;; (display "new-funct: new-funct = ") (display
> > new-funct) (newline)
> >               ;; (display "new-funct : pred-list = ") (display
> > pred-list) (newline)
> >               ;; (display "new-funct : args = ") (display args) (newline)
> >               (define nb-args (length args))
> >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> >               (cond ((check-arguments pred-list args) ;;(begin
> >                                 ;;(display "new funct :calling:")
> > (display funct) (newline)
> >                                 (apply funct args));;)
> >                 ((> nb-args 2) (new-funct (car args)
> >                               (apply new-funct (cdr args)))) ;;
> > op(a,b,...) = op(a,op(b,...))
> >                 (else
> >                  ;;(begin
> >                    ;;(display "new funct :calling: ") (display
> > old-funct) (newline)
> >                    (apply old-funct args)))));;)
> >
> >   (display "funct: ") (display funct) (newline)
> >   (display "orig-funct: ") (display orig-funct) (newline)
> >   (display "old-funct: ") (display old-funct) (newline)
> >   (display "new-funct: ") (display new-funct) (newline)
> >
> >   ;;(replace-operator! orig-funct new-funct)
> >
> >   new-funct)
> >
> > (define-syntax overload-existing-operator
> >
> >   (syntax-rules ()
> >
> >     ((_ orig-funct funct (pred-arg1 ...))
> >        (define orig-funct (create-overloaded-existing-operator
> > orig-funct funct (list pred-arg1 ...))))))
> >
> >
> >
> > ; first stage overloading
> > ;;(define-overload-existing-operator +) ;; dummy in this implementation
> >
> >
> >
> > ; second stage overloading
> > (overload-existing-operator + vector-append (vector? vector?))
> >
> >
> > (display +) (newline)
> >
> >
> >
> > and a simple main:
> > (require test-define)
> >
> > (define rv (+ #(1 2) #(3 4 5)))
> > (newline) (display "rv=") (display rv) (newline)
> >
> > i load it this way:
> >
> > kawa -Dkawa.import.path=".:/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa:./kawa"
> >
> > (load "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> >
> > #|kawa:1|# (load
> > "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:63:29:
> > unbound location: +
> >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> >     at test-define.run(test-define.scm:63)
> >     at gnu.expr.ModuleBody.run(ModuleBody.java:51)
> >     at gnu.expr.ModuleBody.run(ModuleBody.java:35)
> >     at atInteractiveLevel-2.run(main-test-define.scm:1)
> >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> >     at kawa.Shell.run(Shell.java:289)
> >     at kawa.Shell.runFile(Shell.java:551)
> >     at kawa.standard.load.apply2(load.java:67)
> >     at kawa.standard.load.apply1(load.java:27)
> >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> >     at kawa.Shell.run(Shell.java:289)
> >     at kawa.Shell.run(Shell.java:196)
> >     at kawa.Shell.run(Shell.java:183)
> >     at kawa.repl.processArgs(repl.java:724)
> >     at kawa.repl.main(repl.java:830)
> >
> > On Wed, Nov 1, 2023 at 1:50 PM Damien Mattei <damien.mattei@gmail.com> wrote:
> > >
> > > a simpler example that lead to the same error:
> > >
> > > (module-name test-define)
> > >
> > > (require Scheme+)
> > >
> > > (export +)
> > >
> > > ; first stage overloading
> > > (define-overload-existing-operator +)
> > >
> > >
> > >
> > > ; second stage overloading
> > > (overload-existing-operator + vector-append (vector? vector?))
> > >
> > >
> > > (display +) (newline)
> > >
> > >
> > > a main file:
> > >
> > > (require test-define)
> > >
> > > (define rv (+ #(1 2) #(3 4 5)))
> > > (newline) (display "rv=") (display rv) (newline)
> > >
> > > result:
> > > #|kawa:1|# (load
> > > "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:89:6:
> > > warning - void-valued expression where value is needed
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:15:10:
> > > warning - no use of only-one?
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:18:10:
> > > warning - no use of pair-list?
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:21:10:
> > > warning - no use of empty?
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:54:10:
> > > warning - no use of insertNoDups
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:61:10:
> > > warning - no use of remove-duplicates
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:67:10:
> > > warning - no use of singleton-list?
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:73:10:
> > > warning - no use of create-list
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:88:10:
> > > warning - no use of uniq
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:97:10:
> > > warning - no use of remove-firsts-elements
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:115:10:
> > > warning - no use of remove-last
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:157:10:
> > > warning - no use of debut
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:162:10:
> > > warning - no use of debut-iter
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:173:10:
> > > warning - no use of not-list?
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:181:10:
> > > warning - no use of before-element
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:189:10:
> > > warning - no use of start-with-element
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/list.scm:198:10:
> > > warning - no use of pair-list-elements
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/overload.scm:399:10:
> > > warning - no use of
> > > find-getter-and-setter-for-overloaded-square-brackets
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:332:7:
> > > warning - void-valued expression where value is needed
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/apply-square-brackets.scm:337:7:
> > > warning - void-valued expression where value is needed
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/array.scm:
> > > note - skipped 0 errors, 29 warnings, 0 notes
> > > /Users/mattei/Library/CloudStorage/Dropbox/git/Scheme-PLUS-for-Kawa/test-define.scm:13:29:
> > > unbound location: +
> > >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> > >     at test-define.run(test-define.scm:13)
> > >     at gnu.expr.ModuleBody.run(ModuleBody.java:51)
> > >     at gnu.expr.ModuleBody.run(ModuleBody.java:35)
> > >     at atInteractiveLevel-2.run(main-test-define.scm:1)
> > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > >     at kawa.Shell.run(Shell.java:289)
> > >     at kawa.Shell.runFile(Shell.java:551)
> > >     at kawa.standard.load.apply2(load.java:67)
> > >     at kawa.standard.load.apply1(load.java:27)
> > >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> > >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> > >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > >     at kawa.Shell.run(Shell.java:289)
> > >     at kawa.Shell.run(Shell.java:196)
> > >     at kawa.Shell.run(Shell.java:183)
> > >     at kawa.repl.processArgs(repl.java:724)
> > >     at kawa.repl.main(repl.java:830)
> > >
> > > why + is unbound? in the worse case i should still have the default addition,no?
> > >
> > > seems something is crashing in this code without any element to debug:
> > > (define (create-overloaded-existing-operator orig-funct funct
> > > pred-list) ;; works for associative operators
> > >
> > >   (display "create-overloaded-existing-operator")
> > >   (display " : pred-list = ") (display pred-list) (newline)
> > >   (define old-funct orig-funct)
> > >   (define new-funct (lambda args ;; args is the list of arguments
> > >               ;; (display "new-funct: new-funct = ") (display
> > > new-funct) (newline)
> > >               ;; (display "new-funct : pred-list = ") (display
> > > pred-list) (newline)
> > >               ;; (display "new-funct : args = ") (display args) (newline)
> > >               (define nb-args (length args))
> > >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> > >               (cond ((check-arguments pred-list args) ;;(begin
> > >                                 ;;(display "new funct :calling:")
> > > (display funct) (newline)
> > >                                 (apply funct args));;)
> > >                 ((> nb-args 2) (new-funct (car args)
> > >                               (apply new-funct (cdr args)))) ;;
> > > op(a,b,...) = op(a,op(b,...))
> > >                 (else
> > >                  ;;(begin
> > >                    ;;(display "new funct :calling: ") (display
> > > old-funct) (newline)
> > >                    (apply old-funct args)))));;)
> > >
> > >   (display "funct: ") (display funct) (newline)
> > >   (display "orig-funct: ") (display orig-funct) (newline)
> > >   (display "old-funct: ") (display old-funct) (newline)
> > >   (display "new-funct: ") (display new-funct) (newline)
> > >
> > >   (replace-operator! orig-funct new-funct)
> > >
> > >   new-funct)
> > >
> > > On Wed, Nov 1, 2023 at 1:22 PM Damien Mattei <damien.mattei@gmail.com> wrote:
> > > >
> > > > here is a counter example:
> > > >
> > > > ;; test-define.scm
> > > >
> > > > (module-name test-define)
> > > >
> > > > (export *)
> > > >
> > > > (display *) (newline)
> > > >
> > > > (define * +)
> > > >
> > > > (display *) (newline)
> > > >
> > > > ;; main-test-define.scm
> > > >
> > > > (require test-define)
> > > >
> > > > (define rv (* 2 3))
> > > > (display rv) (newline)
> > > >
> > > > #|kawa:1|# (load
> > > > "/Users/mattei/Dropbox/git/Scheme-PLUS-for-Kawa/main-test-define.scm")
> > > > #<procedure +>
> > > > #<procedure +>
> > > > 5
> > > >
> > > > but i do not quite understand , first display shoud have display #<procedure *>
> > > > but no it displays #<procedure +>
> > > >
> > > >
> > > > On Wed, Nov 1, 2023 at 9:39 AM Damien Mattei <damien.mattei@gmail.com> wrote:
> > > > >
> > > > > hello,
> > > > >
> > > > > i created a module this way:
> > > > >
> > > > > (module-name "matrix")
> > > > >
> > > > > (export multiply-matrix-matrix
> > > > >     multiply-matrix-vector
> > > > >     matrix
> > > > >     matrix-v
> > > > >     create-matrix-by-function
> > > > >     dim-matrix
> > > > >     matrix-ref
> > > > >     matrix-set!
> > > > >     matrix-line-ref
> > > > >     matrix-line-set!
> > > > >     vector->matrix-column
> > > > >     matrix-column->vector
> > > > >     *)
> > > > >
> > > > > (require Scheme+)
> > > > >
> > > > >
> > > > > ;; (matrix #(1 2 3))
> > > > > ;; matrix@4612b856
> > > > >
> > > > >
> > > > > (define-simple-class matrix ()
> > > > >
> > > > >   (v :: vector)
> > > > >
> > > > >   ((*init* (vParam :: vector))
> > > > >    (set! v vParam))
> > > > >
> > > > >   )
> > > > >
> > > > > (display "multiply : * =") (display *) (newline)
> > > > >
> > > > >
> > > > > ;; (define M (create-matrix-by-function (lambda (i j) (+ i j)) 2 3))
> > > > > (define (create-matrix-by-function fct lin col)
> > > > >   (matrix (create-vector-2d fct lin col)))
> > > > >
> > > > >
> > > > > ;; return the line and column values of dimension
> > > > > ;; (dim-matrix M)
> > > > > ;; 2 3
> > > > > (define (dim-matrix M)
> > > > >
> > > > >   (when (not (matrix? M))
> > > > >     (error "argument is not of type matrix"))
> > > > >
> > > > >   {v <+ (matrix-v M)}
> > > > >   {lin <+ (vector-length v)}
> > > > >   {col <+ (vector-length {v[0]})}
> > > > >   (values lin col))
> > > > >
> > > > > ;; #|kawa:85|# (define M1 (create-matrix-by-function (lambda (i j) (+
> > > > > i j)) 2 3))
> > > > > ;; #|kawa:86|# (define M2 (create-matrix-by-function (lambda (i j) (+
> > > > > i j)) 3 2))
> > > > > ;; #|kawa:87|# (multiply-matrix-matrix M1 M2)
> > > > > ;; matrix@3fc1abf
> > > > > ;; #|kawa:88|# (define M1*M2 (multiply-matrix-matrix M1 M2))
> > > > > ;; #|kawa:89|# M1*M2
> > > > > ;; matrix@3bf5911d
> > > > > ;; #|kawa:90|# (matrix-v M1*M2)
> > > > > ;; #(#(5 8) #(8 14))
> > > > > ;; #|kawa:91|# (matrix-v M1)
> > > > > ;; #(#(0 1 2) #(1 2 3))
> > > > > ;; #|kawa:92|# (matrix-v M2)
> > > > > ;; #(#(0 1) #(1 2) #(2 3))
> > > > > (define (multiply-matrix-matrix M1 M2)
> > > > >
> > > > >   {(n1 p1) <+ (dim-matrix M1)}
> > > > >   {(n2 p2) <+ (dim-matrix M2)}
> > > > >
> > > > >   (when {p1 ≠ n2} (error "matrix.* : matrix product impossible,
> > > > > incompatible dimensions"))
> > > > >
> > > > >   {v1 <+ (matrix-v M1)}
> > > > >   {v2 <+ (matrix-v M2)}
> > > > >
> > > > >   (define (res i j)
> > > > >     {sum <+ 0}
> > > > >     (for ({k <+ 0} {k < p1} {k <- k + 1})
> > > > >      {sum <- sum + v1[i][k] * v2[k][j]})
> > > > >     (display "sum=")(display sum) (newline)
> > > > >     sum)
> > > > >
> > > > >   {v <+ (create-vector-2d res n1 p2)}
> > > > >
> > > > >   (matrix v))
> > > > >
> > > > >
> > > > >
> > > > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > > >
> > > > >
> > > > >
> > > > > ....
> > > > >
> > > > > i cut off the whole code, the code used to works with 'include' , now
> > > > > that i try with modules i stuck on this error at the line
> > > > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > > >
> > > > > note that matrix+.scm is converted externally in matrix.scm :
> > > > >
> > > > > (module-name "matrix")
> > > > > (export multiply-matrix-matrix multiply-matrix-vector matrix matrix-v
> > > > >  create-matrix-by-function dim-matrix matrix-ref matrix-set! matrix-line-ref
> > > > >  matrix-line-set! vector->matrix-column matrix-column->vector *)
> > > > > (require Scheme+)
> > > > > (define-simple-class matrix () (v :: vector)
> > > > >  ((*init* (vParam :: vector)) (set! v vParam)))
> > > > > (display "multiply : * =")
> > > > > (display *)
> > > > > (newline)
> > > > > (define (create-matrix-by-function fct lin col)
> > > > >  (matrix (create-vector-2d fct lin col)))
> > > > > (define (dim-matrix M)
> > > > >  (when (not (matrix? M)) (error "argument is not of type matrix"))
> > > > >  (<+ v (matrix-v M)) (<+ lin (vector-length v))
> > > > >  (<+ col (vector-length (bracket-apply v 0))) (values lin col))
> > > > > (define (multiply-matrix-matrix M1 M2) (<+ (n1 p1) (dim-matrix M1))
> > > > >  (<+ (n2 p2) (dim-matrix M2))
> > > > >  (when (|≠| p1 n2)
> > > > >   (error "matrix.* : matrix product impossible, incompatible dimensions"))
> > > > >  (<+ v1 (matrix-v M1)) (<+ v2 (matrix-v M2))
> > > > >  (define (res i j) (<+ sum 0)
> > > > >   (for ((<+ k 0) (< k p1) ($nfx$ k <- k + 1))
> > > > >    ($nfx$ sum <- sum + (bracket-apply (bracket-apply v1 i) k) *
> > > > >     (bracket-apply (bracket-apply v2 k) j)))
> > > > >   (display "sum=") (display sum) (newline) sum)
> > > > >  (<+ v (create-vector-2d res n1 p2)) (matrix v))
> > > > > (overload-existing-operator * multiply-matrix-matrix (matrix? matrix?))
> > > > > (define (matrix-v M) (slot-ref M (quote v)))
> > > > > (define (vector->matrix-column v)
> > > > >  (matrix (vector-map (lambda (x) (make-vector 1 x)) v)))
> > > > > (define (matrix-column->vector Mc) (<+ v (matrix-v Mc))
> > > > >  (vector-map (lambda (v2) (bracket-apply v2 0)) v))
> > > > > (define (multiply-matrix-vector M v) (<+ Mc (vector->matrix-column v))
> > > > >  (matrix-column->vector (multiply-matrix-matrix M Mc)))
> > > > > (define (matrix-ref M lin col) (<+ v (matrix-v M))
> > > > >  (bracket-apply (bracket-apply v lin) col))
> > > > > (define (matrix-set! M lin col x) (<+ v (matrix-v M))
> > > > >  (<- (bracket-apply (bracket-apply v lin) col) x))
> > > > > (define (matrix-line-ref M lin) (<+ v (matrix-v M)) (bracket-apply v lin))
> > > > > (define (matrix-line-set! M lin vect-line) (<+ v (matrix-v M))
> > > > >  (<- (bracket-apply v lin) vect-line))
> > > > > (overload-square-brackets matrix-ref matrix-set! (matrix? number? number?))
> > > > > (overload-square-brackets matrix-line-ref matrix-line-set! (matrix? number?))
> > > > >
> > > > >
> > > > > overload-existing-operator redefine the * operator , so basically it
> > > > > needs the original one to not loose the * between numbers
> > > > > the code is:
> > > > >
> > > > > (define-syntax overload-existing-operator
> > > > >
> > > > >   (syntax-rules ()
> > > > >
> > > > >     ((_ orig-funct funct (pred-arg1 ...))
> > > > >        (define orig-funct (create-overloaded-existing-operator
> > > > > orig-funct funct (list pred-arg1 ...))))))
> > > > >
> > > > > (define (create-overloaded-existing-operator orig-funct funct
> > > > > pred-list) ;; works for associative operators
> > > > >
> > > > >   (display "create-overloaded-existing-operator")
> > > > >   (display " : pred-list = ") (display pred-list) (newline)
> > > > >   (define old-funct orig-funct)
> > > > >   (define new-funct (lambda args ;; args is the list of arguments
> > > > >               ;; (display "new-funct: new-funct = ") (display
> > > > > new-funct) (newline)
> > > > >               ;; (display "new-funct : pred-list = ") (display
> > > > > pred-list) (newline)
> > > > >               ;; (display "new-funct : args = ") (display args) (newline)
> > > > >               (define nb-args (length args))
> > > > >               ;;(display "new-funct : nb-args = ") (display nb-args) (newline)
> > > > >               (cond ((check-arguments pred-list args) ;;(begin
> > > > >                                 ;;(display "new funct :calling:")
> > > > > (display funct) (newline)
> > > > >                                 (apply funct args));;)
> > > > >                 ((> nb-args 2) (new-funct (car args)
> > > > >                               (apply new-funct (cdr args)))) ;;
> > > > > op(a,b,...) = op(a,op(b,...))
> > > > >                 (else
> > > > >                  ;;(begin
> > > > >                    ;;(display "new funct :calling: ") (display
> > > > > old-funct) (newline)
> > > > >                    (apply old-funct args)))));;)
> > > > >
> > > > >   (display "funct: ") (display funct) (newline)
> > > > >   (display "orig-funct: ") (display orig-funct) (newline)
> > > > >   (display "old-funct: ") (display old-funct) (newline)
> > > > >   (display "new-funct: ") (display new-funct) (newline)
> > > > >
> > > > >   (replace-operator! orig-funct new-funct)
> > > > >
> > > > >   new-funct)
> > > > >
> > > > > this weird code  return the new-funct which is the overloaded * , at
> > > > > the line  (overload-existing-operator * multiply-matrix-matrix
> > > > > (matrix? matrix?))
> > > > >
> > > > > i got this error:
> > > > > Exception in thread "main" java.lang.ExceptionInInitializerError
> > > > >     at atInteractiveLevel-8.run(exo_retropropagationNhidden_layers_matrix_v2_by_vectors4kawa+.scm:43)
> > > > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:290)
> > > > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > > > >     at kawa.Shell.run(Shell.java:289)
> > > > >     at kawa.Shell.runFile(Shell.java:551)
> > > > >     at kawa.standard.load.apply2(load.java:67)
> > > > >     at kawa.standard.load.apply1(load.java:27)
> > > > >     at gnu.mapping.Procedure1or2.applyToObject(Procedure1or2.java:64)
> > > > >     at gnu.mapping.Procedure.applyToConsumerDefault(Procedure.java:75)
> > > > >     at gnu.mapping.CallContext.runUntilDone(CallContext.java:586)
> > > > >     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:343)
> > > > >     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
> > > > >     at kawa.Shell.run(Shell.java:289)
> > > > >     at kawa.Shell.run(Shell.java:196)
> > > > >     at kawa.Shell.run(Shell.java:183)
> > > > >     at kawa.repl.processArgs(repl.java:724)
> > > > >     at kawa.repl.main(repl.java:830)
> > > > > Caused by: /Users/mattei/Library/CloudStorage/Dropbox/git/AI_Deep_Learning/kawa/matrix.scm:9:10:
> > > > > unbound location: *
> > > > >     at gnu.mapping.PlainLocation.get(PlainLocation.java:22)
> > > > >     at matrix.<clinit>(matrix.scm:9)
> > > > >     ... 17 more
> > > > >
> > > > > ok * seems not bound to any procedure
> > > > >
> > > > > when i display it for debug i got:
> > > > >
> > > > > multiply : * =%
> > > > >
> > > > > note that % is in reversed colors (white on black background) i cannot
> > > > > copy/paste it....
> > > > >
> > > > > all the code is called from a main file:
> > > > >
> > > > > (require matrix)
> > > > > (require array)
> > > > >
> > > > > (require Scheme+)
> > > > >
> > > > > it seems in a module * is not bound to anything, i had a same problem
> > > > > in Racket where i need to import racket/base, is there such a need in
> > > > > Kawa? ,i can find anything related in the doc.
> > > > >
> > > > > regards,
> > > > > damien

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 16:47         ` Damien Mattei
@ 2023-11-01 16:57           ` Per Bothner
  2023-11-02 21:51             ` Damien Mattei
  0 siblings, 1 reply; 12+ messages in thread
From: Per Bothner @ 2023-11-01 16:57 UTC (permalink / raw)
  To: Damien Mattei, kawa mailing list



On 11/1/23 09:47, Damien Mattei wrote:
> but i have no more access to previous definition that is not keep in
> the overloaded procedure,see #!null values:

If you're using the module system, you can use import-with-rename
to access the "old" definition:

(import (rename other-module (foo other-foo)))
(export foo)

(define (foo ...)
   (cond (xxx (other-foo ...))
         (else ...)))

See https://www.gnu.org/software/kawa/Importing.html
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-01 16:57           ` Per Bothner
@ 2023-11-02 21:51             ` Damien Mattei
  2023-11-02 21:58               ` Per Bothner
  0 siblings, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-02 21:51 UTC (permalink / raw)
  To: Per Bothner; +Cc: kawa mailing list

seems a good idea but i can not fix it, i try:
(import (rename (gnu kawa) (proc orig-proc)))

and (import (rename (overload) (proc orig-proc)))
as my code is in module 'overload' but the latter result in a crash:
main-test-define.scm:4:1: duplicate version reference - was #<syntax
(overload) in #3164>
main-test-define.scm:4:1: unknown library (#<syntax#2346 rename in #3164>)
#|kawa:3|# +
Exception in thread "main" java.lang.VerifyError: Bad local variable type
Exception Details:
  Location:
    atInteractiveLevel-5.run(Lgnu/mapping/CallContext;)V @6: aload_3
  Reason:
    Type top (current frame, locals[3]) is not assignable to reference type
  Current Frame:
    bci: @6
    flags: { }
    locals: { 'atInteractiveLevel-5', 'gnu/mapping/CallContext',
'gnu/lists/Consumer' }
    stack: { 'gnu/lists/Consumer' }
  Bytecode:
    0000000: 2bb4 0008 4d2c 2db9 000e 0200 b1

    at java.base/java.lang.Class.getDeclaredFields0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3473)
    at java.base/java.lang.Class.getDeclaredField(Class.java:2780)
    at gnu.expr.ModuleContext.findInstance(ModuleContext.java:71)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:286)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.run(Shell.java:196)
    at kawa.Shell.run(Shell.java:183)
    at kawa.repl.processArgs(repl.java:724)
    at kawa.repl.main(repl.java:830)

my goal is just to back-up proc under the name orig-proc as i need to
reuse it latter.

On Wed, Nov 1, 2023 at 5:58 PM Per Bothner <per@bothner.com> wrote:
>
>
>
> On 11/1/23 09:47, Damien Mattei wrote:
> > but i have no more access to previous definition that is not keep in
> > the overloaded procedure,see #!null values:
>
> If you're using the module system, you can use import-with-rename
> to access the "old" definition:
>
> (import (rename other-module (foo other-foo)))
> (export foo)
>
> (define (foo ...)
>    (cond (xxx (other-foo ...))
>          (else ...)))
>
> See https://www.gnu.org/software/kawa/Importing.html
> --
>         --Per Bothner
> per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-02 21:51             ` Damien Mattei
@ 2023-11-02 21:58               ` Per Bothner
  2023-11-03 10:42                 ` Damien Mattei
  0 siblings, 1 reply; 12+ messages in thread
From: Per Bothner @ 2023-11-02 21:58 UTC (permalink / raw)
  To: Damien Mattei; +Cc: kawa mailing list



On 11/2/23 14:51, Damien Mattei wrote:
> seems a good idea but i can not fix it, i try:
> (import (rename (gnu kawa) (proc orig-proc)))
...
> Exception in thread "main" java.lang.VerifyError: Bad local variable type

That is probably a bug in the Kawa code generator.
I'm unlikely to have time to debug that.  Certainly not without a
simplified simple-to-reproduce test-case. Even with a good test-case, this
is part of Kawa I haven't looked at in a long time, and I'm busy with other projects.
-- 
	--Per Bothner
per@bothner.com   http://per.bothner.com/

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-02 21:58               ` Per Bothner
@ 2023-11-03 10:42                 ` Damien Mattei
  2023-11-03 10:48                   ` Damien Mattei
  0 siblings, 1 reply; 12+ messages in thread
From: Damien Mattei @ 2023-11-03 10:42 UTC (permalink / raw)
  To: Per Bothner; +Cc: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 2225 bytes --]

in case if you have a few time to have a look to the problem i made a
simple test-case with my overloading operator problem, it is in the
two attached files and can run like that:

kawa -Dkawa.import.path="."
#|kawa:1|# (load "main-test-define.scm")
main-test-define.scm:4:1: duplicate version reference - was #<syntax
(test-define) in #91>
main-test-define.scm:4:1: unknown library (#<syntax#8 rename in #91>)
#|kawa:2|# +
Exception in thread "main" java.lang.VerifyError: Bad local variable type
Exception Details:
  Location:
    atInteractiveLevel-4.run(Lgnu/mapping/CallContext;)V @6: aload_3
  Reason:
    Type top (current frame, locals[3]) is not assignable to reference type
  Current Frame:
    bci: @6
    flags: { }
    locals: { 'atInteractiveLevel-4', 'gnu/mapping/CallContext',
'gnu/lists/Consumer' }
    stack: { 'gnu/lists/Consumer' }
  Bytecode:
    0000000: 2bb4 0008 4d2c 2db9 000e 0200 b1

    at java.base/java.lang.Class.getDeclaredFields0(Native Method)
    at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3473)
    at java.base/java.lang.Class.getDeclaredField(Class.java:2780)
    at gnu.expr.ModuleContext.findInstance(ModuleContext.java:71)
    at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:286)
    at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
    at kawa.Shell.run(Shell.java:289)
    at kawa.Shell.run(Shell.java:196)
    at kawa.Shell.run(Shell.java:183)
    at kawa.repl.processArgs(repl.java:724)
    at kawa.repl.main(repl.java:830)

Damien

On Thu, Nov 2, 2023 at 10:59 PM Per Bothner <per@bothner.com> wrote:
>
>
>
> On 11/2/23 14:51, Damien Mattei wrote:
> > seems a good idea but i can not fix it, i try:
> > (import (rename (gnu kawa) (proc orig-proc)))
> ...
> > Exception in thread "main" java.lang.VerifyError: Bad local variable type
>
> That is probably a bug in the Kawa code generator.
> I'm unlikely to have time to debug that.  Certainly not without a
> simplified simple-to-reproduce test-case. Even with a good test-case, this
> is part of Kawa I haven't looked at in a long time, and I'm busy with other projects.
> --
>         --Per Bothner
> per@bothner.com   http://per.bothner.com/

[-- Attachment #2: main-test-define.scm --]
[-- Type: application/octet-stream, Size: 230 bytes --]

;;(require overload)
(require test-define)

(define-overload-existing-operator +)

(overload-existing-operator + vector-append (vector? vector?))


(define rv (+ #(1 2) #(3 4 5)))
(newline) (display "rv=") (display rv) (newline)


[-- Attachment #3: test-define.scm --]
[-- Type: application/octet-stream, Size: 3225 bytes --]

(module-name test-define)

(require 'srfi-1)

(require 'srfi-69)

;;(require infix-operators)

(export define-overload-existing-operator
	overload-existing-operator)
	;;+)


(define (check-arguments pred-list args)
  (if (= (length pred-list) (length args))
      (let ((pred-arg-list (map cons pred-list args)))
	;;(andmap (lambda (p) ((car p) (cdr p)))
	;; replace andmap with every in Guile
	(every (lambda (p) ((car p) (cdr p)))
	       pred-arg-list))
      #f))



(define-syntax define-overload-existing-operator

  (syntax-rules ()

    ((_ proc)

     (begin

       (import (rename (test-define) (proc orig-proc)))
       ;;(import (rename (gnu kawa) (proc orig-proc)))
       ;;(require (rename-in racket/base (proc
       	;;			        orig-proc)))

       (display "proc =") (display proc) (newline)
       (display "orig-proc =") (display orig-proc) (newline)
       
       (define qproc (quote proc)) 
       
       (define (proc . args-lst)

	 ;;(display "proc=") (display proc) (newline)
	 ;;(define ht (hash-table->alist $ovrld-ht$))
	 ;;(display ht) (newline)


	 (define proc-lst (hash-table-ref $ovrld-ht$ qproc)) ;;  example: ((number? string?) (lambda (n s) (display n) (display s) (newline)))
	 ;;(display "proc-lst=") (display proc-lst)
	 ;;(newline)
	 
	 (define (check-args-lst pred-list) ; check arguments list match predicates
	   ;;(display "pred-list=") (display pred-list) (newline)
	   ;;(display "args-lst=") (display args-lst) (newline)
	   (check-arguments pred-list args-lst))



	 (define (test-proc pred-proc-list) ; test the procedure if it matches with arguments
	   ;;(display "pred-proc-list=") (display pred-proc-list) (newline)
	   (if (check-args-lst (car pred-proc-list)) ;; check args
	       (car (cdr  pred-proc-list)) ;; return procedure
	       #f))

	 
	 (define proc-search-result (ormap test-proc proc-lst)) ; search for a procedure matching arguments

	 
	 ;;(display "proc-search-result=") (display proc-search-result) (newline)
	 
	 (condx (proc-search-result (apply proc-search-result args-lst))
		(exec
		 (define nb-args (length args-lst)))
		((> nb-args 2)   ;;(display ">2 args") (newline)
		 (proc (car args-lst) (apply proc (cdr args-lst))))
		(else
		 ;;(display "else") (newline)
		 (apply orig-proc args-lst))))
       
       ;;(hash-table-set! $ovrld-ht$ qproc (list (list (list number? number?) orig-proc)))
       (hash-table-set! $ovrld-ht$ qproc '())

       ;;(replace-operator! orig-proc proc)
       
       )))) 




(define-syntax overload-existing-operator
  
  (syntax-rules ()

    ((_ orig-funct funct (pred-arg1 ...))

     (overload orig-funct funct (pred-arg1 ...)))))


(define-syntax overload

  (syntax-rules ()

    ;; arguments are function to be overloaded, procedure that do the overloading, list of predicate to check the arguments

    ((_ orig-funct funct (pred-arg1 ...))

     (let* ((qorig-funct (quote orig-funct))
	    (ovrld-lst (hash-table-ref $ovrld-ht$ qorig-funct)))
       ;;(display qorig-funct) (newline)
       (hash-table-set! $ovrld-ht$ qorig-funct
			(cons (list (list pred-arg1 ...) ;; example: ((number? string?) (lambda (n s) (display n) (display s) (newline)))
				    funct)
			      ovrld-lst))))))
 	 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: unbound location: *
  2023-11-03 10:42                 ` Damien Mattei
@ 2023-11-03 10:48                   ` Damien Mattei
  0 siblings, 0 replies; 12+ messages in thread
From: Damien Mattei @ 2023-11-03 10:48 UTC (permalink / raw)
  To: Per Bothner; +Cc: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 2537 bytes --]

i forgot a few definitions and include file in the previous post.
It is okay now with the new attachments.
Damien

On Fri, Nov 3, 2023 at 11:42 AM Damien Mattei <damien.mattei@gmail.com> wrote:
>
> in case if you have a few time to have a look to the problem i made a
> simple test-case with my overloading operator problem, it is in the
> two attached files and can run like that:
>
> kawa -Dkawa.import.path="."
> #|kawa:1|# (load "main-test-define.scm")
> main-test-define.scm:4:1: duplicate version reference - was #<syntax
> (test-define) in #91>
> main-test-define.scm:4:1: unknown library (#<syntax#8 rename in #91>)
> #|kawa:2|# +
> Exception in thread "main" java.lang.VerifyError: Bad local variable type
> Exception Details:
>   Location:
>     atInteractiveLevel-4.run(Lgnu/mapping/CallContext;)V @6: aload_3
>   Reason:
>     Type top (current frame, locals[3]) is not assignable to reference type
>   Current Frame:
>     bci: @6
>     flags: { }
>     locals: { 'atInteractiveLevel-4', 'gnu/mapping/CallContext',
> 'gnu/lists/Consumer' }
>     stack: { 'gnu/lists/Consumer' }
>   Bytecode:
>     0000000: 2bb4 0008 4d2c 2db9 000e 0200 b1
>
>     at java.base/java.lang.Class.getDeclaredFields0(Native Method)
>     at java.base/java.lang.Class.privateGetDeclaredFields(Class.java:3473)
>     at java.base/java.lang.Class.getDeclaredField(Class.java:2780)
>     at gnu.expr.ModuleContext.findInstance(ModuleContext.java:71)
>     at gnu.expr.ModuleExp.evalModule2(ModuleExp.java:286)
>     at gnu.expr.ModuleExp.evalModule(ModuleExp.java:211)
>     at kawa.Shell.run(Shell.java:289)
>     at kawa.Shell.run(Shell.java:196)
>     at kawa.Shell.run(Shell.java:183)
>     at kawa.repl.processArgs(repl.java:724)
>     at kawa.repl.main(repl.java:830)
>
> Damien
>
> On Thu, Nov 2, 2023 at 10:59 PM Per Bothner <per@bothner.com> wrote:
> >
> >
> >
> > On 11/2/23 14:51, Damien Mattei wrote:
> > > seems a good idea but i can not fix it, i try:
> > > (import (rename (gnu kawa) (proc orig-proc)))
> > ...
> > > Exception in thread "main" java.lang.VerifyError: Bad local variable type
> >
> > That is probably a bug in the Kawa code generator.
> > I'm unlikely to have time to debug that.  Certainly not without a
> > simplified simple-to-reproduce test-case. Even with a good test-case, this
> > is part of Kawa I haven't looked at in a long time, and I'm busy with other projects.
> > --
> >         --Per Bothner
> > per@bothner.com   http://per.bothner.com/

[-- Attachment #2: main-test-define.scm --]
[-- Type: application/octet-stream, Size: 230 bytes --]

;;(require overload)
(require test-define)

(define-overload-existing-operator +)

(overload-existing-operator + vector-append (vector? vector?))


(define rv (+ #(1 2) #(3 4 5)))
(newline) (display "rv=") (display rv) (newline)


[-- Attachment #3: test-define.scm --]
[-- Type: application/octet-stream, Size: 3319 bytes --]

(module-name test-define)

(require 'srfi-1)

(require 'srfi-69)

;;(require infix-operators)

(export define-overload-existing-operator
	overload-existing-operator)
	;;+)

(include "condx.scm")


(define $ovrld-ht$ (make-hash-table)) ;; for procedure and operators


(define (check-arguments pred-list args)
  (if (= (length pred-list) (length args))
      (let ((pred-arg-list (map cons pred-list args)))
	;;(andmap (lambda (p) ((car p) (cdr p)))
	;; replace andmap with every in Guile
	(every (lambda (p) ((car p) (cdr p)))
	       pred-arg-list))
      #f))



(define-syntax define-overload-existing-operator

  (syntax-rules ()

    ((_ proc)

     (begin

       (import (rename (test-define) (proc orig-proc)))
       ;;(import (rename (gnu kawa) (proc orig-proc)))
       ;;(require (rename-in racket/base (proc
       	;;			        orig-proc)))

       (display "proc =") (display proc) (newline)
       (display "orig-proc =") (display orig-proc) (newline)
       
       (define qproc (quote proc)) 
       
       (define (proc . args-lst)

	 ;;(display "proc=") (display proc) (newline)
	 ;;(define ht (hash-table->alist $ovrld-ht$))
	 ;;(display ht) (newline)


	 (define proc-lst (hash-table-ref $ovrld-ht$ qproc)) ;;  example: ((number? string?) (lambda (n s) (display n) (display s) (newline)))
	 ;;(display "proc-lst=") (display proc-lst)
	 ;;(newline)
	 
	 (define (check-args-lst pred-list) ; check arguments list match predicates
	   ;;(display "pred-list=") (display pred-list) (newline)
	   ;;(display "args-lst=") (display args-lst) (newline)
	   (check-arguments pred-list args-lst))



	 (define (test-proc pred-proc-list) ; test the procedure if it matches with arguments
	   ;;(display "pred-proc-list=") (display pred-proc-list) (newline)
	   (if (check-args-lst (car pred-proc-list)) ;; check args
	       (car (cdr  pred-proc-list)) ;; return procedure
	       #f))

	 
	 (define proc-search-result (ormap test-proc proc-lst)) ; search for a procedure matching arguments

	 
	 ;;(display "proc-search-result=") (display proc-search-result) (newline)
	 
	 (condx (proc-search-result (apply proc-search-result args-lst))
		(exec
		 (define nb-args (length args-lst)))
		((> nb-args 2)   ;;(display ">2 args") (newline)
		 (proc (car args-lst) (apply proc (cdr args-lst))))
		(else
		 ;;(display "else") (newline)
		 (apply orig-proc args-lst))))
       
       ;;(hash-table-set! $ovrld-ht$ qproc (list (list (list number? number?) orig-proc)))
       (hash-table-set! $ovrld-ht$ qproc '())

       ;;(replace-operator! orig-proc proc)
       
       )))) 




(define-syntax overload-existing-operator
  
  (syntax-rules ()

    ((_ orig-funct funct (pred-arg1 ...))

     (overload orig-funct funct (pred-arg1 ...)))))


(define-syntax overload

  (syntax-rules ()

    ;; arguments are function to be overloaded, procedure that do the overloading, list of predicate to check the arguments

    ((_ orig-funct funct (pred-arg1 ...))

     (let* ((qorig-funct (quote orig-funct))
	    (ovrld-lst (hash-table-ref $ovrld-ht$ qorig-funct)))
       ;;(display qorig-funct) (newline)
       (hash-table-set! $ovrld-ht$ qorig-funct
			(cons (list (list pred-arg1 ...) ;; example: ((number? string?) (lambda (n s) (display n) (display s) (newline)))
				    funct)
			      ovrld-lst))))))
 	 


[-- Attachment #4: condx.scm --]
[-- Type: application/octet-stream, Size: 3038 bytes --]

;; condx: cond(itionals) with optional execution of statements before
					;

; This file is part of Scheme+

;; Copyright 2021 Damien MATTEI

;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <https://www.gnu.org/licenses/>.


; example:
;(define x 1)
;(condx ((= x 7) 'never)
;        (exec
;          (define y 3)
;          (set! x 7))
;        ((= y 1) 'definitely_not)
;        (exec
;          (set! y 10)
;          (define z 2))
;        ((= x 7) (+ x y z))
;        (else 'you_should_not_be_here))
;
; 19

(define-syntax condx
  (syntax-rules (exec else)
    ((_) '()) ;; allow no else clause
    ((_ (else e ...))
     (let () e ...))
    ((_ (exec s ...) d1 ...)
     (let () s ... (condx d1 ...)))
    ((_ (t e ...) tail ...)
     (if t
         (let () e ...)
         (condx tail ...)))))

;; (define-syntax condx
;;  (syntax-rules (exec else)
;;    ((_)
 ;;     (error 'condx "No else clause"))
;;    ((_ (else e ...))
;;     (let () e ...))
;;    ((_ (exec s ...) d1 ...)
;;     (let () s ... (condx d1 ...)))
;;    ((_ (t e ...) tail ...)
;;     (if t
;;         (let () e ...)
;;         (condx tail ...)))))

;; warning this ones behaves differently (can not remember the problem)
(define-syntax condx-begin
  (syntax-rules (exec else)
    ((_) '()) ;; allow no else clause
    ((_ (else e ...))
     (begin e ...))
    ((_ (exec s ...) d1 ...)
     (begin s ... (condx-begin d1 ...)))
    ((_ (t e ...) tail ...)
     (if t
         (begin e ...)
         (condx-begin tail ...)))))


;; (define-syntax condx-begin
;;   (syntax-rules (exec else)
;;     ((_)
;;      (error 'condx-begin "No else clause"))
;;     ((_ (else e ...))
;;      (begin e ...))
;;     ((_ (exec s ...) d1 ...)
;;      (begin s ... (condx-begin d1 ...)))
;;     ((_ (t e ...) tail ...)
;;      (if t
;;          (begin e ...)
;;          (condx-begin tail ...)))))


;; (define x 1)
;; (condx ((= x 7) 'never)
;;         (exec
;;           (define y 3)
;;           (set! x 7))
;;         ((= y 1) 'definitely_not)
;;         (exec
;;           (set! y 10)
;;           (define z 2))
;;         ((= x 7) (+ x y z))
;;         (else 'you_should_not_be_here))

;; (define y 0)
;; (define z 0)
;; (set! x 1)
;; (condx-begin ((= x 7) 'never)
;;         (exec
;;           (set! y 3)
;;           (set! x 7))
;;         ((= y 1) 'definitely_not)
;;         (exec
;;           (set! y 10)
;;           (set! z 2))
;;         ((= x 7) (+ x y z))
;;         (else 'you_should_not_be_here))


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-11-03 10:48 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-01  8:39 unbound location: * Damien Mattei
2023-11-01 12:22 ` Damien Mattei
2023-11-01 12:50   ` Damien Mattei
2023-11-01 14:02     ` Damien Mattei
2023-11-01 16:11       ` Damien Mattei
2023-11-01 16:47         ` Damien Mattei
2023-11-01 16:57           ` Per Bothner
2023-11-02 21:51             ` Damien Mattei
2023-11-02 21:58               ` Per Bothner
2023-11-03 10:42                 ` Damien Mattei
2023-11-03 10:48                   ` Damien Mattei
2023-11-01 14:55   ` Per Bothner

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).