unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Damien Mattei <damien.mattei@gmail.com>
To: Matt Wette <matt.wette@gmail.com>
Cc: guile-user@gnu.org
Subject: Re: 2 macros in one expression
Date: Sat, 15 Apr 2023 16:45:53 +0200	[thread overview]
Message-ID: <CADEOadeqGRHwpuZpKwGR=09QEWYqTPSvOGZCKugrxfzSSEYvjQ@mail.gmail.com> (raw)
In-Reply-To: <CADEOaddBkxUB+p-rHv1yeyYBRaX8dwZR_AkKcjf914vKQFKCfQ@mail.gmail.com>

my problem is solved by quoting the variable that CAN store a special form
(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 op
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 PM Damien Mattei <damien.mattei@gmail.com>
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 level, even
> if the code is not used in a branch of 'if ,'cond or other conditional 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 call
> and '(1 2 3) a list when evealuating it is has sense  for (sin 30) but not
> 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 PM Matt Wette <matt.wette@gmail.com> 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 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 14:45 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
2023-04-15 13:49 ` Matt Wette
2023-04-15 14:18   ` Damien Mattei
2023-04-15 14:45     ` Damien Mattei [this message]
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='CADEOadeqGRHwpuZpKwGR=09QEWYqTPSvOGZCKugrxfzSSEYvjQ@mail.gmail.com' \
    --to=damien.mattei@gmail.com \
    --cc=guile-user@gnu.org \
    --cc=matt.wette@gmail.com \
    /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).