unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Damien Mattei <damien.mattei@gmail.com>
To: guile-user <guile-user@gnu.org>
Subject: Re: 2 macros in one expression
Date: Sat, 15 Apr 2023 13:35:30 +0200	[thread overview]
Message-ID: <CADEOadewMRj+68NU_SVD8_VYGVXCQbW+F2+GHDvzv3HF6TwRFQ@mail.gmail.com> (raw)
In-Reply-To: <CADEOadeSmQ=pL5aLM-cUq6pxqhnUqMiLDAqLGDmua+dfb8jfpg@mail.gmail.com>

just understood my error:
quote is a macro, so it stop the evaluation of the other macro <- and <- is
expanded in the else even if this branch will not be executed and the error
arise.

On Fri, Apr 14, 2023 at 9:36 PM Damien Mattei <damien.mattei@gmail.com>
wrote:

> i test my previous problem both with Racket and Guile, it gave the same
> error , i isolated the problem out of SRFI 105 ,so it is not related to
> SRFI 105, here is a simple code to test:
>
> (define-syntax $nfx$
>   (syntax-rules ()
>
>     ((_ ident opspecial term1 op term2) (cond ((or (equal? (quote
> opspecial) (quote <-)) (equal? (quote opspecial) (quote ←)))
>       (begin
> (display "$nfx$") (newline)
> (opspecial ident (op term1 term2)))) ;; {ident <- term1 op term2}
>
>      ((or (equal? (quote op) (quote ->)) (equal? (quote op) (quote →)))
> (op term2 (opspecial ident term1))) ;; Warning: argument names of macro do
> not reprensent the values contained in this case
>
>      ;;(else (! (quote ident) (quote opspecial) (quote term1) (quote op)
> (quote term2)))))
>      (else (! ident opspecial term1 op term2))))))
>
>
>
>
>
> (define-syntax <-
>
>   (syntax-rules ()
>
>     ((_ var expr)
>
>      (begin
>        ;;(display "<- : variable set!") (newline)
>        (set! var expr)
>        var))))
>
> (define i 3)
> > ($nfx$ i <- i + 1)
> <-: bad syntax in: <-
>
> it works only if i change the last line of $nfx$:
>
> (else (! ident (quote opspecial) term1 op term2))))))
>
> note: ! which is a procedure is not defined in this example
>
> On Fri, Apr 14, 2023 at 4:49 PM Damien Mattei <damien.mattei@gmail.com>
> wrote:
>
>> i have found that the error is related with this :
>>
>> (define-syntax $nfx$
>>   (syntax-rules ()
>>
>>     ((_ ident opspecial term1 op term2) (cond ((or (equal? (quote
>> opspecial) (quote <-)) (equal? (quote opspecial) (quote ←)))
>>       (begin
>> (display "$nfx$") (newline)
>> (opspecial ident (op term1 term2)))) ;; {ident <- term1 op term2}
>>
>>      ((or (equal? (quote op) (quote ->)) (equal? (quote op) (quote →)))
>> (op term2 (opspecial ident term1))) ;; Warning: argument names of macro do
>> not reprensent the values contained in this case
>>
>>      (else (! ident (quote opspecial) term1 op term2))))
>>
>> this code works:
>> scheme@(guile-user)> (define i 2)
>> scheme@(guile-user)> {i <- i + 1}
>> $nfx$
>> 3
>>
>> but if i change the last line of the else clause by removing the quote of
>> opspecial:
>> (else (! ident opspecial term1 op term2))))
>>
>> it will fail:
>>
>> scheme@(guile-user)> {i <- i + 1}
>> While compiling expression:
>> Syntax error:
>> unknown location: source expression failed to match any pattern in form <-
>>
>> i understand the problem is with opspecial equal in this example to the
>> special form <-  but what i do not understand is why the code is then going
>> to the else clause as i know that previously it was on the same example
>> evaluating the first clause:
>> (begin
>> (display "$nfx$") (newline)
>> (opspecial ident (op term1 term2)))) ;; {ident <- term1 op term2}
>>
>> ???
>>
>> On Fri, Apr 14, 2023 at 1:02 PM Damien Mattei <damien.mattei@gmail.com>
>> 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 argument 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 ←)))
>>>       (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$ <- ← -> → <+ ⥆ +> ⥅ declare $ &
>>> condx <> ≠ ** <v v> ⇜ ⇝ 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
>>>
>>


  reply	other threads:[~2023-04-15 11:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-14 11:02 2 macros in one expression Damien Mattei
2023-04-14 14:49 ` Damien Mattei
2023-04-14 19:36   ` Damien Mattei
2023-04-15 11:35     ` Damien Mattei [this message]
2023-04-15 13:49 ` Matt Wette
2023-04-15 14:18   ` Damien Mattei
2023-04-15 14:45     ` Damien Mattei
2023-04-15 16:15       ` Damien Mattei
2023-04-15 16:25         ` Damien Mattei

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CADEOadewMRj+68NU_SVD8_VYGVXCQbW+F2+GHDvzv3HF6TwRFQ@mail.gmail.com \
    --to=damien.mattei@gmail.com \
    --cc=guile-user@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).