guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: access slot of a class


From: Mikael Djurfeldt
Subject: Re: access slot of a class
Date: Tue, 21 Nov 2023 11:31:03 +0100

OK, now I see what you are asking. You want the slots to be available as
local variables in the lexical scope of the method. The answer is that that
is not possible "out of the box". I guess it *could* be made available
through some contortionist coding using a combination of GOOPS and the
syntax-case macro system, but it goes against the design of GOOPS and CLOS.
There are macro systems where the class definition provides a lexical scope
and there are macro systems based on generic functions. It's two different
takes on object orientation.

(Note though regarding the citation about a method not being formally
associated with a single class: In the case of accessor methods, which take
a single argument, they are in a sense associated with a single class.)

On Tue, Nov 21, 2023 at 9:19 AM Damien Mattei <damien.mattei@gmail.com>
wrote:

> 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.rosenbloom@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

[Prev in Thread] Current Thread [Next in Thread]