guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 2 macros in one expression


From: Damien Mattei
Subject: Re: 2 macros in one expression
Date: Fri, 14 Apr 2023 16:49:15 +0200

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 via email to

[Prev in Thread] Current Thread [Next in Thread]