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 12:49:19 +0100

(Sorry, when writing "macro systems", I meant "object orientation systems".)

On Tue, Nov 21, 2023 at 11:31 AM Mikael Djurfeldt <mikael@djurfeldt.com>
wrote:

> 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]