duangsuse::Echo
583 subscribers
4.12K photos
118 videos
579 files
6.13K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#CS #PL #FP #Tuby #PHP 说到现在广为资磁🐸的 Lambda(排除 Scheme 等真正依赖真正的 Lambda 的之外),

我们就来看看 🌶🐔 #Python 吧。

如果你给 Python2 一个这样的 Lambda 表达式:

(global scope)
a = 1
l = lambda: a
print(l())
# 1
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
l = ->() { a = 2 }
l.call() #=> 2
a #=> 2

正好符合我们对『a = 2 语义』的预期,Ruby 就是这样,代码块就是代码上下文中的一部分,不是独立的语法糖。
从侧面反映了 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 的杂交体...

为什么
,你们猜? 🌚
还是说...