that is interesting answer about guile's features i did not know ,
it is related with code i'm writing that instead of fetching the value
modify it using the fetch syntax in Scheme+ but my question was just
about how to have a class method in a class that can set! the value of
a slot. This does nt seem to be available in Guile because "A method
is not formally associated with any single class (as it is in many
other object oriented languages)" [0].

i will explain the problem more in my answer to Mikael and you, i just
wanted to be able to create a class method that can access the slot
directly , more than in the example [2] :

(define-class <my-complex> (<number>)
   (r #:init-value 0 #:accessor real-part #:init-keyword #:r)
   (i #:init-value 0 #:accessor imag-part #:init-keyword #:i))

(set! (real-part c) new-value)

in othe Scheme i can do simply:

(set! r new-value)

for example in Kawa:

(define-simple-class ReseauRetroPropagation ()

  (nbiter init-value: 3)
  (activation_function_hidden_layer)
  (activation_function_output_layer)
  (activation_function_hidden_layer_derivative)
  (activation_function_output_layer_derivative)

  (ηₛ 1.0)

  (z)
  (z̃)

  (M)

  (ᐁ)

  (error 0)

  ((*init* nc nbiter0 ηₛ0 activation_function_hidden_layer0
                     activation_function_output_layer0
              activation_function_hidden_layer_derivative0
              activation_function_output_layer_derivative0)

   (display "*init* : nc=") (display nc) (newline)
   {nbiter <- nbiter0}
   {ηₛ <- ηₛ0}

...

or in Racket :

(define ReseauRetroPropagation

  (class object%

     (super-new)

     ; this is the initialisation parameters
     (init-field (nc #(2 3 1)) ;; on crée le tableau des couches du réseau
                    (nbiter 10000)
                    (ηₛ 1.0)
             (activation_function_hidden_layer tanh)
             (activation_function_output_layer tanh)
             (activation_function_hidden_layer_derivative der_tanh)
             (activation_function_output_layer_derivative der_tanh))

     {lnc <+ (vector-length nc)}

     ; les entrées concrètes seront fournies avec la méthode accepte
     ;; (field (z (vector-ec (: i (vector-length nc)) (make-vector {nc[i]} 0))))
     ;;(field (z (vector-ec (:vector lg nc)
    ;;              (make-vector lg 0))))
     (field (z (vector-map (lambda (lg) (make-vector lg 0))
                   nc)))

     ;; (field (z (for/vector ([lg nc])
     ;;                (make-vector lg 0))))

     (display "z=") (display z) (newline)


     ; z̃[0] is not used as z[0] is x, the initial data
     ;;(field (z̃ (vector-ec (:vector lg nc)
        ;;          (make-vector lg 0))))
     (field (z̃ (vector-map (lambda (lg) (make-vector lg 0))
                   nc)))


     (display "z̃=") (display z̃) (newline)


     {M <+ (vector-ec (: n {lnc - 1}) ; vectors by eager comprehension (SRFI 42)
              create-matrix-vect-by-function(uniform-dummy nc[n + 1]
{nc[n] + 1}))} ;; Matrix-vect

     ;(field (M (vector-ec (: n {lnc - 1}) ; vectors by eager
comprehension (SRFI 42)
     ;          (create-matrix-vect-by-function uniform-dummy {nc[n +
1]} {nc[n] + 1})))) ;; Matrix-vect


     (display "M=") (display M) (newline)

     (field (ᐁ (for/vector ([lg nc])
                   (make-vector lg 0))))


     (display "ᐁ=") (display ᐁ) (newline)

     (display "nbiter=") (display nbiter) (newline)

     (field (error 0))


     ; forward propagation

         ; z_* sans le coef. 1 constant pour le bias
     (define (accepte_et_propage x) ; on entre des entrées et on les propage

        (when {vector-length(x) ≠ vector-length(z[0])}
          (display "Mauvais nombre d'entrées !") (newline)
          (exit #f))

        {z[0] <- x} ; on ne touche pas au biais

in those 2 example z is a slot (or field in Racket) of the class
ReseauRetroPropagation that can directly be accessed from a class
method without using the accessors (getter and setter)

Regards,
Damien




[0] 8.6 Methods and Generic Functions
https://www.gnu.org/software/guile/manual/html_node/Methods-and-Generic-Functions.html

[2] 8.5  Illustrating Slot Description:
https://www.gnu.org/software/guile/manual/html_node/Slot-Description-Example.html

On Mon, Nov 20, 2023 at 11:43 PM Nate Rosenbloom
<nate.rosenbl...@gmail.com> wrote:
>>
>> is there a way to access a slot of a class like other variable with set! ,
>> Racket,Kawa allow that, but it does not seem to be the case in Guile.
>
>
> Hello Damien:
> Does 'generalized set'[0] do what you want?
> You can create accessor procedures that have an attached setter -
>
> Or were you speaking specifically about class slots? In which case it looks 
> like the accessor can be used in in set!: [2]
> Thanks,
> Nate
> [0] 7.5.14 sfri 17 Generalized set!: 
> https://www.gnu.org/software/guile/manual/html_node/SRFI_002d17.html
> [1] 6.7.8 Procedures with Setters: 
> https://www.gnu.org/software/guile/manual/html_node/Procedures-with-Setters.html
> [2] 8.5  Illustrating Slot Description: 
> https://www.gnu.org/software/guile/manual/html_node/Slot-Description-Example.html
>

Reply via email to