guile-devel
[Top][All Lists]
Advanced

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

Re: new function


From: Damien Mattei
Subject: Re: new function
Date: Thu, 23 Sep 2021 22:42:36 +0200

yes it can reuse an upper and precedent definition but a nested definition can not be used later at an upper level.

anyway it would not be portable , for all those reason i will use to separate operator ,basically <- for set! and <+ for define ,so i can even modify toplevel bindings , i did not want to have all the python behavior which is not safe and did not allow local nested variables.

even using an exception will not solve the problem:
scheme@(guile-user)> (call-with-current-continuation
   (lambda (exit)
     (with-exception-handler
      (lambda (e)
        (exit "undefined ,you need to define somewhere")) (lambda () (set! notdefined 7)))))
;;; <stdin>:97:69: warning: possibly unbound variable `notdefined'
$28 = "undefined ,you need to define somewhere"

??? i do not see any solution with a macro with exception

Damien


On Thu, Sep 23, 2021 at 10:27 PM Taylan Kammer <taylan.kammer@gmail.com> wrote:
On 23.09.2021 19:27, Damien Mattei wrote:
> yes i know parsing the whole code is the only portable solution, but it is slow,even on a few dozen of lines the slowing is visible ,so i can even think of that on one thousand lines...
>
> I finally succeed in Guile with simple piece of code to make my example run with a single assignment operator <-  , here i define for variable the assignment operator <$ , <- is working with arrays too:
>
> *Preview:*
>
> (define-syntax <$
>   
>   (lambda (s)
>     
>     (syntax-case s ()
>       
>       ((_ var value)
>       
>        (case (syntax-local-binding #'var)
>       
>          ((lexical) #'(begin
>                       (display "<$ : lexical scope : ")
>                       (display (quote var))
>                       (newline)
>                       (set! var value)))
>       
>        ((displaced-lexical) #'(begin
>                                 (display "<$ : displaced-lexical scope : ")
>                                 (display (quote var))
>                                 (newline)
>                                 (set! var value)))
>       
>          ((global) #'(begin
>                      (display "<$ : global scope : ")
>                      (display (quote var))
>                      (newline)
>                      (define var value)))
>       
>          (else #'(begin
>                  (display "<$ : unknow variable scope :")
>                  (display (quote var))
>                  (error "<$ : unknow variable scope : "))))))))
>

I can't seem to find syntax-local-binding in Guile 2.2 or 3.0.  Did you
have to import some special module, or are you using another version?

Either way, I suspect that the following will not work with your macro:

  (let ()
    (let ()
      (<$ x 1))
    (display x)
    (newline))

If I understand correctly, it will expand to:

  (let ()
    (let ()
      (define x 1))
    (display x)
    (newline))

And that won't work because 'x' is only defined in the inner 'let'.

This is where we see the crucial difference between Scheme and Python:
in Python there is nothing similar to an inner 'let'.  There is only
one function-level scope.  In Scheme, there can be as many nested
scopes as you want, and an inner scope can't affect an outer one.

--
Taylan

reply via email to

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