guile-devel
[Top][All Lists]
Advanced

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

Re: Scheme+


From: Damien Mattei
Subject: Re: Scheme+
Date: Mon, 20 Dec 2021 10:20:41 +0100

yes it is based on SRFI-105 as explained in section 7: Features.
The project is based on R6RS (R5RS too) and SRFI for compatibility.
Linus we had a discussion about bindings month ago and Scheme+ take in account the impossibility in Scheme to have a single operator for defining a variable anywhere .
There is no more mutation in Scheme+ than in other code. If you code already use mutation with set! array-set! then Scheme+ encapsulate it with new and easy operator,that's all.
Scheme+ is 100% compatible with R6RS and SRFI.
I used it to convert a big code (see section 20:Scheme+ in action) and it worked at the first time.
let/ec, which i did not knew, is not standardised but i will work on this,thank you for your advice.
Scheme+ is really fast because macro are generally one step expanded ,or have recusivity depth of the size of the object (example array dim 3 , we recall three time the macro expansion) and on a compiled Scheme as Guile i'm not sure it is slower.(I could have done better as SRFI arrays which define a macro for each dimension 1,2,3,.... until a fixed number)
If someone have counter example with call/cc or threads making fail Scheme+ i will do my best to fix that and improve it. This is only version 1.0.

Damien


On Mon, Dec 20, 2021 at 9:16 AM Linus Björnstam <linus.internet@fastmail.se> wrote:
Hi Damien!

I played around with it and it seems to rely heavily on mutation, which makes guile (and chez and racket for that matter) box the values. That adds a layer of indirection to memory access, meaning slower code (apart from the more obvious problems of continuation safety and threading safety). It could be partially fixed with a very much not fun to write syntax case macro: you expand a body as far as possible into a letrec* (and letrec-syntax) shadowing bindings when needed and use set! only in places where bindings are not declared.

The workhorse you need for that is syntax-local-binding.

 If you want this system to be resilient and work well with other scheme code that is probably the path to go. One could imagining having a procedure form that is fully expanded, analyzed and then some-kind-of-CPS-transformed so that all variables are passed as state. That way you would get continuation and thread safety, while allowing something that seems like and, at least locally, behaves like mutation to take place.

This (the local mutation part) is tangential to something I have wanted to write for a long time, but I have not had the time (nor intelligence). If you want to discuss some ideas or have any question we can take this off-list.

Another thing would be to not use call/cc in the def form. Let/ec is a lot faster.

--
  Linus Björnstam

On Mon, 20 Dec 2021, at 01:05, Damien Mattei wrote:
> Hi,
> I finished today the first version of Scheme+.
> Scheme+ is an extension of the syntax of the Scheme language.
> Scheme+ makes it easy the assignment of Scheme objects in infix (works also
> in prefix) notation with a few new operators  ← (or  <-), [ ],⥆ (or <+) .
>
> Scheme+ does much more things,see:
>
> https://damien-mattei.github.io/Scheme-PLUS-for-Guile/Scheme+io.html
>
> or:
>
> https://github.com/damien-mattei/Scheme-PLUS-for-Guile/blob/main/README.md
>
> static light HTML page:
> https://damien-mattei.github.io/Scheme-PLUS-for-Guile/Scheme+.html
>
> direct link to code and README:
> https://github.com/damien-mattei/Scheme-PLUS-for-Guile
>
> Best regards,
>
> Damien Mattei

reply via email to

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