I would never have thought of the second example, a clever rewriting rule.
Thank you very much for the advice.

Le jeu. 13 janv. 2022 à 19:43, Dario Sanfilippo <sanfilippo.da...@gmail.com>
a écrit :

> Hi, Jean-Louis.
>
> From a first glance, the ba.selectn could be faster.
>
> Similarly, another easy-to-read solution that is very similar is using
> nested ifs:
>
> lut(n) = ba.if( n == 2,
> 3,
> ba.if( n == 3,
> 4,
> ba.if( n == 4,
> 2,
> n)));
>
> A while back Oleg Nesterov helped me write a function with pattern
> matching to implement nested ifs with arbitrary
> if0-then0-if1-then1...ifN-1-thenN-1-else:
>
> ifN((c, t, e)) = ba.if(c, t, ifN(e));
> ifN(e) = e;
>
> you could then write your lut function as follows:
>
> lut(n) = ifN((n == 2, 3, n == 3, 4, n == 4, 2, n));
>
> Ciao,
> Dr Dario Sanfilippo
> http://dariosanfilippo.com
>
>
> On Thu, 13 Jan 2022 at 19:08, Jean-Louis Paquelin <jean-lo...@paquelin.net>
> wrote:
>
>> @James and @bart, thank you for your quick reply.
>>
>> So (if I understand you well) pattern matching should be thought of as a
>> static rewriting tool.
>> And, btw, you're right
>>
>> process = 2 : lut : hbargraph("B", 1, 5);
>>
>> sets the bargraph to 2, while
>>
>> process = lut(2) : hbargraph("B", 1, 5);
>>
>> sets it to 3 (as expected).
>>
>> I came with 2 ways to write the lut() function I need:
>>
>> lut1(n) = 1,3,4,2,5 : ba.selectn(5, n - 1);
>> lut2(n) = ((n == 1) | (n == 5)) * n + (n == 2) * 3 + (n == 3) * 4 + (n
>> == 4) * 2;
>> process = hslider("A", 1, 1, 5, 1) <: (lut1 : hbargraph("B", 1, 5)), (
>> lut2 : hbargraph("C", 1, 5));
>>
>> Both functions seem to provide the service I'm asking for. But the first
>> one is more readable than the second.
>> Any idea which one is the lightest for the CPU?
>>
>> Thanks again,
>>
>> jlp
>>
>> Le jeu. 13 janv. 2022 à 16:41, James Mckernon <jmcker...@gmail.com> a
>> écrit :
>>
>>> On 1/13/22, Jean-Louis Paquelin <jean-lo...@paquelin.net> wrote:
>>> > Hello there,
>>> >
>>> > I can't figure out how the pattern matching works in Faust.
>>> >
>>> > I've tried the following code:
>>> >
>>> > lut(2) = 3;
>>> > lut(3) = 4;
>>> > lut(4) = 2;
>>> > lut(n) = n;
>>> >
>>> > process = hslider("A", 1, 1, 5, 1) : int : lut : hbargraph("B", 1, 5);
>>> >
>>> > Trying this in the IDE, the B bargraph simply replicates the A slider
>>> > value. I was expecting a different behavior thru the lut function: the
>>> > output of lut should be the same as its input except when the input is
>>> 2, 3
>>> > or 4, in those cases the output of lut should be 3, 4, 2 respectively.
>>> >
>>> > I tried the alternative syntax without any success:
>>> >
>>> > lut = case {
>>> > (2) => 3;
>>> > (3) => 4;
>>> > (4) => 2;
>>> > (n) => n;
>>> > };
>>> >
>>> > It's as if none of the cases match except the most general one.
>>> >
>>> > Did I miss something?
>>> >
>>> > I wish you all the best for 2022, health, joy and great projects!
>>> >
>>> > Best regards,
>>> >
>>> > Jean-Louis
>>>
>>> Pattern matching is done at compile-time, so to match the case of
>>> lut(2) (for example), the argument needs to be fixed and known at
>>> compile-time to be 2. This is true of lut(2), even of expressions such
>>> as lut(1 + 1), but not taking lut as a function of some potentially
>>> time-varying expression.
>>>
>>> Also, I'm not 100% sure of this, but I think pattern-matching may only
>>> take effect when a function is applied with explicit, parenthesis
>>> syntax, not when it is chained with : (i.e. lut (x) rather than x :
>>> lut). If I'm wrong about this then perhaps someone can correct me; in
>>> any case I don't think this was the problem with your example.
>>>
>>> The way to do what you are attempting to do at run-time would probably
>>> be by chaining a number of select2 functions together. I'm not sure
>>> whether there are any helper functions in the standard library to help
>>> with this; it seems like the sort of thing that ought to be present,
>>> but I can't think of any off the top of my head.
>>>
>>> Hope that helps.
>>>
>> _______________________________________________
>> Faudiostream-users mailing list
>> Faudiostream-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>>
>
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to