- 论坛徽章:
- 2
|
回复 221# starwing83
先说让我爬起来回帖的原因……
问题出在:
- (let ((x 12))
- ( (lambda () (set! x 26)) ) ; 匿名函数调用
- x )
复制代码 如果是词法作用域,3个x是同一个,最终结果是26。
如果像C++那样,其实是lambda内复制了一份,然后改变这份copy,不能影响外层的值。最终结果是12。
尤其是当外层没有绑定时……
- ( (lambda () (set! x 26) )
复制代码 会怎样?
回到你前面那个:如何共享的问题。
C++,capture by value,无法共享:
- int i = 12;
- for_each(beg, end, [](int x)->void { cout<<x+i; } );
复制代码 但可以通过指针:
- int sum = 0;
- reference_wrapper<int> sum_ = sum;
- for_each(beg, end, [](int x)->void { sum_+=x } );
复制代码 或者是gc,这就与lua里的行为很像了:
- int sum = 0;
- gc<int> sum_ = sum; // boxing
- for_each(beg, end, [](int)->void { sum_+=x; } );
- // sum = sum_;
复制代码 但应用于全局的问题就是,得先有一个东西才能reference_wrapper……
217楼提到的想干掉的声明就是指这个。
C++的lambda除了capture by val还可以capture by ref。
就与上面的reference_wrapper一样了,显式地创建一个,但要自己保证生命期不会超出。
- int sum = 0;
- for_each(beg, end, [&](int x)->void { sum+=x } );
复制代码 by ref可以通过by val表达,但对顶层就行不通……
是仅对顶层开漏洞,不需要显式地使用reference_wrapper:
- ; (lambda ()
- (let ((x 12))
- (define X x)
- (define F (lambda (y) (+ x y))))
- ; )
复制代码 还是(这其实就不止一种作用域了):
- ; (lambda ()
- (capture-by-ref (F X)
- (let ((x 12))
- (set! X x)
- (set! F (lambda (y) (+ x y)))))
- ; )
复制代码 还是其他方案?
而且我一直都在被你提到的那个lua代码困扰:
local x,y,z = ... --> 写arg应该也可以吧?
要怎样才能让代码描述出模块入口点是个3元函数呢……
又要声明吗?
|
|