On 2018-09-04 14:26, Steven D'Aprano wrote: > I have this snippet of SML code which I'm trying to translate to Python: > > fun isqrt n = if n=0 then 0 > else let val r = isqrt (n/4) > in > if n < (2*r+1)^2 then 2*r > else 2*r+1 > end > > > I've tried reading up on SML and can't make heads or tails of the > "let...in...end" construct.
I don't know SML specifically, but my guess would be that let X = Y in A end means "A, evaluated in a local scope where X refers to Y". Reasoning: often (e.g. in JavaScript), 'let' sets something in a local scope, and I think Haskell has a construct like this? It's been a while since I played around with Haskell though... In an as-direct-as-possible Python translation, (lambda X=Y: A)() So, isqrt = (lambda n: 0 if n == 0 else (lambda r=isqrt(n//4): 2*r if n < (2*r+1)**2 else 2*r+1)()) This is obviously the same as your multi-expression function, with the addition of the integer division as suggested by Marko. Cheers, Thomas > > The best I've come up with is this: > > def isqrt(n): > if n == 0: > return 0 > else: > r = isqrt(n/4) > if n < (2*r+1)**2: > return 2*r > else: > return 2*r+1 > > but I don't understand the let ... in part so I'm not sure if I'm doing > it right. > > -- https://mail.python.org/mailman/listinfo/python-list