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.mat...@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.mat...@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 >> >