(Sorry, when writing "macro systems", I meant "object orientation systems".)
On Tue, Nov 21, 2023 at 11:31 AM Mikael Djurfeldt <mik...@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.mat...@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.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 >> > >> >