随笔-42  评论-306  文章-11  trackbacks-2

写惯了Java、C#这样的命令式编程语言的程序员们,是否有兴趣尝试一下这个.Net平台下的函数式编程语言呢?
Cat Language,是一个基于栈的函数式语言,可以运行在.Net和Mono平台上,它的解释器是用C#编写的,
总共的代码量大概在15K,你大可尝试去分析一下这些代码,兴许会对函数式编程的原理有一些深入的了解呢。
废话少说,先展示一个函数式语言的Fibonacci
define fib(n)
{ n 1 <= [n] [n 1 - fib n 2 - fib +] if }

扎眼一看,难道这是天书吗?
静下心来,仔细分析一下:
基于栈的表达式,应该是后序表达式,一步一步对这个表达式进行分析:
n 1 <= ⇒ n <= 1 
n 1 <= [n] ⇒ n <= 1时 返回n
n 1 <= [n] [n 1 - fib n 2 - fib +] if,可以解释为:
if n <= 1
    返回 n
else
    返回 n 1 - fib n 2 - fib +
而n 1 - fib n 2 - fib +  则是fib(n-1) + fib(n-2)。
好了,整个表达式转换为命令式编程语言就是这样的:

int fib(int n)
{
    
if (n <= 1)
        
return 1;
    
else
        
return fib(n - 1+ fib(n - 2);
}

一行代码和四行代码,区别就是这么的大。
有没有兴趣尝试一下,http://code.google.com/p/cat-language/
最后附上一张我的截图:

posted on 2007-11-28 21:12 Game_over 阅读(2239) 评论(23)  编辑 收藏

评论:
#1楼  2007-11-28 21:16 | JesseZhao      
绝对天书
不知道我下辈子能不能看懂
  回复  引用  查看    
#2楼  2007-11-28 21:29 | 米开朗基罗      
楼主的骨哥拼音很有型啊。
  回复  引用  查看    
#3楼 [楼主] 2007-11-28 21:34 | Game_over      
@米开朗基罗
呵呵,见笑了。
支持Google。
  回复  引用  查看    
#4楼  2007-11-28 22:22 | 小鬼00 [未注册用户]
谢谢,太喜欢这样的东东了。
  回复  引用    
#5楼  2007-11-28 22:23 | je [未注册用户]
不过在这在例子上没用到中文,
骨哥拼音没用到。呼呼呼
  回复  引用    
#6楼  2007-11-28 22:23 | je [未注册用户]
MS不已经出了f#了吗
  回复  引用    
#7楼  2007-11-28 22:26 | zzz [未注册用户]
lambda也可以很好工作啊
  回复  引用    
#8楼  2007-11-28 23:20 | Muse      
很不喜欢函数式编程语言,原因很简单:看不懂!
函数式编程具有可以充分利用你的数学知识,可以充分发挥计算机的计算能力等好处,但是对于我这个数学不怎么样,做了这么多年的命令式编程的人来说,还是命令式编程好懂啊!

  回复  引用  查看    
#9楼  2007-11-28 23:38 | 路西菲尔 [未注册用户]
还是用F#吧
  回复  引用    
#10楼  2007-11-29 09:41 | ddss [未注册用户]
感觉像前缀表达式
  回复  引用    
#11楼  2007-11-29 09:43 | 木野狐(Neil Chen)      
lisp
  回复  引用  查看    
#12楼  2007-11-29 09:55 | idior      
用函数式,Fibonacci显然应该用迭代实现。
  回复  引用  查看    
#13楼  2007-11-29 10:09 | Adrian H.      
F#.. absolutely the best FP language...
  回复  引用  查看    
#14楼  2007-11-29 10:45 | Enzo      
@JesseZhao
那么我们开天眼,看穿它 呵呵
  回复  引用  查看    
#15楼  2007-11-29 11:57 | 沐枫      
这种逆波兰表达式,实在是有点反人类。
  回复  引用  查看    
#16楼  2007-11-29 12:07 | Amnoh      
为什么要故意把if...else...写成
{ n 1 <= [n] [n 1 - fib n 2 - fib +] if }
呢???
为了效率还是为了让别人看不懂?
如果为了效率,直接在硬盘上雕刻程序才彻底。。。
  回复  引用  查看    
#17楼  2007-11-29 13:21 | woog      
天啊,看了一次天书。。。开开眼界。
  回复  引用  查看    
#18楼  2007-11-29 23:44 | 路过 [未注册用户]
就这个例子来说,没感觉函数式编程有啥好的。c语言可以玩出很多精妙的技巧,但是好的书都会告诉你要把代码写的清晰,一行代码只做一件事情。
这个例子里,一不留神就输错咯。看清楚不容易,查错更不容易。
  回复  引用    
#19楼  2007-11-30 16:59 | 天方      
--引用--------------------------------------------------
沐枫: 这种逆波兰表达式,实在是有点反人类。
--------------------------------------------------------
但计算机使用起来方便,毕竟目前机器的思维和人的思维不一样。
  回复  引用  查看    
#20楼 [楼主] 2007-12-01 14:40 | Game_over      
--引用--------------------------------------------------
天方: --引用--------------------------------------------------
沐枫: 这种逆波兰表达式,实在是有点反人类。
--------------------------------------------------------
但计算机使用起来方便,毕竟目前机器的思维和人的思维不一样。
--------------------------------------------------------

程序员首先要明白的就是计算机最容易理解的代码是什么形式的。
  回复  引用  查看    
#21楼  2007-12-20 10:51 | Michael先生      
其实也不足为怪,
逆波兰表达式就是后缀表达式,
一般来说形式为:{操作数,操作数,操作符 }。
理解了编译原理,明白了操作数和操作符栈就比较明白一般计算是如何进行了。

因为我们所有的人几乎都习惯了中缀表达式这种方式,所以对于后缀表达式难以接受。

而对于后缀表达式我个人认为最大优点就是程序可以写的很简练,而且对于学习编译原理这门课还是很有帮助的。

大家不必抵触,习惯成自然,就如当初大家都习惯于C语言编程,当C++出现以后,大家都觉得C太死板了,比如声明函数中的变量必须在函数头声明等。
  回复  引用  查看    
#22楼  2007-12-21 14:13 | SZW      
而n 1 - fib n 2 - fib + 则是fib(n-1) + fib(n-2)。
==================
让我想起了高中出去比赛时候还要背的那些表达式,呵呵
  回复  引用  查看    
#23楼  2008-02-28 10:22 | Jeason      
太难用了,还是观望观望,作为解释性语言,门槛高了一些,不知道作者的初衷是什么,呵呵

  回复  引用  查看    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      


相关链接: