From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Mikael Djurfeldt Newsgroups: gmane.lisp.guile.user Subject: Re: access slot of a class Date: Tue, 21 Nov 2023 12:49:19 +0100 Message-ID: References: Reply-To: mikael@djurfeldt.com Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12680"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Nate Rosenbloom , guile-user To: Damien Mattei Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Tue Nov 21 12:50:33 2023 Return-path: Envelope-to: guile-user@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1r5PGy-000339-6u for guile-user@m.gmane-mx.org; Tue, 21 Nov 2023 12:50:32 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r5PGA-0001oo-04; Tue, 21 Nov 2023 06:49:42 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1r5PG4-0001lX-BJ for guile-user@gnu.org; Tue, 21 Nov 2023 06:49:36 -0500 Original-Received: from mail-vs1-f49.google.com ([209.85.217.49]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r5PG0-0003VJ-SM for guile-user@gnu.org; Tue, 21 Nov 2023 06:49:35 -0500 Original-Received: by mail-vs1-f49.google.com with SMTP id ada2fe7eead31-45da75867d3so1745605137.2 for ; Tue, 21 Nov 2023 03:49:31 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700567371; x=1701172171; h=cc:to:subject:message-id:date:from:reply-to:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=YQj+xhtj6rRGwVLLsDcbQTErfOwcVhUQXUxrm8PLRYA=; b=MiLrzSJb21DQQLW2gzaxc9LDkli2MsTyW3C4eiKLujlDoS4Px0PZbAESJNWCn9UKTv Sup6ACKIYz3I9RQralFPWFC6kduD9P631jpLPr4qu3AoDXgA74KeK/XAbgGi+FD3rJcd 8de0GK+no5XcLuhY+BetyV/PzWVKpifdgw5hk4dxtTLiNPRwrwXnVudGddKDh4cA4bLz AjXTeF4N3NO3GN2E4aWA3JfR7YPZ4W4ERrTxWeIPFb8pd1qamR9VO1G4DaLRlmR3z4le AWyLrv6qFP1CmLSzcWW4iLfc2ZcuLZLoBXU6eOGlHoLKeBvejkc8SHXVZ7p6Gc8IdhM5 M4DA== X-Gm-Message-State: AOJu0Yyw5TFH9nI+lQnMTWybsN7V8vST00oiAik5wr4f2iLZEdhPB8Rs 52yhfdIhGZD+0oSu/4udY4rPBDOmlRLt5hTn6ws= X-Google-Smtp-Source: AGHT+IGCl+QjOJs+fsmXCKcOaFPD6gghvNPwH0bjinoBzW4/9fmRnl940WgbSbqN429NLVkhijBwrM2u0khZ/HpL5ms= X-Received: by 2002:a67:f750:0:b0:462:8087:6ad7 with SMTP id w16-20020a67f750000000b0046280876ad7mr8371391vso.17.1700567370820; Tue, 21 Nov 2023 03:49:30 -0800 (PST) In-Reply-To: Received-SPF: pass client-ip=209.85.217.49; envelope-from=mdjurfeldt@gmail.com; helo=mail-vs1-f49.google.com X-Spam_score_int: -13 X-Spam_score: -1.4 X-Spam_bar: - X-Spam_report: (-1.4 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FORGED_FROMDOMAIN=0.249, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.25, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Original-Sender: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.lisp.guile.user:19320 Archived-At: (Sorry, when writing "macro systems", I meant "object orientation systems".= ) On Tue, Nov 21, 2023 at 11:31=E2=80=AFAM Mikael Djurfeldt 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 th= at > 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 CLO= S. > There are macro systems where the class definition provides a lexical sco= pe > and there are macro systems based on generic functions. It's two differen= t > 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 ta= ke > a single argument, they are in a sense associated with a single class.) > > On Tue, Nov 21, 2023 at 9:19=E2=80=AFAM Damien Mattei > 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 () >> (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) >> >> (=CE=B7=E2=82=9B 1.0) >> >> (z) >> (z=CC=83) >> >> (M) >> >> (=E1=90=81) >> >> (error 0) >> >> ((*init* nc nbiter0 =CE=B7=E2=82=9B0 activation_function_hidden_layer0 >> activation_function_output_layer0 >> activation_function_hidden_layer_derivative0 >> activation_function_output_layer_derivative0) >> >> (display "*init* : nc=3D") (display nc) (newline) >> {nbiter <- nbiter0} >> {=CE=B7=E2=82=9B <- =CE=B7=E2=82=9B0} >> >> ... >> >> or in Racket : >> >> (define ReseauRetroPropagation >> >> (class object% >> >> (super-new) >> >> ; this is the initialisation parameters >> (init-field (nc #(2 3 1)) ;; on cr=C3=A9e le tableau des couches du= r=C3=A9seau >> (nbiter 10000) >> (=CE=B7=E2=82=9B 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=C3=A9es concr=C3=A8tes seront fournies avec la m=C3=A9th= ode 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=3D") (display z) (newline) >> >> >> ; z=CC=83[0] is not used as z[0] is x, the initial data >> ;;(field (z=CC=83 (vector-ec (:vector lg nc) >> ;; (make-vector lg 0)))) >> (field (z=CC=83 (vector-map (lambda (lg) (make-vector lg 0)) >> nc))) >> >> >> (display "z=CC=83=3D") (display z=CC=83) (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=3D") (display M) (newline) >> >> (field (=E1=90=81 (for/vector ([lg nc]) >> (make-vector lg 0)))) >> >> >> (display "=E1=90=81=3D") (display =E1=90=81) (newline) >> >> (display "nbiter=3D") (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=C3=A9es et on le= s >> propage >> >> (when {vector-length(x) =E2=89=A0 vector-length(z[0])} >> (display "Mauvais nombre d'entr=C3=A9es !") (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-Exa= mple.html >> >> On Mon, Nov 20, 2023 at 11:43=E2=80=AFPM Nate Rosenbloom >> 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-Sett= ers.html >> > [2] 8.5 Illustrating Slot Description: >> https://www.gnu.org/software/guile/manual/html_node/Slot-Description-Exa= mple.html >> > >> >