#CS #PL #FP #Tuby #PHP 说到现在广为资磁🐸的 Lambda(排除 Scheme 等真正依赖真正的 Lambda 的之外),
我们就来看看 🌶🐔 #Python 吧。
如果你给 Python2 一个这样的 Lambda 表达式:
(global scope)
SyntaxError: can't assign to lambda
这是怎么实现的,我想不是重点,但是 Ruby 里的确可以这么做,反观 Java 8 引入的 Lambda(Coin 项目的?哦好像就叫 Lambda 项目...),也不能『assign』
它要引入的变量,全都得是 "effective final",要不然就是『无效引用』了?为什么?其实这和程序设计语言语义背后的存储,关于值和引用之类的东西有关...
从侧面反映了 Ruby 不仅比 Python 更可读(拟态方法 vs. __init__ __ge__ 这种让人丈二和尚摸不着头脑的奇葩名字,还有反直觉的类定义项引用名字里 __ 前缀的含义),而且更函数式(跑
欸这么做啊就有一个好,我们知道 Python 是实现了 Lexical scoping(嵌套序作用域) 的,要不然也不能这样定义这个函数:
Python 认为 Lambda 是什么呢? 它认为 Lambda 是一种 function...
欸 Python 实在是混乱邪恶... 像是 Ruby 和 Lua 的杂交体...
为什么,你们猜? 🌚
还是说...
我们就来看看 🌶🐔 #Python 吧。
如果你给 Python2 一个这样的 Lambda 表达式:
(global scope)
a = 1# 1
l = lambda: a
print(l())
compile('l=lambda: a=2', '<lambda-assign-test>', 'single')#!> File "<lambda-assign-test>", line 1
SyntaxError: can't assign to lambda
这是怎么实现的,我想不是重点,但是 Ruby 里的确可以这么做,反观 Java 8 引入的 Lambda(Coin 项目的?哦好像就叫 Lambda 项目...),也不能『assign』
它要引入的变量,全都得是 "effective final",要不然就是『无效引用』了?为什么?其实这和程序设计语言语义背后的存储,关于值和引用之类的东西有关...
a = 1正好符合我们对『a = 2 语义』的预期,Ruby 就是这样,代码块就是代码上下文中的一部分,不是独立的语法糖。
l = ->() { a = 2 }
l.call() #=> 2
a #=> 2
从侧面反映了 Ruby 不仅比 Python 更可读(拟态方法 vs. __init__ __ge__ 这种让人丈二和尚摸不着头脑的奇葩名字,还有反直觉的类定义项引用名字里 __ 前缀的含义),而且更函数式(跑
欸这么做啊就有一个好,我们知道 Python 是实现了 Lexical scoping(嵌套序作用域) 的,要不然也不能这样定义这个函数:
def compose2(fn): return lambda x: lambda y: fn(x, y)并且这样使用
compose2(print)(1)(2)如果 Python 是 dynamic scoping(时序作用域)维护着符号表栈的话,
def get_a(): return a
a=1
get_a() #=> 1
def foo():
a=2; return get_a()
foo() #=> 1
foo()
的 a 定义就要覆盖掉 global scope 里的 a 定义了(反正这里就是一层函数调用一个作用域,还有一个 global scope)Python 认为 Lambda 是什么呢? 它认为 Lambda 是一种 function...
欸 Python 实在是混乱邪恶... 像是 Ruby 和 Lua 的杂交体...
为什么,你们猜? 🌚
还是说...