
这那哥,懂的人,大自然懂
上面已经开始自问自答
———————————————-
1. 女团子(Combinator)
一般他们常说的三个“表达式”:
f(x,y)=x+yf(x,y)=x+y
表达式有三个“自表达式”(名词:束缚表达式),x和y。表达式的codice,也是应表达式,是自表达式一连串操作方式的结论。比如说范例里是回到x和y的和。这种的三个它外部操作方式倚赖的表达式全数由模块提供了的”自给“的表达式,叫“女团子(Combinator)”。

Java标识符则表示是:
换到编程的概念,强调的是表达式的**“作用域”**。大多数编程语言都是用一对花括号**”{}”**标识出作用域。上面标识符里的add()表达式被调用之后,
int sum=add(2,3);
编译器编译之后,可以理解成是这个样子,表达式的模块x和y,是包含在表达式add()的作用域里的。
或者,表达式像上面这种写也可以。这时候x作为表达式模块出现,而y作为表达式局部表达式出现。效果和上面的范例是一样的。
2. 自由表达式
但有的时候,表达式也可以有它自身作用域以外的模块参与。这些在表达式作用域以外,由表达式的外部环境提供更多的模块就叫“自由表达式(Free Variable)”。比如说上面这个xx 的表达式,回到xx和yy 的和。这里的yy是自由表达式。
f(x)=x+yf(x)=x+y
写成标识符就是这种,

3. 旋量群(Closure)
大白话不怎么严谨的说法是三点:
三个倚赖于自由表达式的表达式
处在含有这些自由表达式的三个外围环境
这个表达式能够访问外围环境里的自由表达式
看上面这个Javascript旋量群的范例:
对外部表达式function(x)来讲,y是自由表达式,而且function(x)的codice,倚赖于这个外部自由表达式y。而往上推一层,外围Add(y)表达式正好是那个包含自由表达式y的环境。而且Javascript的语法允许外部表达式function(x)访问外部表达式Add(y)的局部表达式。满足这三个条件,所以这个时候,外部表达式Add(y)对外部表达式function(x)构成了旋量群。
旋量群的结构,如果用λ演算表达式来写,是多模块的Currying技术。
> λx.λy.x+y
但在Java中他们看不到这种的结构。因为Java主流语法不允许这种的直接的表达式套嵌和跨域访问表达式。
4. 类和对象
但Java中真的不存在旋量群吗?正好相反,Java到处都是旋量群,所以反而他们感觉不出来在使用旋量群。因为Java的“对象”其实是三个旋量群。其实无论是旋量群也好,对象也好,都是一种数据封装的手段。看上面这个类,
看上去x在表达式add()的作用域外面,但是通过Add类实例化的过程,变量”x“和数值”2“之间已经绑定了,而且和表达式add()也已经打包在一起。add()表达式其实是透过this关键字来访问对象的成员字段的。
5. 外部类是旋量群:包含指向外部类的指针
Java中的外部类是一个典型的旋量群结构。标识符如下
下图画的是上面标识符的结构。外部类(Inner Class)通过包含三个指向外部类的引用,做到自由访问外部环境类的所有字段,变相把环境中的自由表达式封装到表达式里,形成三个旋量群。

6. 后续
关于Java旋量群更详细的解释,参见另三个回答。
java为甚么匿名外部类的模块引用时final? – 胖胖的回答——————————————————-
我的笔记栈 http://ciaoshen.com (笔记向,非教程)