divide = smart_divide(divide(c,d))
не совсем хорошее описание того, что происходит. Посмотрите на логическое расширение шаг за шагом, в каком-то псевдо- Python:
divide(x, y)
= smart_divide(lambda c, d: c / d)(x, y)
= inner[func ~> lambda c, d: c / d](x, y)
= (def inner(a,b):
print("I am going to divide",a,"and",b)
if b == 0:
print("Whoops! cannot divide")
else:
return (lambda c, d: c / d)(a, b))(x, y)
= print("I am going to divide",a,"and",b)
if y == 0:
print("Whoops! cannot divide")
else:
return (lambda c, d: c / d)(x, y))
= print("I am going to divide",a,"and",b)
if y == 0:
print("Whoops! cannot divide")
else:
return x / y
Важное, что происходит, это лексическая область видимости . Если вы подставите выражение в другое выражение (операция ~>
выше), то вы предполагаете, что имена не будут искажены. То есть (lambda a: lambda b: a)(b))
не становится lambda b: b
, но (что-то эквивалентно) lambda b_prime: b
. Имена не имеют значения: это называется альфа-эквивалентность .