Page 1 of 1

bell lifted variables questions

Posted: Tue Jun 30, 2020 8:04 pm
by chrischandler
In bell, I'm trying to call user functions within user functions. As I understand it, if I have a secondary user function being called within a primary user function then I need to lift the variable assigned to the secondary function at the start of the primary user function. Kind of a cumbersome way to state it, but I think that's correct. I've attached a patch where I am trying to do this, but calling the nested functions is causing a crash. I'm not sure if it's due to lifting the variable incorrectly or some other issue.

Any thoughts or direction would be very helpful. Thanks!

Code: Select all

----------begin_max5_patcher----------
1691.3oc6Z01aaaCD9yN+JtoF.aG33IJIKY2srWv1W5WWGv9PSW.sDcL6jnL
jnyKnn+22QRYK4XkXYWktzUGTXYch28v6gmNd7p+3IcrlldGK2BdM7NnSmOd
RmNZQJAcJtuiUB8tvXZtdXVgoIILgzZf4YR1cRs7amSk.eF7F3VpPBxTHjFG
CIKik7EwLX1RQnjmJxAtHmGw.JrLmksV9Oeo3RQNiAx4LHOQqaZDeFOjpdLf
VOlKXfiGb6bVlYbmlD5LasI.dtFTVzpYmRivzkB8TbTgPwxjzkxXlT6P1ERW
Pkgy4hquJiEJMDhKIXn8.vyUeww1QcIvanM79Bk3QZeOc5GNmDXUZetXk4IJ
Ye5jSTeL3yjh+SziWjwSnY2W5yZt.cbCcP+G1aYYbVNPEQvsbI5R.WhqJzDM
2fdHx74HqHhT1Yi0fB1CNcNMKAevP0ZxeMmI1vxpAkudL.za0p1zToLMAx3W
OWhSTVNS1W8.yDjBgYz74Za9qI3LJlOSplN2Py3zoXHRXZlh7iuWGK76oHV3
TeN8FlJbJJU6OPBqzQxPA5IQQLUx8kyqMitfKEf5uyg2RSTzXJhXBjFFtLK2
D2h.zi.CGNDNEWBWPyjbZbd+ZikH96avTvlwRD8EGxiDL42ZASB1snE2JVRB
Ssp0EHOw6CddpYMw22L4W84ZOvXF48KXFErlREWaUmCN941+lRCmODiAWvv2
CX2sP85vufyuaynK.x965lTAt1izLvD2c66052Sp0ucZc+lWl9XeS24NVewm
rkKVM.0t9EvBg436rQWgCDM9UToLiOcozrOSm09SGqaXY43KmnIlxxTObrMw
VSFF1Xe4DSNm5cbuc53jhK1152TsepE2UHAVZl9gBpkxHOIkYLvUQTIc01wk
LkVmBNpPATV4XmLvfgiZBnhEXQb8joXN8N7CG7JlbS8Mz8rdONIMFxvu0Cly
ABlEEy9ZoHy8BN2ZfSYhci20F7brUQviTeRFRF0Xf8NT+bQgeh+KXOn0CFu4
F7r9sQEr6FHZ9V6jIICC5wMdU2V6KTN67EJGe89EilzfjkCdjDlDmVKiYIk9
.O8cfZUDHpkP38GZ5ih5CK1czycWtaQhiG2ycsViYFVyhjkcESnJTpZd7m08
OY2PiO3sJ8z7fu8AtSIw6ISWFlFmlYz2dn2HuI1jI91Ai8bIdCPQ9i8cB7FY
OYrs6DGGknwNtibl3go488Br8UYHJmTgoQ5oik4HEW.8vuL.NcAGcP7VOOa3
7eZ08mA8bfyvOIeOAS4zuu9FTCr9R+IJA+fpD100hhlyT+4oXAoQCVUfIWhE
Xh2kKyXFXHCQTLCsmdrHTqqxsGYSMQTWqaeD4dqUYszy0R5OTHm2iz2X3h4l
ph9+.qOhJyqL+hw+TNZOnKWxRx6ZDMbVLU1akcfWe11hc6C8GpJupVfvBAYa
CSQQ4Jus7qvJnqJBqPWAhFOs18w0u9vOtsTW8YND0NbUw80nPUfXw4LHicSu
5Lbs5S5Ww.ONETb5oGxA+c4IVVwGnuZX2B19hKftp79c0N1ivY0xZvZi+fwp
ejJRuWUjPm4UuRcNn2.BFdNP7TWpCogvpNfYZ5OWiQVqtS+Aa+3MbkUqLaHQ
y2jgap5iSn5gWGAQOPBp7sqmKmqqHUv5tK881Reu8R+Qao+nB8s+r41qOPt8
ZV5Ql8IY1EGHypZCD6kL01XpwjgbVZFbpxQANZs6HpmgawGiUUTlST87gcMG
leSRqBMfCbFWDQihxx6soJCftu9rt8gu6BPrDy8JW2Yqh8Aev3qLoWs.9DlF
2andaq15aGVtxFDOXjlcXqrES0HJ8PuTXsem5lgmBIp5IIa8yg2h8bhX2Z8b
J3qrdNEzNsbx+EbKmBZdGmF8+nFNE7kneSdGa2zw1M8MQ6lBZstM49huYSAO
K8Zx4qyVMEzNcZ5+nFMcr4PGaNzK1lCo524izkypnWztyAGaLzwFCcrwPGaL
zwFC8MYigzU2n+ER8feKg5h1Tx2rrv7zkYgqJJq32ECTViTDKWxE5e2eUFi5
+QP0fpsxylBz3l.jaK.TPC.xoEvwuINTKfih7I6.mfVBmuD7laCvwuEvwoA3
zFwajlPbpe1Ve9H0DpizFqQjlPdSZCfHMH5dbaAzWj7OMAnQagiIQNcwhhL+
ZPTPfmj+ClyAOdf9VtHsr+fV3Yh3qFu92YsEMCOstD2vYYl47t24a5HoUBdB
3LwRdQaDPmCgT2k.AEqcYA03G5lIbxmN4ewRr8kJ
-----------end_max5_patcher-----------

