the same expression in Scheme would be: (set! xp (/ (- x (* v t)) (sqrt (- 1 (/ (expt v 2) (expt c 2)))))) > xp -1102228130.2405226
a bit less readable than: {xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2})} -1102228130.2405226 or: {xp ← {x - v * t} / (sqrt {1 - v ** 2 / c ** 2})} -1102228130.2405226 note: i admit the ← is hard to get on keyboards ;-) On Sat, Apr 15, 2023 at 6:15 PM Damien Mattei <damien.mat...@gmail.com> wrote: > it works pretty well again now the new version is debugged, this code is > related to infix evaluation in Scheme+ with operator precedence , here is > an example: > > ;;; compiled > /Users/mattei/.cache/guile/ccache/3.0-LE-8-4.6/usr/local/share/guile/site/3.0/Scheme+.scm.go > scheme@(guile-user)> { 4 + 3 * 2 - 19 < 0 - 4} > $1 = #t > scheme@(guile-user)> (define i 3) > scheme@(guile-user)> {i <- i + 1} > $2 = 4 > scheme@(guile-user)> (define c 300000) > scheme@(guile-user)> (define v 299990) > scheme@(guile-user)> (define t 30) > scheme@(guile-user)> (define x 120) > scheme@(guile-user)> (declare xp) > scheme@(guile-user)> {xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2})} > $3 = -1102228130.2405226 > scheme@(guile-user)> '{xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2})} > $4 = ($nfx$ xp <- ($nfx$ x - v * t) / (sqrt ($nfx$ 1 - v ** 2 / c ** 2))) > > could be written also this way: > {c <+ 300000} > {v <+ 299990} > {t <+ 30} > {x <+ 120} > (declare xp) > { xp <- {x - v * t} / (sqrt {1 - v ** 2 / c ** 2}) } > = -1102228130.2405226 > xp > = -1102228130.2405226 > > it is not far from what the Python syntax allow in term of readability: > > c=300000 > v=299990 > t=30 > x=120 > xp = (x - v * t) / math.sqrt (1 - v ** 2 / c ** 2) > xp > -1102228130.2404253 > > > On Sat, Apr 15, 2023 at 4:45 PM Damien Mattei <damien.mat...@gmail.com> > wrote: > >> 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.mat...@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.we...@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 >>>> >>>