```void Swap(int a, int b)
{
int t = a;
a = b;
b = t;
}

int main()
{
int a=0;
int b=1;
Swap(a, b);
printf("%d, %d", a, b);
}```

```int Add(int a, int b)
{
return a + b;
}

int Choose(bool first, int a, int b)
{
return first ? a : b;
}

int main()
{
printf("%d", r);
}```

```int Set(int a, int b, int c, int d)
{
a += b;
a += c;
a += d;
}

int main()
{
int i = 0;
int x[3] = {1, 2, 3};
Set(x[i++], 10, 100, 1000);
printf("%d, %d, %d, %d", x[0], x[1], x[2], i);
}```

```x[i++] += 10;
x[i++] += 100;
x[i++] += 1000;```

```Action<int> SetX()
{
int x = 0;
return (int n)=>
{
x = n;
};
}

void Main()
{
int x = 10;
var setX = SetX();
setX(20);
Console.WriteLine(x);
}```

=======================我是背景知识的分割线=======================

```function pair(a, b) {
return function(c) {
return c(a, b);
};
}

function first(a, b) {
return a;
}

function second(a, b) {
return b;
}

var p = pair(1, pair(2, 3));
var a = p(first);
var b = p(second)(first);
var c = p(second)(second);
print(a, b, c);```

```var p = pair(1, pair(2, 3));
var a = p(first);

// ↓↓↓↓↓

var p = function(c) {
return c(1, pair(2, 3));
};
var a = p(first);

// ↓↓↓↓↓

var a = first(1, pair(2, 3));

// ↓↓↓↓↓

var a = 1;```

```var p = {
first : 1,
second : {
first : 1,
second : 2,
}
};

var a = p.first;
var b = p.second.first;
var c = p.second.second;```

```// 在这里我们继续使用上面的pair、first和second函数

function mutable_pair(a, b) {
return function(c) {
var x = c(a, b);
// 这里我们把pair当链表用，一个(1, 2, 3)的链表会被储存为pair(1, pair(2, pair(3, null)))
a = x(second)(first);
b = x(second)(second)(first);
return x(first);
};
}

function get_first(a, b) {
return pair(a, pair(a, pair(b, null)));
}

function get_second(a, b) {
return pair(b, pair(a, pair(b, null)));
}

function set_first(value) {
return function(a, b) {
return pair(undefined, pair(value, pair(b, null)));
};
}

function set_second(value) {
return function(a, b) {
return pair(undefined, pair(a, pair(value, null)));
};
}

var p = mutable_pair(1, 2);
var a = p(get_first);
var b = p(get_second);
print(a, b);
p(set_first(3));
p(set_second(4));
var c = p(get_first);
var d = p(get_second);
print(c, d);```

```var p = mutable_pair(1, 2);
p(set_first(3));

// ↓↓↓↓↓

p = return function(c) {
var x = c(1, 2);
a = x(second)(first);
b = x(second)(second)(first);
return x(first);
};
p(set_first(3));

// ↓↓↓↓↓

var x = set_first(3)(1, 2);
p.a = x(second)(first); // 这里的a和b是p的闭包内包含的上下文的变量了，所以这么写会清楚一点
p.b = x(second)(second)(first);
// return x(first);出来的值没人要，所以省略掉。```
```
// ↓↓↓↓↓

var x = (function(a, b) {
return pair(undefined, pair(3, pair(b, null)));
})(1, 2);
p.a = x(second)(first);
p.b = x(second)(second)(first);

// ↓↓↓↓↓

x = pair(undefined, pair(3, pair(2, null)));
p.a = x(second)(first);
p.b = x(second)(second)(first);

// ↓↓↓↓↓

p.a = 3;
p.b = 2;```

```function rectangle(a, b) {
this.width = a;
this.height = height;
}

rectangle.prototype.get_area = function() {
return this.width * this.height;
};

var r = new rectangle(3, 4);
print(r.get_area());```

`obj.method(args)`

```var x = r.get_area;
print(x());```

```class Rectangle
{
public int width;
public int height;

public int GetArea()
{
return width * height;
}
};```

```var r = new Rectangle
{
width = 3;
height = 4;
};

// 第一段代码
Console.WriteLine(r.GetArea());

// 第二段代码
Func<int> x = r.GetArea;
Console.WriteLine(x());```

```Func<int> x = ()=>
{
return r.GetArea();
};
Console.WriteLine(x());```