Re: bell lifted variables questions

Posted: Wed Jul 01, 2020 9:29 am
by andreaagostini
Hi,

I can't reproduce the crash. We've fixed various things in the bell engine, so I like to think that the bug you found is solved. But can you tell me your Max and OS versions? I'd like to investigate it more. Does it happen all the time, or only sporadically? Anyway, we plan to post very soon a new pre-release for our Patreon supporters, with all these fixes and a few new small features.

About lifting: yes, it's a complicated mechanism, I know. The way you lift the variable in the first example is perfectly correct syntactically. On the other hand, from a stylistic point of view the idea is that if you have function A that calls function B, and actually function B is only used from within function A (which is quite a typical case) then you can define B inside A and you don't need to lift it. On the other hand, if function B is also used from outside function A then perhaps its purpose is rather general and you might want to assign it to a global variable. Of course this is only a very generic guideline, but the idea is that function lifting is mostly necessary for recursion.

As for the second example, first of all mc2f (along with f2mc and a few others) is implemented as a built-in function in the pre-release we're about to post. Anyway, in your specific case yes, you need to lift both $harmser and $mc2f, which you do with ($lll -^ $harmser, $mc2f -> ...)

I hope this helps,
andrea

Re: bell lifted variables questions

Posted: Wed Jul 01, 2020 8:06 pm
by chrischandler
Hi Andrea,

Super helpful, thanks! I am on macOS 10.14.6 and Max 8.1.5. For this particular problem, the crash happens every time. If it's not crashing on your end then I'm at least happy to know that it's not something I am doing wrong.

That's a good idea about function B only being called within function A and not needing to lift it. I've tried two scenarios. In the attached patch, the left-hand example defines the $harmser function within the $makeSeries function ($makeSeries does not work properly, but no crashes), and in the right-hand example I've hardcoded $harmser so there is no function now but it still produces a crash.

At any rate, I look forward to the next pre-release you mention and bet what I'm experiencing is an already fixed bug.

Code: Select all

