- 论坛徽章:
- 0
|
本帖最后由 琳琳的小狗 于 2012-02-28 11:40 编辑
回复 30# OwnWaterloo
其实绕到最后,兄台挖了个坑自己跳下去了。还记得最初的讨论焦点么?导火索来自于《Ruby元编程》中作者有利用Ruby语法优势贬低其他语言(如C++、以及Lisp)的嫌疑。现在回头看看,不正是以FP语言之长来对比Ruby的短板么?
Ruby社区以Pragmatic为宗旨,属于实战派,相比Lisp这种学院派的风格来说,的确是不太一样(当然,你也可以说是因为FP另类)。面向对象语言之所以获得大多数人的关注,其中最大的一个原因就是他尽力去模拟现实生活中的事物,比较符合人类的心智模型,要不然FP这么优雅高级,怎么就流行不起来呢?lua还好点,恕在下孤陋寡闻,还真没在多少场合下见到Lisp的大规模应用。俗话说“工欲善其事,必先利其器”,就那我最熟悉的Web应用开发,以及自动化测试来讲,使用Ruby这类动态语言才是最佳选择。
感觉OO实在是被妖魔化了,如果真如某些人所言,那怎么有这么多语言都以此为卖点?比如javascript,还有风头正旺的Objective C,为何不搞成纯FP呢?个人认为,FP太过于抽象的思维是其受阻的最大原因,另一个原因就是源代码的可读性,Lisp那括号语法,以及前缀表达式,都给初学者带来了不小的障碍。还记得SICP第一章的导言么?作者是这么说的:“程序是写给人看的,机器顺便执行”。同样的道理,映射到Ruby中来,方法调用可省略括号、各种操作符比如加号的语法糖,无一不是为了实现整洁、易读的代码而设计的,《Ruby元编程》一书中指代的“程序员友好”就在这里。
至于我的回帖中引入Ruby实现的Lisp解释器,仅仅只是想说明,如果你愿意,使用这种带有一定约束条件的内部DSL,也是完全可以实现FP那些特性的。但是,可以归可以,为什么没人去这么干呢?这是个问题。Rubyist一般都会采取最简单的办法来实现手头的任务,如果开发过程中,真要我去实现一个map,那我顶多这么做:- def map(operate, *args)
- args.shift.zip(*args).map {|pair| pair.reduce operate}
- end
- p (map :+, [1, 2, 3], [4, 5, 6], [7, 8, 9]) #输出[12, 15, 18]
- p (map :push, [[1, 2],[3,4]], [5,6], [7, 8]) #输出[[1, 2, 5, 7], [3, 4, 6, 8]]
复制代码 的确,正如你说,利用了zip和reduce,但是就API的使用者而言,真的有区别么?拿BDD的理论来比拟,客户是关注你软件的内部实现细节,还是更关注于产品的功能和行为?
大乘佛藏经虽然牛逼,可以普度众生,还不是需要唐僧师徒一行远涉万里西天取经么?同理,如果没有人推广传授,FP可能永远都是实验室那些科学怪人们的小蜜,仅此而已。所以我倒是觉得,其他语言能借鉴其中好的思想,并将其应用到实战总来,这绝对是有百益而无一害的好事情。他山之石可以攻玉,在Ruby社区这样一个满怀包容性、以及上进心的生态环境中,作为其中的一员,我很欣慰。还是那句老话,切莫跑题,先抛弃成见,就这本书的内容进行展开讨论吧:) |
|