搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 1087|回复: 9
收起左侧

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

[复制链接]

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
发表于 2012-4-20 20:10:13 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
大家可以用自己熟悉的语言实现一段和如下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)这种诡异的语法……

评分

参与人数 1宅币 +20 贡献 +1 收起 理由
氺菓 + 20 + 1 o(* ̄▽ ̄*)ブ 发糖

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2012-4-20 20:15:26 | 显示全部楼层
本帖最后由 LonghronShen 于 2012-4-20 21:30 编辑

先来一份VB.NET的投机取巧解法
[mw_shl_code=vbnet,true]Namespace HelloWorld

    Module Main

        Public Class FuncEx(Of TArg, TResult)

            Private m_function As Func(Of TArg, TResult)

            Default Public ReadOnly Property [Function](ByVal x As TArg) As FuncEx(Of TArg, TResult)
                Get
                    Return New FuncEx(Of TArg, TResult)(Me.m_function, Me.m_function(x))
                End Get
            End Property

            Public Property LastResult() As TResult

            Public Sub New(ByVal f As Func(Of TArg, TResult), Optional ByVal lr As TResult = Nothing)
                Me.m_function = f
                Me.LastResult = lr
            End Sub

            Public Overrides Function ToString() As String
                Return Me.LastResult.ToString()
            End Function

        End Class

        Public Function add(ByVal x As Object) As FuncEx(Of Object, Object)
            Static c As Object = 0
            c = c + x
            Return New FuncEx(Of Object, Object)(
                Function(y As Object)
                    Return add(y)
                End Function, c)
        End Function

        Sub Main()
            Console.WriteLine(add(2)(3))
            Console.ReadKey(False)
        End Sub

    End Module

End Namespace[/mw_shl_code]
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

11

好友

3239

积分

序章

积分
3239
发表于 2012-4-20 22:20:08 | 显示全部楼层
(2)(3)(4)(5)
这块什么意思?理解不能~
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2012-4-20 23:24:14 | 显示全部楼层

其实Add函数返回的是一个函数对象,这个后面的括号是继续给函数对象提供参数……其实这是一个变相的递归调用,只不过不是很典型;这题目就是一个语法挑战,就是看看你如何在你熟悉的语言中实现这种效果。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

11

好友

1715

积分

Continue

积分
1715
发表于 2012-4-20 23:37:32 | 显示全部楼层
本帖最后由 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<T> operator() (const T b) { return CurryAdd<T>(a + b); }
       operator T(void) { return a; }
     };

     template<typename T>
     CurryAdd<T> cadd(const T a) { return CurryAdd<T>(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了
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2012-4-21 19:58:31 | 显示全部楼层
romanosovsky 发表于 2012-4-20 23:37
转代码。c++的
http://okmij.org/ftp/cpp-digest/Lambda-CPP-more.html
template

这方案我也想到了,这应该是比较好的方案之一,思路和我那个方案差不多。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2013-6-1 23:50:11 | 显示全部楼层
本帖最后由 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……
不过,这个似乎还需要改进,还只能支持一次迭代。估计还是要封装到一个函数对象类吧……
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

18

好友

3311

积分

序章

积分
3311
发表于 2013-7-4 21:56:41 | 显示全部楼层
先收藏
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

15

好友

4381

积分

序章

积分
4381
发表于 2013-7-5 13:52:43 | 显示全部楼层
能用c不?
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

5

好友

1441

积分

Continue

积分
1441
 楼主| 发表于 2013-12-19 14:58:57 | 显示全部楼层
纯C的话……暂时没想到解法……估计只能靠宏了……
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-5-1 08:05 , Processed in 0.133679 second(s), 33 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表