```function mutable_pair(a, b) {
_this = {
get_first = function() { return a; },
get_second = function() { return b; },
set_first = function(value) { a = value; },
set_second = function(value) { b = value; }
};    return _this;
}

var p = new mutable_pair(1, 2);
var a = p.get_first();
var b = p.get_second();
print(a, b);
var c = p.set_first(3);
var d = p.set_second(4);
print(c, d);```

```var x = p.set_first;
var y = p.set_second;
x(3);
y(4);```

1. 阅读C语言的复杂的声明语法
2. 什么是语法噪音
3. 什么是语法的一致性
4. C++的const的意思
5. C#的struct和property的问题
6. C++的多重继承
7. 封装到底意味着什么
8. 为什么exception要比error code写起来干净、容易维护而且不需要太多的沟通
9. 为什么C#的有些interface应该表达为concept
10. 模板和模板元编程
11. 协变和逆变
12. type rich programming
13. OO的消息发送的含义
14. 虚函数表是如何实现的
15. 什么是OO里面的类型扩展开放/封闭与逻辑扩展开放/封闭
16. visitor模式如何逆转类型和逻辑的扩展和封闭
17. CPS（continuation passing style）变换与异步调用的异常处理的关系
18. CPS如何让exception变成error code
19. argument passing和symbol resolving
20. 如何用lambda实现mutable struct和immutable struct
21. 如何用lambda实现interface

posted on 2013-07-05 06:31 陈梓瀚(vczh) 阅读(9035) 评论(12)  编辑 收藏 引用 所属分类: 启示

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-07-05 22:58 | OpenGG
function MutablePair(a, b) {
var _this = {
get_first: function() { return a; },
get_second: function() { return b; },
set_first: function(value) { a = value; },
set_second: function(value) { b = value; }
};
return _this;
}

var p = new MutablePair(1, 2);
var q = new MutablePair(1, 2);
console.log(p.get_first === q.get_first);  回复  更多评论

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-07-06 01:35 | 陈梓瀚(vczh)
@OpenGG
false，因为p.get_first和q.get_first返回的是不同来源的东西，所以是两个不同的函数。  回复  更多评论

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-07-06 04:13 | 溪流

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-07-07 18:30 | up
call by name不是Ada，是Alogl使用的一种方式，它出现的非常早。Fortran（原始的）的所有参数都是call by ref的，实际上，call by ref出现的比call by value早。call by value应该是最受限的一种方式了。实际上，语言发展的历史可以看作是各种设施能力不断被限制的历史。  回复  更多评论

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-07-18 04:09 | rink1969
call by name 那个包袱抖的不错
mutable的数据结构设计，果然跟求导有些像  回复  更多评论

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-07-24 00:08 | Scan

function pair(a, b)
return function(accessor, isSetter)
if isSetter then a, b = accessor(a, b)
else return accessor(a, b) end
end
end
function get_first(pair)
return pair(function(a, b) return a end)
end
function get_second(pair)
return pair(function(a, b) return b end)
end
function set_first(pair, v)
pair(function(a, b) return v, b end, true)
end
function set_second(pair, v)
pair(function(a, b) return a, v end, true)
end

local p = pair(1, 2)
print(get_first(p))
print(get_second(p))
set_first(p, 3)
print(get_first(p))
print(get_second(p))
回复  更多评论

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface[未登录] 2013-07-24 00:56 | 陈梓瀚(vczh)
@Scan

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-10-24 06:38 | SLiang

function mutable_pair(a, b) {
_this = {
get_first : function() { return a; },
get_second : function() { return b; },
set_first : function(value) { a = value; },
set_second : function(value) { b = value; }
};
return _this;
}

var p = new mutable_pair(1, 2);
var x = p.set_first
x(4)
var k = p.get_first();

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-10-24 06:59 | SLiang

var p = new mutable_pair(1, 2);

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2013-10-24 22:59 | 陈梓瀚(vczh)
@SLiang
js的继承怎么写现在大家都有相当的讨论了，你去搜一搜应该会比我告诉你的更全面。你还可以看看TypeScript，看他是怎么生成继承的js代码的。  回复  更多评论

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface[未登录] 2013-11-10 03:51 | patz
> 大家到这里大概已经明白闭包、lambda表达式和interface之间的关系了吧。

# re: 如何设计一门语言（七）&mdash;&mdash;闭包、lambda和interface 2014-03-04 03:44 | nic
call by need 是求值顺序,怎么和传参混在一块说  回复  更多评论