[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 21:36:50 +0200 |
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
>>
>