<div dir="ltr">Hi colleagues, I&#39;m trying to figure out how to build a couple of threading macros that would be very helpful in Max/MSP for Scheme for Max, but it is frankly over my head right now. Working it out will be a good exercise but I figured I would post here in case this is trivial for some macro experts in S7 and they are willing to share something I can study. <div><br></div><div>I want to implement something like <span style="color:rgb(26,26,27);font-family:&quot;Noto Sans&quot;,Arial,sans-serif;font-size:14px">srfi-197, where it is called &quot;chain&quot;. (but srfi-197 uses syntax-case and syntax-rules)</span></div><div><span style="color:rgb(26,26,27);font-family:&quot;Noto Sans&quot;,Arial,sans-serif;font-size:14px"><br></span></div><div><span style="color:rgb(26,26,27);font-family:&quot;Noto Sans&quot;,Arial,sans-serif;font-size:14px">so from the docs there: </span></div><div><div><span style="color:rgb(26,26,27);font-family:&quot;Noto Sans&quot;,Arial,sans-serif;font-size:14px"></span></div><div><pre style="border-color:inherit;box-sizing:inherit;font-family:Consolas,&quot;Liberation Mono&quot;,Menlo,Courier,monospace;font-size:13.6px;margin-top:0px;margin-bottom:0px;padding:16px;background-color:rgb(246,248,250);color:rgb(31,31,31);direction:ltr;line-height:1.45;overflow:auto;border-radius:3px"><code class="gmail-language-scheme" style="border:0px;box-sizing:inherit;font-family:Consolas,&quot;Liberation Mono&quot;,Menlo,Courier,monospace;font-size:13.6px;padding:0px;border-radius:3px;direction:ltr;line-height:inherit;margin:0px;overflow:visible;word-spacing:normal;word-break:normal;display:inline;background:transparent;color:inherit"><span style="border-color:inherit;box-sizing:inherit"><span class="gmail-mtk1" style="border-color:inherit;box-sizing:inherit;margin-bottom:0px">(chain x (a b _)) </span><span class="gmail-mtk4" style="border-color:inherit;box-sizing:inherit;color:rgb(106,115,125);margin-bottom:0px">; =&gt; (a b x)</span></span><br style="border-color:inherit;box-sizing:inherit"><span style="border-color:inherit;box-sizing:inherit"><span class="gmail-mtk1" style="border-color:inherit;box-sizing:inherit;margin-bottom:0px">(chain (a b) (c _ d) (e f _)) </span><span class="gmail-mtk4" style="border-color:inherit;box-sizing:inherit;color:rgb(106,115,125);margin-bottom:0px">; =&gt; (let* ((x (a b)) (x (c x d))) (e f x))</span></span><br style="border-color:inherit;box-sizing:inherit"><span style="border-color:inherit;box-sizing:inherit"><span class="gmail-mtk1" style="border-color:inherit;box-sizing:inherit;margin-bottom:0px">(chain (a) (b _ _) (c _)) </span><span class="gmail-mtk4" style="border-color:inherit;box-sizing:inherit;color:rgb(106,115,125);margin-bottom:0px">; =&gt; (let*-values (((x1 x2) (a)) ((x) (b x1 x2))) </span><span class="gmail-mtk4" style="border-color:inherit;box-sizing:inherit;color:rgb(106,115,125);margin-bottom:0px">(c x))</span></span></code></pre></div></div><div><br></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">But what I&#39;d really to make on top of that is a version for allows one to use this for one liners in Max without inner parens, so something like this, where the macro is ~&gt;</span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px"><br></span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">(x ~&gt; a _ b ~&gt; c _ )</span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">becomes something  equivalent of:</span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">(c (a (eval x) b))</span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px"><br></span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">Because Scheme for Max will take a max message and treat it as code to be wrapped in outer parens and then eval&#39;d, this will let people do very useful things in one short max message (where say $i and $i2 come from another max message sending to it:</span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px"><br></span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">$i1 ~&gt; + 10 _ ~&gt; / $i2 _ </span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px"><br></span></font></div><div><font color="#1a1a1b" face="Noto Sans, Arial, sans-serif"><span style="font-size:14px">If anyone has suggestions or feels like helping that would be amazing. thanks!</span></font></div></div>