From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Damien Mattei Newsgroups: gmane.lisp.guile.user Subject: Re: 2 macros in one expression Date: Sat, 15 Apr 2023 18:15:24 +0200 Message-ID: References: <4187fdcf-5bee-8e9d-3ec1-19cc55e36fc3@gmail.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="37401"; mail-complaints-to="usenet@ciao.gmane.io" Cc: guile-user@gnu.org To: Matt Wette Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Sat Apr 15 18:16:16 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 1pniZT-0009cO-PJ for guile-user@m.gmane-mx.org; Sat, 15 Apr 2023 18:16:15 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pniYw-0003Ca-Vw; Sat, 15 Apr 2023 12:15:43 -0400 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 1pniYu-0003CJ-5Q for guile-user@gnu.org; Sat, 15 Apr 2023 12:15:40 -0400 Original-Received: from mail-ej1-x636.google.com ([2a00:1450:4864:20::636]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pniYr-0008MR-OB for guile-user@gnu.org; Sat, 15 Apr 2023 12:15:39 -0400 Original-Received: by mail-ej1-x636.google.com with SMTP id a640c23a62f3a-94f0dd117dcso45211366b.3 for ; Sat, 15 Apr 2023 09:15:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1681575336; x=1684167336; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=8CDA2NwWFLhr9wEzR3pzjEVTX8jqENefdsVgPHmX1Ws=; b=jGYa36qGmMt7l/XX2pszPhBF6KUxODahKT0jfL+IxfMB/sO6JEp1MHfb+tBGFZTckN tz1lH2sQOcIoT086RamZyOaEmFyiq+Zrk54ZqszoiDJxfEebTx6oruxnJbnpe2kMTomV PC93fAw21WZ7ALGwvUudpIhn0qrgVwr8q1Fy5ra0Qumcmy26CNZlA1tj2kP51PBNUJHG LMABCZklXWsPgD1zYwfbX/AV6kqTWE5zUc5lcwRQpQeGDDsONekPqy0RhgD3BP4tDjsR tDVMEq+Y2vdQok/bazINNe46xj0+uqo05iBSNTNk/9DfYOXMcHJYhAno/tZTsKjtqVmG Ce8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1681575336; x=1684167336; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8CDA2NwWFLhr9wEzR3pzjEVTX8jqENefdsVgPHmX1Ws=; b=kHDDU8Vcom7BRcSK0F/5Fjr3kLW2N6OtxUk1GhODlV3TfKk7gd3BsJHed+bHvpSfph 35KoY2bKUgnDstQd8pCTRg9DjNWXo2falVcB9h3RDSjtN7BJKvUn/JUlLY7TE+lu+b7m w0ib3fwU6/kAvzV9YcHo3S8W56B9PD8Em8MYvtxJVQUGGQVu3gNVYRkpzVwgoGUlXbEz tqSnkkJ3nomKHGRpbZDjwpXWaBJg/BiauU1hFbyjdGnuDWJkNWz86SUlFLxJ5yAq5Sws Z/xN6U1iYgeDpwX/9ah4jthC1EX5dDqMEiCRDpnrOwaiNCjj0/wOjI2MFUsIkxv/2yXe zciw== X-Gm-Message-State: AAQBX9dcxteO0BQX/oxCauBZvJC6F08FhkzgbIPJY8GAY/srHYcIKH/w G37j4lRFk8S3OEv72defhifVwxEEZ5bn0E8aLVVomFqFi6Q= X-Google-Smtp-Source: AKy350atdxY7gTIVFUSt5/uo7a09BhD9rV7zIqNTr5WYXx7gEqHWr00S4UjT1ljOFP+2PIsQU82blxWBSASG+YRtmXk= X-Received: by 2002:a50:baec:0:b0:4fa:d8aa:74ad with SMTP id x99-20020a50baec000000b004fad8aa74admr4766556ede.8.1681575335547; Sat, 15 Apr 2023 09:15:35 -0700 (PDT) In-Reply-To: Received-SPF: pass client-ip=2a00:1450:4864:20::636; envelope-from=damien.mattei@gmail.com; helo=mail-ej1-x636.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham 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:18964 Archived-At: it works pretty well again now the new version is debugged, this code is related to infix evaluation in Scheme+ with operator precedence , here is an example: ;;; compiled /Users/mattei/.cache/guile/ccache/3.0-LE-8-4.6/usr/local/share/guile/site/3= .0/Scheme+.scm.go scheme@(guile-user)> { 4 + 3 * 2 - 19 < 0 - 4} $1 =3D #t scheme@(guile-user)> (define i 3) scheme@(guile-user)> {i <- i + 1} $2 =3D 4 scheme@(guile-user)> (define c 300000) scheme@(guile-user)> (define v 299990) scheme@(guile-user)> (define t 30) scheme@(guile-user)> (define x 120) scheme@(guile-user)> (declare xp) scheme@(guile-user)> {xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2})} $3 =3D -1102228130.2405226 scheme@(guile-user)> '{xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2})} $4 =3D ($nfx$ xp <- ($nfx$ x - v * t) / (sqrt ($nfx$ 1 - v ** 2 / c ** 2))) could be written also this way: {c <+ 300000} {v <+ 299990} {t <+ 30} {x <+ 120} (declare xp) { xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2}) } =3D -1102228130.2405226 xp =3D -1102228130.2405226 it is not far from what the Python syntax allow in term of readability: c=3D300000 v=3D299990 t=3D30 x=3D120 xp =3D (x - v * t) / math.sqrt (1 - v ** 2 / c ** 2) xp -1102228130.2404253 On Sat, Apr 15, 2023 at 4:45=E2=80=AFPM Damien Mattei wrote: > my problem is solved by quoting the variable that CAN store a special for= m > (example: <-) and forcing its evaluation ! : (eval (quote opspecial) > (interaction-environment)) > > here is my 'else clause: > > (else (! ident (eval (quote opspecial) (current-namespace)) term1 op > term2)))))) > > for Racket, in Guile , not tested but it should be: > (else (! ident (eval (quote opspecial) (interaction-environment)) term1 o= p > term2)))))) > > again the else clause WILL NEVER be evaluated with opspecial being a > special form but it is always expanded and that was enought to make an > error. > > I admit reading Kent Dybvig article on macro and with a good scheme (as > Guile) that implement some special feature of the article and it should > exist a more elegant solution than : (eval (quote opspecial) > (interaction-environment)) > quoting with immediate evaluation ! :-/ > Damien > > > > On Sat, Apr 15, 2023 at 4:18=E2=80=AFPM Damien Mattei > wrote: > >> yes i tried it, i often get this answer :-) with this sort of problem i >> recurrent have with macros and it never helps ,at the point i never >> understood what is the use of this option in syntax-rules. >> >> My error i think was to forget the expansion stage of macro expansion >> that is always done for all the macros used in an expression at any leve= l, >> even if the code is not used in a branch of 'if ,'cond or other conditio= nal >> the macros will be expansed. >> >> I will quote the <- in the opspecial and tried to eval it later, the >> problem is with eval which is not really normalised between all >> implementations of scheme concerning its environment of evaluation. >> I will post the result. >> The problem was also that in an infix evaluator i wanted to be able to >> evaluate all procedure (that is ok) and all the macro too which is not >> always possible with the evaluation technique i use ,it is hard to write= an >> infix evaluator with precedence in the language itself.But the problem >> arise only with the special forms, so first i quoted them all but then i >> can not find the difference in the language with '(sin 30) a procedure c= all >> and '(1 2 3) a list when evealuating it is has sense for (sin 30) but n= ot >> for (1 2 3) then i removed all quotation and the macro problem arise... >> just after i added some overloading functionalities in my Scheme+ when >> using abstract types the evaluation of abstract object (list) with for >> example the + operator overloaded became a problem. >> Damien >> >> On Sat, Apr 15, 2023 at 3:50=E2=80=AFPM Matt Wette wrote: >> >>> Did you try using the following? >>> >>> (define-syntax $nfx$ >>> (syntax-rules (<-) >>> ((... >>> >>> >>> On 4/14/23 4:02 AM, Damien Mattei wrote: >>> > hello, >>> > >>> > i have 2 macros used in one expression like this: >>> > scheme@(guile-user)> (define i 2) >>> > scheme@(guile-user)> {i <- i + 1} >>> > and i got this error: >>> > While compiling expression: >>> > Syntax error: >>> > unknown location: source expression failed to match any pattern in >>> form <- >>> > >>> > i use SRFI-105 so : >>> > '{i <- i + 1} expand in: >>> > ($nfx$ i <- i + 1) >>> > >>> > and i'm expecting $nfx$ to be called but none of this happens: >>> > scheme@(guile-user)> ($nfx$ i <- i + 1) >>> > While compiling expression: >>> > Syntax error: >>> > unknown location: source expression failed to match any pattern in >>> form <- >>> > >>> > it seems to be the <- macro and i do not understand why? >>> > >>> > any idea? >>> > >>> > macros are defined like this for the beginning: >>> > ;; from file assignment.scm >>> > (define-syntax <- >>> > >>> > (syntax-rules () >>> > ;; special form like : (<- ($bracket-apply$ T 3) >>> ($bracket-apply$ T 4)) >>> > >>> > ;; one dimension array, example: {a[4] <- 7} >>> > ;; $bracket-apply$ is from SRFI 105 bracket-apply is an argumen= t >>> of >>> > the macro >>> > ((_ (bracket-apply container index) expr) >>> > >>> > .... >>> > >>> > ;; from file scheme-infix.scm >>> > (define-syntax $nfx$ >>> > (syntax-rules () >>> > >>> > ((_ ident opspecial term1 op term2) (cond ((or (equal? (quote >>> > opspecial) (quote <-)) (equal? (quote opspecial) (quote =E2=86=90))) >>> > (begin >>> > (display "$nfx$") (newline) >>> > (opspecial ident (op term1 term2)))) ;; {ident <- {term1 op term2}} >>> > >>> > ... >>> > >>> > >>> > it is in a module like this: >>> > >>> > (define-module (Scheme+) >>> > >>> > #:use-module (growable-vector) >>> > #:use-module (srfi srfi-69) ;; Basic hash tables >>> > #:use-module (srfi srfi-31) ;; rec >>> > #:export ($nfx$ def $bracket-apply$ <- =E2=86=90 -> =E2=86=92 <+ = =E2=A5=86 +> =E2=A5=85 declare $ & >>> condx >>> > <> =E2=89=A0 ** =E2=87=9C =E2=87=9D repeat) >>> > #:replace (do when unless)) >>> > >>> > >>> > >>> > (include-from-path "def.scm") >>> > (include-from-path "array.scm") >>> > (include-from-path "set-values-plus.scm") >>> > (include-from-path "apply-square-brackets.scm") >>> > (include-from-path "assignment.scm") >>> > (include-from-path "declare.scm") >>> > (include-from-path "condx.scm") >>> > (include-from-path "block.scm") >>> > (include-from-path "not-equal.scm") >>> > (include-from-path "exponential.scm") >>> > (include-from-path "while-do-when-unless.scm") >>> > (include-from-path "repeat-until.scm") >>> > (include-from-path "scheme-infix.scm") >>> > >>> > if it can help. >>> > >>> > Regards, >>> > Damien >>> >>