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 11:31:03 +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="38260"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Nate Rosenbloom , guile-user , Mikael Djurfeldt To: Damien Mattei Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Tue Nov 21 11:32:02 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 1r5O30-0009j5-1V for guile-user@m.gmane-mx.org; Tue, 21 Nov 2023 11:32:02 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1r5O2Q-0002K3-OP; Tue, 21 Nov 2023 05:31:26 -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 1r5O2I-0002J7-Ob for guile-user@gnu.org; Tue, 21 Nov 2023 05:31:20 -0500 Original-Received: from mail-vs1-f44.google.com ([209.85.217.44]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1r5O2G-0000m9-2V for guile-user@gnu.org; Tue, 21 Nov 2023 05:31:18 -0500 Original-Received: by mail-vs1-f44.google.com with SMTP id ada2fe7eead31-462a978c470so493868137.2 for ; Tue, 21 Nov 2023 02:31:15 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700562675; x=1701167475; 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=P2ApoHmwYeqP0cS2/5odqGIXAZmyuCYA+1ouHdCYUgY=; b=WASFIHzzkH2sltx19dEvgPredFsZoyYhpw3EqB13sq321kujOPabHMysfN5e8uFydH 5fPBduRHowMWVsNCpzl4LCekOlwDSHAB7c7KhOi98WQom9QGL6yMNV+U1xVPaeMJG9b4 CjCxjAtzPNNN3mmYCn+asG+x950Ygoh6lvgoZTrpfC02jnXDGiOdIzmN8PEZXNXe6NPf jNlfzNUwIKU85xpNdbGoT7PYILTiHBekN7nH6jhb8lXCtVJeUQFm6P0gB17I/lv34weD L4VEVmNlExgocSFxaYjQ62+rNSJKwNG/7AEaC2nCme7RAfyo3lOyfux08WTZj4zEvOcD +yiw== X-Gm-Message-State: AOJu0YwpuLeMLB+3Tunc/Wkqgsql+iZ4o4gSddUYIRvkIO2GDdNbclcK YbNCLkaxWmOiCt1qLSx9rXv9QSTSkritjo0HMZ4= X-Google-Smtp-Source: AGHT+IHB5oypHjHrEoLtTlzbOwd6NhncFC+8KcqFU4KsmyjVTqTJqGuy9ZsxGjtPr2OsmjRWCs7gVzMrFtheReyN4WI= X-Received: by 2002:a05:6102:da:b0:462:78c1:30a3 with SMTP id u26-20020a05610200da00b0046278c130a3mr5319049vsp.7.1700562674511; Tue, 21 Nov 2023 02:31:14 -0800 (PST) In-Reply-To: Received-SPF: pass client-ip=209.85.217.44; envelope-from=mdjurfeldt@gmail.com; helo=mail-vs1-f44.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:19319 Archived-At: 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=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=A9tho= de 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 les > 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-F= unctions.html > > [2] 8.5 Illustrating Slot Description: > > https://www.gnu.org/software/guile/manual/html_node/Slot-Description-Exam= ple.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-Sette= rs.html > > [2] 8.5 Illustrating Slot Description: > https://www.gnu.org/software/guile/manual/html_node/Slot-Description-Exam= ple.html > > >