----------begin_max5_patcher----------
1417.3oc6Z0tahiCE82vSg2zJQREjM14CftaWsR6avt+rspxPbKYVvAkX5vp
Qy69bscBDJApgFXpVApMo4l60Get96S4asaYMJcIK2BcK5dTqVeqcqVJSRCs
Jdtk0L5xwSo4J2r3rulN5KVc0uRvVJTlEnQk13KlktPLkITAfKrpMI9u4LMZ
Vin7WrPOV754Tw3II7WdJiMVn8.i8b85hvQQxaDR40UwjDqfFpN8v3JnmvWA
tz12a2VdoqgDbdFKmIpmLA6hLkAgrR3paaZXezbfuhk39padJNG3UOMGTOKK
KbElOESEzxVzUbTGyHVVk..aq8cX2hLourRKaWYwIJBTvi6kWn4PIHqlPSA7
q0i.0zkkNAWOdjyLd90fmrHL.vWz.R7.28CkWwt3PiQN3nY57BlB+z+.xrGO
fSz.Z8WgEI3MfT+WG3PmcL2vH53ItPmy4LdLhsbNEt8mvPnulQmivG3zFFLV
x2KTMVZn+9lxXXsikHMNsUSHTGE8dWdLPMmPDduy74s24DxouxheBbDJ6mnB
QVxnEB8L9U5RY8JKKOIkuti0.OrmJWnSFMTJICnOCodr1TBYms5cMpkmDEHu
ENbuYLRi0xudr0aH58H43YDVNXF83AtXRkkQLk2djJKUF3uCh6aspfxnyXBV
1SLNczTV0tie3EP22vA1qzomfA7AJdG4sUy93zooYZW8bCBCF5gGF40ePfON
nKXJZPDoePn2vAd9CIDooAD+Pxv.XA4nf9dQxE.pOaFr2AdiSiULv5J6G3WO
glMS1g3ND7DB9b8yK3wcQWCwBMFIB5zb3obQFC3H3F1E06OztZq7EcCR52DY
wXi2LRG3kkw5f5grWExJq8TVbb4hI1XGcA67aOvct5ANT+lQ+W1eCSPSE4Up
iSgOP0.Yi5jHXyx6nM497TpvtrrP2dy1l8cPNtx422.rRffc9w1FF8SJFu9O
QkPW0TxyHIHJ7TQ6.sRNneeaqP8PLgwq0cWW25BnJPro4LTF6U65J3ZiG6To
.1cJ3eXYIr7ckCp1c4.5nbB6pnq7E4dcqcQq+c2g5H2JQGUhdGsg01Jtlmuw
W4mf.OnNYSP2.Ww+JF1Plii5gqWhKwtGJZHXu61gW5DotWZuAGJ6hrgEUCO1
0Yyf2cSqx+5RMziL0rtArFxsBjZomgrqCOky57dwGrU7AGT7gaEeXQ7de3b6
KGYt8EV5kL6dyryOxLKra2YrOyoViSM54peNMCcsjnnDtbNE46fsTLE1+w5Y
Cku2si9bMalzpjF.GeNgGSiiyxs2LjtnN2dSGGzubGhu.VEPW0qrh7a7uRkt
rAbOEMrJU8ksbQ32ojqrT0a7TuVekE6p1iR45CbqC6HHL3nGwUUm3bcnjSfz
U99CLV5p9VmiMdeVN9sOFa94ui9De96RhXxAvC+Ld96ysHlEILyTwL3zqhIY
OJeAmxyBlUzpwjvjblUvj7SR.SxYV+RxmC4KOchVULpwHUq7OGhVQUhV4A8d
NohVUxaiTsh7+NQqJWc4mhpUWDs5hnUmDQqZRggrs2i9OUAoPAHms5nU4zlx
Wd.R9n6KdDUfCAidGZ4udPvlYpqraBI0pAwtG7Q3aBY0TOd0EY1tHy1EY1tH
y1EY19LIylZ6jVSS3u8KLlZKtR6at+57zEYiK2Pbw23Bz5MkFyxEIbp.fthO
x+qpRmpcK7lBz.S.xug.B+d.ga.f5a.iHM.NQlj4Z.bBLHw0ugv4bj27M.mn
F.GhA3zDcrwlj3je0i93HYRpC2DsQXSRdCaBfvmq4eLAnvsvQOQNc97hY9Uf
HgvZF8KZgGFzU8XBOcsTqVvYJSJ8OTYglMdBrJzXwhLstAKizh6ZMKMlkwWj
TnGCPN.RkbKbJr2k4TMOTpxz96s+AcmMxq.
-----------end_max5_patcher-----------

Re: bell lifted variables questions

Posted: Fri Jul 03, 2020 10:36 am
by andreaagostini
Hi,
I can confirm that the crash doesn't happen here, so that's good news.

As for your "left" example, you only need to put a pair of parentheses around your whole function code:

Code: Select all

$makeSeries = (
    $llll -> 
    (
      $harmser = ($fund, $numparitals, $stretch = 1. ->
      ($fund * arithmser(1, $numparitals) * $stretch) - (($fund * $stretch)-$fund).nth(1)
      );
      if $llll.nth(1) == 'hser' then (
      ## etc. etc.
      ).wrap(1)
    )
Best,
andrea