LonghronShen
【趣味编程】实现add(2)(3)这样的表达式

大家可以用自己熟悉的语言实现一段和如下JavaScript代码等价的程序。

<script>
function add(x)
{
var c = 0;
return function(x)
{
c = c + x;
arguments.callee.toString = function()
{
return c;
};
return arguments.callee;
}(x);
};
alert(add(2)(3)(4)(5));
</script>

亮点在于实现add(2)(3)(4)(5)这种诡异的语法……

LonghronShen
暂时没想到解法
展开Biu

纯C的话……暂时没想到解法……估计只能靠宏了……

[查看全文]
冥殇
zw蓝魔
LonghronShen
本帖最后由
展开Biu

本帖最后由 LonghronShen 于 2013-6-2 00:15 编辑

再来一个F#的版本……更加诡异……

let add a b = a + b

然后就可以写add(1)(2),返回是3……

这里写成看得懂的语法是:

let add a = fun b -> a + b

返回一个Lambda表达式,然后自动闭包捕获上一次的a……

不过,这个似乎还需要改进,还只能支持一次迭代。估计还是要封装到一个函数对象类吧……

[查看全文]
LonghronShen
这方案我也想到了
展开Biu

romanosovsky 发表于 2012-4-20 23:37

转代码。c++的

http://okmij.org/ftp/cpp-digest/Lambda-CPP-more.html

template

这方案我也想到了,这应该是比较好的方案之一,思路和我那个方案差不多。

[查看全文]
romanosovsky
本帖最后由
展开Biu

本帖最后由 romanosovsky 于 2012-4-20 23:40 编辑

转代码。c++的

http://okmij.org/ftp/cpp-digest/Lambda-CPP-more.html

template<typename T>

class CurryAdd {

T a;

public:

CurryAdd(const T a) { this->a = a; }

CurryAdd *本站禁止HTML标签噢* operator() (const T b) { return CurryAdd *本站禁止HTML标签噢* (a + b); }

operator T(void) { return a; }

};

template<typename T>

CurryAdd *本站禁止HTML标签噢* cadd(const T a) { return CurryAdd *本站禁止HTML标签噢* (a); }

main() {

cout << cadd(1) << endl;

cout << cadd(1)(2) << endl;

cout << cadd(1)(2)(3) << endl;

cout << cadd(3.4)(4.5) << endl;

cout << cadd(1)(3.5) << endl; // careful !

}

<和>被转成lt gt了@62#

[查看全文]
LonghronShen
这块什么意思
展开Biu

Flagalac 发表于 2012-4-20 22:20

(2)(3)(4)(5)

这块什么意思?理解不能~

其实Add函数返回的是一个函数对象,这个后面的括号是继续给函数对象提供参数……其实这是一个变相的递归调用,只不过不是很典型;这题目就是一个语法挑战,就是看看你如何在你熟悉的语言中实现这种效果。

[查看全文]
Flagalac
这块什么意思
展开Biu

(2)(3)(4)(5)

这块什么意思?理解不能~

[查看全文]