Hi, Oleg.

On Tue, 28 Jun 2022 at 13:18, Oleg Nesterov <o...@redhat.com> wrote:

> On 06/27, Yann Orlarey wrote:
> >
> > The current implementation of letrec is extremely simple and
> > almost like syntactic sugar,
>
> Yes, but I'm afraid it is only simple to you and other faust devs ;)
>
> Once I was greatly puzzled why letrec doesn't work as I'd expect, and
> I had to dig into the compiler sources to understand.
>
> For example, I think it is not immediately clear why this code
>
>         process = _ : bug;
>
>         bug = x,y letrec {
>                 'x = _;
>                 'y = 0;
>         };
>
> doesn't even compile. IIUC, this is because buildRecursiveBodyDef() turns
> the code above into something like
>
>         LETRECBODY = \(x, y).( ... ) ~ (_,_);
>         // makeRecProjectionsList()
>         x = LETRECBODY : _,!;
>         y = LETRECBODY : !,_;
>

Are there cases where makeRecProjectionList() isn't redundant?
Specifically, couldn't we just translate the bug example above into the
following?

process = _ : bug;

// bug = x , y
// letrec {
// 'x = _;
// 'y = 0;
// };

bug = LETRECBODY
with {
LETRECBODY = \(x, y).(_ , 0) ~ (_ , _);
};



>
> Perhaps letrec needs more documentation? In particular, the doc could
> explain that yes, it is just syntactic sugar, and you can always avoid it.
>

As I was telling Yann in another conversation, I was thinking that
extending `with` to allow recursive definitions could be a good idea,
although I'm not against extending or improving letrec as well.

To get back to the example in my first email, the code

onePoleSwitching(att, rel, x) = y
with {
'y = (1.0 - coeff) * x + coeff * y;
coeff = ba.if(x > y, ba.tau2pole(att), ba.tau2pole(rel));
};

could be translated into

onePoleSwitching(att, rel, x) =
\(y).((1.0 - coeff) * x + coeff * y
with {
coeff = ba.if(x > y, ba.tau2pole(att), ba.tau2pole(rel));
}
) ~ _;

Does that make sense?

Dario


> And I recall I have already asked this question, but nobody replied. See
>
>         https://sourceforge.net/p/faudiostream/mailman/message/36587927/
>
> and this reminds me that I'd really like to have a better way to name the
> outputs ;)
>
> Oleg.
>
>
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to