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 18:15:24 +0200 [thread overview]
Message-ID: <CADEOadd2o_0i2_UHrUgcwWks=ysRcEtD9Dcdo837FzDC5roX_Q@mail.gmail.com> (raw)
In-Reply-To: <CADEOadeqGRHwpuZpKwGR=09QEWYqTPSvOGZCKugrxfzSSEYvjQ@mail.gmail.com>
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.mattei@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.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
>>>
>>
next prev parent reply other threads:[~2023-04-15 16:15 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
2023-04-15 16:15 ` Damien Mattei [this message]
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='CADEOadd2o_0i2_UHrUgcwWks=ysRcEtD9Dcdo837FzDC5roX_Q@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).