[good practice] A multi steps IF using filters

151 views
Skip to first unread message

Mohammad Rahmani

unread,
Jan 24, 2021, 5:24:58 AM1/24/21
to tiddl...@googlegroups.com
I tried to implement the below pseudo code in TW 5.1.23

if x=one then
  print(1)
elseif x=two then
 print(2)
elseif x=three then
 print(3)
else
 print(x is not valid)
end

with

\define myfun(x)
<$vars u={{{[<__x__>match[one]then[1]] [<__x__>match[two]then[2]] [<__x__>match[three]then[3]]  +[addsuffix[ lili]]  ~[<__x__>addsuffix[ is not valid]]}}} >
  This is u: <<u>>
</$vars>
\end

 It works fine on https://tiddlywiki.com/   by calling macro as below

<<myfun one>>
<<myfun two>>
<<myfun three>>
<<myfun four>>

I wish to know is this a good practice in TW 5.1.23? If not what better solution do you propose?


Best wishes
Mohammad

Mat

unread,
Jan 24, 2021, 5:34:00 AM1/24/21
to TiddlyWiki
Very minor but for readability you can break the line in multiple places.

<:-)

Jed Carty

unread,
Jan 24, 2021, 6:11:26 AM1/24/21
to TiddlyWiki
I don't see anything wrong with using that macro, but I do have an alternative that I think is more flexible.
Depending on the situation this may not work, but here is the same result using lookup:

\define myfun(x)
<$vars u={{{ [<__x__>lookup:$x$ doesn't exist[value ]] }}}
\end

then you make a series of tiddlers with the titles 'value one', 'value two', 'value three'  with 1, 2 and 3 in their text fields.

The downside is that you can't distribute it as just the macro, the benefit is that you can extend it to as many options as you want without editing the macro.

Mat

unread,
Jan 24, 2021, 9:40:46 AM1/24/21
to TiddlyWiki
@Mohammad

It is not the IF-THEN structure you're asking for but if the input and output are predefined like that, then it'd be simpler to use a data tiddler to just get the value i.e {{datatiddler##two}} ---> 2

<:-)

On Sunday, January 24, 2021 at 11:24:58 AM UTC+1 Mohammad wrote:

Mohammad Rahmani

unread,
Jan 24, 2021, 1:04:34 PM1/24/21
to tiddl...@googlegroups.com
Thank you Jed,
I have not used the lookup operator, seems promising. I will give a try.


Best wishes
Mohammad


--
You received this message because you are subscribed to the Google Groups "TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tiddlywiki+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/tiddlywiki/63dedb45-c31a-4a78-9733-caecd865df0an%40googlegroups.com.

Mohammad Rahmani

unread,
Jan 24, 2021, 1:09:00 PM1/24/21
to tiddl...@googlegroups.com
Mat,
Thank you! Well yes a dictionary tiddler can be used. I have used such a solution in my recent plugin Tamasha.
I also implement the switch-case using your proposed solution. Really powerful.

By the way, there are situations where the operands are not constant. I just tried to see how I can implement a multi step IF.
But I was not sure if my solution follows a good programming style or not!

Best wishes
Mohammad


--
You received this message because you are subscribed to the Google Groups "TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tiddlywiki+...@googlegroups.com.

TW Tones

unread,
Jan 24, 2021, 4:47:13 PM1/24/21
to TiddlyWiki
Mohammad,

I know your example is more a general example, but if we look at the specific example translating a number to a number-word we have the advantage that the input is an integer.

\define number-words() one two three four five six seven eight nine

<$list filter="[range[1,9]]">
   <<currentTiddler>> {{{ [<number-words>split[ ]nth<currentTiddler>] }}}<br>
</$list>

But this could be extended further

You could also use the number as the index to a json or dictionary tiddler.

Regards'
Tones

Mark S.

unread,
Jan 24, 2021, 7:30:12 PM1/24/21
to TiddlyWiki
Maybe too literal, but easier to read and extend:

\define myfun(x)
<$vars u={{{ [enlist[xxx one two three four]allbefore<__x__>count[]] }}} >
  This is u: <<u>>
</$vars>
\end



Mohammad Rahmani

unread,
Jan 24, 2021, 11:32:37 PM1/24/21
to tiddl...@googlegroups.com
Thank you @Mark. It seems the {{{filter...}}} has a lot of potential to create conditional statements. The actual use case was based on the user interaction a set of classes shall be applied to few html tags. I used the dictionary tiddler, but for small use cases I like your approach.

@Tones, thank you. I like these kinds of threads where the scripting features of TW are discussed and I always learn new things.
 
Thank you Jed, Mat, Mark, and Tones.


Best wishes
Mohammad


--
You received this message because you are subscribed to the Google Groups "TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email to tiddlywiki+...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages