R*n
2 楼
【 以下文字转载自 SanFrancisco 讨论区 】
发信人: RichPerson (我爱中科大~ 赚钱专业户~), 信区: SanFrancisco
标 题: 影评《让子弹飞》的暗线,隐喻。豆瓣浏览达8万多人的帖子
发信站: BBS 未名空间站 (Thu Dec 23 23:58:03 2010, 美东)
“由于对姜文过于卑躬屈膝,厚颜无耻的吹捧,该影评已被和谐。”
这句是我在去看电影之前,已经准备好的影评(还是抄来的)。
吾辈俗人,花钱去影院只图消遣。回来吹吹水,网上吐吐槽。严肃客观的
评价电影于我如浮云,就是带着这么强烈的偏见去看的电影。国产片导演就那么几位。
考虑到他们近年的发挥惊人地稳定, 吾辈观影前,早已选择好了态度。
比如赵氏孤儿,陈凯歌肯定给我们带来悲剧。他就活在自己的那点小悲剧情怀里
,老想拍一悲剧,还肯定又玩现了,整个一纯悲剧。我们买了电影票,聚精会神地盯着
屏幕,唯恐事后骂得不够尖刻戏谑不够振聋发聩。 再比如让子弹飞, 姜文肯定给我们
带来惊喜。我们买了电影票,就等着让他TMD给我们翻译翻译什么叫TMD的惊喜。 看不
懂,就说这片真有深度,可惜太小众了。 看懂了,便把他当神来捧,唯恐自己的态度
不够卑贱,拜倒得不够迅猛。 只恨“愿为姜文门下走狗”这种结构已在王小波徐文长
身上用滥了。
人总是渴求被认同。所谓“人生得一知己,死而无憾”,描绘的就是这种
渴求被满足时的快感。人性若此,无以抗衡。这群大导演大玩家,亦不能脱俗,只是口
味略有偏好。冯小刚张艺谋什么的活明白了,追求票房认同。陈凯歌自负才华,追求带
点文艺腔的装B青年的认同。吾辈小装青年,层次低,为与不装B的大众拉开差距,大家
紧紧抱成鸡蛋状,追求蛋内认同,人称蛋同。还有些大装青年,最爱唱反调,追求与小
装们拉开差距,显得层次高,自会有人贴过来膜拜他们,叫他们大神。
姜文拍电影,也图个被认同。他的四部风格各异的电影,都有强烈的自我
表达欲望。每一个片中的“我”,包括夏雨演的,都是他内心的部分投射。其前三部电
影表现出来的选本、选角的眼光,节奏、镜头的把握,讲故事谈思想的水平等硬实力,
在吾等小青年心中已然封神入圣。但姜文不满足,他追求更广阔的认同。《鬼来》被禁
,《太阳》票房不佳,这些不认同的声音在姜文心里絮絮叨叨挥之不去。
两年多后,姜文射出来的,是经过精心构化,寻求破局的子弹。他的野心是得到同
行,大众,小青年,大神和官府共同的认同。一言以蔽之:
我姜文,“站着”也能把钱赚了。
我从没见过国产导演有如此之大的野心,这野心听起来又如此的不可实现
。同行是冤家,小青年想脱离大众,大神要高于小青年。 最重要的是,官府认同的,
小青年和大神就不认同。大众同行还算容易同时取悦。但小青年,大神和官府这三群,
在态度上冰炭不容。
现实正是如此,在官府放行,喉舌大赞之后,电影自身素质迅速赢得了同
行和大众的青睐。 广大小装青年们在短暂的观望后,看到宁财神同学的一句“姜文王
朝来了!”后立即拜倒投诚。罗永浩,今何在等大神迫不及待地跟跳出来,“日,评价
这么高,不至于吧。(这电影没啥思想啊)”,“下次拍个更有追求的电影”,“你们
到底为什么激动啊”。 更极端一些的人开始咒骂,“姜文背叛了我们背叛了理想,腐
化了拜金了追求票房了”。“站着,也能挣钱”这种事在他们眼里是没门的。 “你媚
俗了大众,让大家都看的懂,你就已经跪下了。”“你媚俗了官府,不玩政治讽刺了,
你就已经跪下了!”。
连我这个不合群的小装青年,看完后也充满了疑惑。前两小时被导演带着
高速狂飙,爽透了,结尾的节奏变化却让我无所适从。张麻子打倒了黄四郎, 最后却
一无所得,兄弟女人也离他远去。他骑着白马缓缓离去的场景让我十分落寞。虽然最后
的那场“起义”倾向危险…但这就是姜文电影里想说的么?
子弹呼啸而来,透体而过,我却没一点感觉,好像没打中一样。搞的我连影评都不
想写了。
姜文说:“让子弹飞一会儿”。
电影的开头,张麻子对着白马开了一枪,这枪瞄准绳结,打中却不打断。
白马继续跑,绳索已不能吃力。让“子弹飞了一会”,绳索终于断裂,白马才四散跑开
。电影的结尾,姜文对我开了一枪。 白马在我脑中奔驰一夜一天,绳索终于断裂, 我
才舒服了。
如果你看见了那思绪拖出来的暗线,就会明白宁财神说错了。“姜文的王朝,永远
不会到来”
影评这么多,吐槽点最多的就是周润发饰演的黄四郎了。这个地主恶霸,说单词,
玩“介错”,还总要拽拽文,钱也多的离谱。这些特质可笑,不必要,也不合理。 但
揭开暗线的线索,就在于这些“不合理”。 影片的暗线,几乎都巧妙得埋在笑料之下。
问题1:故事发生在什么时间? 1920.
葛优演的马县长,在刚进鹅城不久就说:“不好,我们来晚了,前任县长已经把税
预征到90年后了,都到2010年了”。 原著中故事发生在193X年,是姜文特意改到1920
年的。
问题2:黄四郎只是个地主恶霸么? 没那么简单
黄四郎交给假麻子(胡军)地雷时,说了很多:“北中国我不知道,但这种限量版
地雷,整个南国只有两个”;“第一个在辛亥革命时炸了第一响”;“惊天,动地,还
泣鬼神”;“1910,made in U.S”
辛亥革命发生于1911年,这1910年才生产。 黄四郎不但知道辛亥革命的地雷是什
么型号,还拥有唯一一颗双胞胎地雷。 请问,黄四郎在辛亥革命中,发挥了什么作用?
黄四郎参与了在武昌起义的核心策划,是辛亥革命的老资格革命党!不信?下面还
有佐证
问题3:张麻子只是个土匪么? 当然不是
电影里很明白的说了, 张牧之,早年追随松坡将军(蔡锷),17岁时即为其麾下
手枪队长。是讲武堂出来的(考虑到蔡锷,应为1909年成立的云南陆军讲武堂)。蔡锷
在日本死后(1916),张牧之回国,落草。
蔡锷何人?梁启超高徒,民国开国元勋,护国军神。 1911年辛亥武昌起义后20日
,蔡锷就在云南发动重九起义响应革命。1915年又发动护国讨袁并取得胜利。张牧之早
年即追随他,也算是 辛亥革命党对老资格。
张牧之和黄四郎还曾是革命战友? 影片给出了明显的线索
问题4:1900的一面之缘?
张牧之与马邦德赴黄四郎的鸿门宴时, 黄四郎说。“20年前,我和张麻子曾有一
面之缘”。从影片可以看出,黄四郎一开始就知道假县长就是张牧之就是张麻子。这句
一面之缘,是他刻意点开的敲山震虎。影片确凿的发生在1920年。 20年前就是1900年。
黄四郎和张牧之在这一年见过面? 那一年发生了什么? 我们继续从张17岁当上蔡
锷手枪队长入手。
问题是,张牧之现在多少岁,又是那一年遇上蔡锷的呢?
蔡锷1882年12月出生,1899年在时务学堂的老师唐才常德资助下赴日本留学,1904
年毕业于日本陆军士官学校毕业。 回国后先后在湖南广西云南等地练兵。
如果张是1904年后见到的蔡锷,那么1900年时张牧之不超过13岁。 这样的孩子不
应引起黄四郎的注意。且1920年时33岁,似乎又嫩了一些。蔡锷活到此时也不过三十七
岁。 1899年之前的蔡锷不过是个16岁不到的学生,虽然已经声名不弱,但也不至于配
个手枪队长吧。 张蔡相逢,应为1899-1904年蔡锷留学时发生。17岁的张牧之,又为何
会给一个留学生作手枪队长呢?
查了一下,1900年时,唐才常策划在武汉发动“自立军起义”。 蔡锷闻讯即回国
响应老师。但唐看他年纪小,就派他去湖南送信。 后来唐才常被张之洞拍平, 蔡锷身
在湖南躲过此劫,又回了日本(其实这时候他才改名叫蔡锷,才去学军事)。我以为,
张牧之当上蔡锷手枪队长,正是这一年。 估计是唐才常不放心蔡锷一个人走,派了张
牧之这个同龄毛头小伙子,给他当的保镖--”手枪队长”(估计是光头小队长)。 这
样算,1920年影片发生时张牧之37岁,也很符合人物形象。
黄四郎会在1900年认识张牧之,两种可能。1是黄也参与了自立军起义,在武汉或
者湖南见过蔡锷与张牧之。 2是蔡锷把这个手枪小战士一起带到了日本,然后在日本和
黄有过一面之缘。
我更倾向于后者, 因为黄四郎和张牧之,显然都在日本混过不短地时间。
问题5:张牧之黄四郎都混过日本? 应该是,他们都对介错很熟
先来介绍一下介错:
日本人不爱上吊爱切腹,他们觉得切死自己挺光荣的。 但切腹挺难操作,一刀捅
进去,一时死不了还特别疼。身体倒得七扭八歪,挣扎起来满地的血,死相难看,特别
不体面。故很多时候切腹者会让一个信赖的朋友当「介错」。介错人手持长刀站在其身
后,在自杀者的短刀切腹的一瞬间砍下他的脑袋。
切腹大家都熟,但介错就相对冷僻。 更别说在没网络和电视的1920年, 如果不是
对日本文化相当熟悉的人,根本说不出这俩字吧。
黄四郎在鸿门宴上说“要是这三个人供出我来,我就切腹,请兄台当我的介错”。
张牧之说“你搞错了,介错人用的是长刀”。两个人应该都在日本待过相当长的时间
。 尤其是黄四郎,好端端的中国人没事谁能扯到切腹去。张牧之要在日本混,只能是
1900-1904年。因为1904年蔡锷回国后就没怎么去日本(其实我也不熟,蒙的),作为
蔡锷的手枪队长,张牧之也不能去日本。等1916年8月,蔡锷病重去日本治病,当时张
牧之一定跟着去了日本,但估计这段时间他可没兴趣研究什么切腹。何况11月初蔡锷就
病逝了。
回答了这5个问题后, 我们重新看黄四郎这个人。 他留过西洋,也留过东洋。说
话爱拽文,冒成语,国学功底算不错。你若把他看作一个土财主,这些设定显然有很蹩
脚; 但若把他看作早期便追随孙中山的革命党, 那些设定就很恰当。
黄四郎,不仅仅是一个简单的土财主。 他是一个腐化的前革命者,现当权派。 在
鹅城,他是“官府”的代言人。
我总结一下暗线:
1900年,张牧之追随蔡锷到日本,并与黄四郎有一面之缘。
1900-1911年,张牧之和黄四郎在同一个革命阵营,但无交集。
1911年10月10日, 辛亥武昌起义,黄四郎为核心成员。 10月30日,蔡锷在云南发
动重九起义,张牧之也算核心成员。
1911年-1920年. 辛亥胜利后,革命者黄四郎,开始利用手中的权利敛财。他投靠
了实力军阀张敬尧(还是张宗昌? 其实我没听清楚。 总不能是张孝准吧)这座靠山后
,愈发肆无忌惮,横征暴敛,更以故乡鹅城为根本苦心经营,控制了民国小半的烟土交
易,大发其财。
辛亥胜利后,革命者张牧之,不求权钱,继续追随蔡锷。 1916年蔡锷死
于日本,此后张牧之对时局失望,干脆落草为寇。
1920年, 张牧之马邦德来到鹅城,电影开始。张黄斗法,掀起了一个小小的鹅城
起义,胜利后张牧之分文不得,心爱的女人和他的兄弟们一起走了。这场“革命”,正
如当年的辛亥革命, 他什么也没得到,甚至失去了很多。 他坐的chair, 也被别的
man抗走了。
这就是姜文在此电影里内藏的政治隐喻。 谁会投入革命?蔡锷这样的英雄会,袁
世凯这样的枭雄会,但最后得权的一定是袁世凯;张牧之这样的爷们会,黄四郎这样的
投机者会,但最后得利的一定是黄四郎。 当张牧之再次掀起鹅城革命,他不为财也不
为权,不为女人也不为大众。他对黄四郎说:“没有你,对我很重要”。
如果你们觉得这个隐喻还不够过瘾, 鸿门宴上还有句台词。“彼时彼刻?” “恰
如此时此刻”(谢绝联想,请勿跨省)。
问题6:姜文要干什么? “让子弹飞一会”
解决了前5个问题,我们就明白姜文如何同时取悦小装,大神和官府三个群体了。
那就是打时间差。这是一部让子弹飞一会儿才能被解读出的电影,子弹中的火药藏在喜
剧和商业的外壳之下,躲过了官府的剪刀手。 他若明白无误的指出黄四郎是由XX手段
走上统治阶级的恶棍,配合最后的“鹅城运动”,那这片死的绝对比宁浩的《无人区》
还惨烈。等子弹飞完,官府醒过神儿来,影片都下映了。
从技术手段来说,姜文为追求这个飞一会儿才明白的效果,刻意的将每一条重要的
线索后埋一个包袱以转移注意力。 比如张牧之刚刚自陈身份,说自己跟松坡将军混过
。 观众还没转过筋想清楚松坡是谁,葛优就跳出来插科打诨:“那一年,我十七岁,
她也十七岁...”。在逗笑大家之余,将观众的注意力从“松坡”,“十七岁” 这样的
线索上转移开。避免影片立刻被看懂。
姜文的电影爱悄悄的牵扯些政治,但要把子弹对着官府打,未免自讨死路。他准备
打向谁? 这就是本文最后要讨论的问题,也是姜文更大的野心所在。 看官们可以把他
野心想的特别不怕死,但我可不敢胡写。我觉得他把枪口对准时下电影界,对准某位电
影界的官府代言人。
让我们再回顾一下姜文那句“我姜文站着,也能把钱挣了”。这点野心,观众都看
的出来,也不难理解这句有点揶揄闷头挣钱的冯小刚。冯导岂是在于这点揶揄的人?还
主动客串了汤师爷,和葛优联袂出演赚钱众。(冯导不但拍片赚钱发挥稳定,客串也是
稳定的头五分钟就死。)汤师爷落水而死, 葛优演的马邦德为求活命,一直在冒充汤
师爷。 可以说,在电影里,葛优代表了冯小刚。马邦德说的,就是汤师爷说的。也是
冯小刚说的。
汤师爷要赚钱,他向谁跪? 官府代言人“黄四爷”。 他怎么着挣钱? 黄四爷带
头出钱,其他人就得跟着出钱,回头把钱还给黄四爷,得利三七开。
张牧之要站着挣钱,也得在汤师爷的配合下,先忽悠“黄四爷”先出了一百八十万
两银子才行。
关键问题来了,汤师爷想赚钱得跪官府代言人黄四爷,冯导演想赚钱得跪那位爷?
时下电影圈里, 有没有一个“爷”,是公认的官府代言人呢。这位爷,如果像黄
四爷一样恶劣,已成中国电影的毒瘤,就够好了。这位爷,如果像黄四爷一样发家,先
投身于“导”,一步步的向官府靠拢,终究成“爷”,就再好不过了。
有没有这样的一位爷,让姜文这种爷们电影人觉得。“X爷,没有你,对我很重要
”。线索还在电影里
理解子弹的政治隐喻,突破点在于姜文相对于原著,对故事发生时间的改动。
理解子弹的现实所指,突破点在于姜文相对于原著,对角色姓名的改动。
在原著里,黄财主的原名叫黄天榜,”黄天棒”. 在电影里,叫作黄四郎,“黄四
爷”。
韩三爷,您得多么的无畏,才敢于把自己的名字,放在这片儿的出品人上? 您给
这电影投了多少钱来着, 别是一千八百万
(原著师爷姓陈,没县长这人。 电影里分别安上汤,马二名。将将是个“冯”字
,有点附会,放括号里图个好玩吧)
在电影后半, 张麻子对着黄四爷派出来的马车,虚射一枪,“让子弹飞一会”。
片刻,枪声四起。
《让子弹飞》上映一会后,终会成燎原之势。其它手里有枪的导演,编剧,演员,
杂志,评论家们,都会迫不及待的把肚子里藏了多年的子弹打出去。
姜文必将瓦解一个“三爷的王朝”,“剪刀手的王朝”。让黑马们倒下,白马们得
以挣脱沉重的束缚。但”姜文的王朝”,永远不会来临。他会从容的从椅子上站起来,
让别人搬走。自己骑上白马,悠然的离开我们的视线,化为一个传说。
让子弹飞一会儿吧!
发信人: RichPerson (我爱中科大~ 赚钱专业户~), 信区: SanFrancisco
标 题: 影评《让子弹飞》的暗线,隐喻。豆瓣浏览达8万多人的帖子
发信站: BBS 未名空间站 (Thu Dec 23 23:58:03 2010, 美东)
“由于对姜文过于卑躬屈膝,厚颜无耻的吹捧,该影评已被和谐。”
这句是我在去看电影之前,已经准备好的影评(还是抄来的)。
吾辈俗人,花钱去影院只图消遣。回来吹吹水,网上吐吐槽。严肃客观的
评价电影于我如浮云,就是带着这么强烈的偏见去看的电影。国产片导演就那么几位。
考虑到他们近年的发挥惊人地稳定, 吾辈观影前,早已选择好了态度。
比如赵氏孤儿,陈凯歌肯定给我们带来悲剧。他就活在自己的那点小悲剧情怀里
,老想拍一悲剧,还肯定又玩现了,整个一纯悲剧。我们买了电影票,聚精会神地盯着
屏幕,唯恐事后骂得不够尖刻戏谑不够振聋发聩。 再比如让子弹飞, 姜文肯定给我们
带来惊喜。我们买了电影票,就等着让他TMD给我们翻译翻译什么叫TMD的惊喜。 看不
懂,就说这片真有深度,可惜太小众了。 看懂了,便把他当神来捧,唯恐自己的态度
不够卑贱,拜倒得不够迅猛。 只恨“愿为姜文门下走狗”这种结构已在王小波徐文长
身上用滥了。
人总是渴求被认同。所谓“人生得一知己,死而无憾”,描绘的就是这种
渴求被满足时的快感。人性若此,无以抗衡。这群大导演大玩家,亦不能脱俗,只是口
味略有偏好。冯小刚张艺谋什么的活明白了,追求票房认同。陈凯歌自负才华,追求带
点文艺腔的装B青年的认同。吾辈小装青年,层次低,为与不装B的大众拉开差距,大家
紧紧抱成鸡蛋状,追求蛋内认同,人称蛋同。还有些大装青年,最爱唱反调,追求与小
装们拉开差距,显得层次高,自会有人贴过来膜拜他们,叫他们大神。
姜文拍电影,也图个被认同。他的四部风格各异的电影,都有强烈的自我
表达欲望。每一个片中的“我”,包括夏雨演的,都是他内心的部分投射。其前三部电
影表现出来的选本、选角的眼光,节奏、镜头的把握,讲故事谈思想的水平等硬实力,
在吾等小青年心中已然封神入圣。但姜文不满足,他追求更广阔的认同。《鬼来》被禁
,《太阳》票房不佳,这些不认同的声音在姜文心里絮絮叨叨挥之不去。
两年多后,姜文射出来的,是经过精心构化,寻求破局的子弹。他的野心是得到同
行,大众,小青年,大神和官府共同的认同。一言以蔽之:
我姜文,“站着”也能把钱赚了。
我从没见过国产导演有如此之大的野心,这野心听起来又如此的不可实现
。同行是冤家,小青年想脱离大众,大神要高于小青年。 最重要的是,官府认同的,
小青年和大神就不认同。大众同行还算容易同时取悦。但小青年,大神和官府这三群,
在态度上冰炭不容。
现实正是如此,在官府放行,喉舌大赞之后,电影自身素质迅速赢得了同
行和大众的青睐。 广大小装青年们在短暂的观望后,看到宁财神同学的一句“姜文王
朝来了!”后立即拜倒投诚。罗永浩,今何在等大神迫不及待地跟跳出来,“日,评价
这么高,不至于吧。(这电影没啥思想啊)”,“下次拍个更有追求的电影”,“你们
到底为什么激动啊”。 更极端一些的人开始咒骂,“姜文背叛了我们背叛了理想,腐
化了拜金了追求票房了”。“站着,也能挣钱”这种事在他们眼里是没门的。 “你媚
俗了大众,让大家都看的懂,你就已经跪下了。”“你媚俗了官府,不玩政治讽刺了,
你就已经跪下了!”。
连我这个不合群的小装青年,看完后也充满了疑惑。前两小时被导演带着
高速狂飙,爽透了,结尾的节奏变化却让我无所适从。张麻子打倒了黄四郎, 最后却
一无所得,兄弟女人也离他远去。他骑着白马缓缓离去的场景让我十分落寞。虽然最后
的那场“起义”倾向危险…但这就是姜文电影里想说的么?
子弹呼啸而来,透体而过,我却没一点感觉,好像没打中一样。搞的我连影评都不
想写了。
姜文说:“让子弹飞一会儿”。
电影的开头,张麻子对着白马开了一枪,这枪瞄准绳结,打中却不打断。
白马继续跑,绳索已不能吃力。让“子弹飞了一会”,绳索终于断裂,白马才四散跑开
。电影的结尾,姜文对我开了一枪。 白马在我脑中奔驰一夜一天,绳索终于断裂, 我
才舒服了。
如果你看见了那思绪拖出来的暗线,就会明白宁财神说错了。“姜文的王朝,永远
不会到来”
影评这么多,吐槽点最多的就是周润发饰演的黄四郎了。这个地主恶霸,说单词,
玩“介错”,还总要拽拽文,钱也多的离谱。这些特质可笑,不必要,也不合理。 但
揭开暗线的线索,就在于这些“不合理”。 影片的暗线,几乎都巧妙得埋在笑料之下。
问题1:故事发生在什么时间? 1920.
葛优演的马县长,在刚进鹅城不久就说:“不好,我们来晚了,前任县长已经把税
预征到90年后了,都到2010年了”。 原著中故事发生在193X年,是姜文特意改到1920
年的。
问题2:黄四郎只是个地主恶霸么? 没那么简单
黄四郎交给假麻子(胡军)地雷时,说了很多:“北中国我不知道,但这种限量版
地雷,整个南国只有两个”;“第一个在辛亥革命时炸了第一响”;“惊天,动地,还
泣鬼神”;“1910,made in U.S”
辛亥革命发生于1911年,这1910年才生产。 黄四郎不但知道辛亥革命的地雷是什
么型号,还拥有唯一一颗双胞胎地雷。 请问,黄四郎在辛亥革命中,发挥了什么作用?
黄四郎参与了在武昌起义的核心策划,是辛亥革命的老资格革命党!不信?下面还
有佐证
问题3:张麻子只是个土匪么? 当然不是
电影里很明白的说了, 张牧之,早年追随松坡将军(蔡锷),17岁时即为其麾下
手枪队长。是讲武堂出来的(考虑到蔡锷,应为1909年成立的云南陆军讲武堂)。蔡锷
在日本死后(1916),张牧之回国,落草。
蔡锷何人?梁启超高徒,民国开国元勋,护国军神。 1911年辛亥武昌起义后20日
,蔡锷就在云南发动重九起义响应革命。1915年又发动护国讨袁并取得胜利。张牧之早
年即追随他,也算是 辛亥革命党对老资格。
张牧之和黄四郎还曾是革命战友? 影片给出了明显的线索
问题4:1900的一面之缘?
张牧之与马邦德赴黄四郎的鸿门宴时, 黄四郎说。“20年前,我和张麻子曾有一
面之缘”。从影片可以看出,黄四郎一开始就知道假县长就是张牧之就是张麻子。这句
一面之缘,是他刻意点开的敲山震虎。影片确凿的发生在1920年。 20年前就是1900年。
黄四郎和张牧之在这一年见过面? 那一年发生了什么? 我们继续从张17岁当上蔡
锷手枪队长入手。
问题是,张牧之现在多少岁,又是那一年遇上蔡锷的呢?
蔡锷1882年12月出生,1899年在时务学堂的老师唐才常德资助下赴日本留学,1904
年毕业于日本陆军士官学校毕业。 回国后先后在湖南广西云南等地练兵。
如果张是1904年后见到的蔡锷,那么1900年时张牧之不超过13岁。 这样的孩子不
应引起黄四郎的注意。且1920年时33岁,似乎又嫩了一些。蔡锷活到此时也不过三十七
岁。 1899年之前的蔡锷不过是个16岁不到的学生,虽然已经声名不弱,但也不至于配
个手枪队长吧。 张蔡相逢,应为1899-1904年蔡锷留学时发生。17岁的张牧之,又为何
会给一个留学生作手枪队长呢?
查了一下,1900年时,唐才常策划在武汉发动“自立军起义”。 蔡锷闻讯即回国
响应老师。但唐看他年纪小,就派他去湖南送信。 后来唐才常被张之洞拍平, 蔡锷身
在湖南躲过此劫,又回了日本(其实这时候他才改名叫蔡锷,才去学军事)。我以为,
张牧之当上蔡锷手枪队长,正是这一年。 估计是唐才常不放心蔡锷一个人走,派了张
牧之这个同龄毛头小伙子,给他当的保镖--”手枪队长”(估计是光头小队长)。 这
样算,1920年影片发生时张牧之37岁,也很符合人物形象。
黄四郎会在1900年认识张牧之,两种可能。1是黄也参与了自立军起义,在武汉或
者湖南见过蔡锷与张牧之。 2是蔡锷把这个手枪小战士一起带到了日本,然后在日本和
黄有过一面之缘。
我更倾向于后者, 因为黄四郎和张牧之,显然都在日本混过不短地时间。
问题5:张牧之黄四郎都混过日本? 应该是,他们都对介错很熟
先来介绍一下介错:
日本人不爱上吊爱切腹,他们觉得切死自己挺光荣的。 但切腹挺难操作,一刀捅
进去,一时死不了还特别疼。身体倒得七扭八歪,挣扎起来满地的血,死相难看,特别
不体面。故很多时候切腹者会让一个信赖的朋友当「介错」。介错人手持长刀站在其身
后,在自杀者的短刀切腹的一瞬间砍下他的脑袋。
切腹大家都熟,但介错就相对冷僻。 更别说在没网络和电视的1920年, 如果不是
对日本文化相当熟悉的人,根本说不出这俩字吧。
黄四郎在鸿门宴上说“要是这三个人供出我来,我就切腹,请兄台当我的介错”。
张牧之说“你搞错了,介错人用的是长刀”。两个人应该都在日本待过相当长的时间
。 尤其是黄四郎,好端端的中国人没事谁能扯到切腹去。张牧之要在日本混,只能是
1900-1904年。因为1904年蔡锷回国后就没怎么去日本(其实我也不熟,蒙的),作为
蔡锷的手枪队长,张牧之也不能去日本。等1916年8月,蔡锷病重去日本治病,当时张
牧之一定跟着去了日本,但估计这段时间他可没兴趣研究什么切腹。何况11月初蔡锷就
病逝了。
回答了这5个问题后, 我们重新看黄四郎这个人。 他留过西洋,也留过东洋。说
话爱拽文,冒成语,国学功底算不错。你若把他看作一个土财主,这些设定显然有很蹩
脚; 但若把他看作早期便追随孙中山的革命党, 那些设定就很恰当。
黄四郎,不仅仅是一个简单的土财主。 他是一个腐化的前革命者,现当权派。 在
鹅城,他是“官府”的代言人。
我总结一下暗线:
1900年,张牧之追随蔡锷到日本,并与黄四郎有一面之缘。
1900-1911年,张牧之和黄四郎在同一个革命阵营,但无交集。
1911年10月10日, 辛亥武昌起义,黄四郎为核心成员。 10月30日,蔡锷在云南发
动重九起义,张牧之也算核心成员。
1911年-1920年. 辛亥胜利后,革命者黄四郎,开始利用手中的权利敛财。他投靠
了实力军阀张敬尧(还是张宗昌? 其实我没听清楚。 总不能是张孝准吧)这座靠山后
,愈发肆无忌惮,横征暴敛,更以故乡鹅城为根本苦心经营,控制了民国小半的烟土交
易,大发其财。
辛亥胜利后,革命者张牧之,不求权钱,继续追随蔡锷。 1916年蔡锷死
于日本,此后张牧之对时局失望,干脆落草为寇。
1920年, 张牧之马邦德来到鹅城,电影开始。张黄斗法,掀起了一个小小的鹅城
起义,胜利后张牧之分文不得,心爱的女人和他的兄弟们一起走了。这场“革命”,正
如当年的辛亥革命, 他什么也没得到,甚至失去了很多。 他坐的chair, 也被别的
man抗走了。
这就是姜文在此电影里内藏的政治隐喻。 谁会投入革命?蔡锷这样的英雄会,袁
世凯这样的枭雄会,但最后得权的一定是袁世凯;张牧之这样的爷们会,黄四郎这样的
投机者会,但最后得利的一定是黄四郎。 当张牧之再次掀起鹅城革命,他不为财也不
为权,不为女人也不为大众。他对黄四郎说:“没有你,对我很重要”。
如果你们觉得这个隐喻还不够过瘾, 鸿门宴上还有句台词。“彼时彼刻?” “恰
如此时此刻”(谢绝联想,请勿跨省)。
问题6:姜文要干什么? “让子弹飞一会”
解决了前5个问题,我们就明白姜文如何同时取悦小装,大神和官府三个群体了。
那就是打时间差。这是一部让子弹飞一会儿才能被解读出的电影,子弹中的火药藏在喜
剧和商业的外壳之下,躲过了官府的剪刀手。 他若明白无误的指出黄四郎是由XX手段
走上统治阶级的恶棍,配合最后的“鹅城运动”,那这片死的绝对比宁浩的《无人区》
还惨烈。等子弹飞完,官府醒过神儿来,影片都下映了。
从技术手段来说,姜文为追求这个飞一会儿才明白的效果,刻意的将每一条重要的
线索后埋一个包袱以转移注意力。 比如张牧之刚刚自陈身份,说自己跟松坡将军混过
。 观众还没转过筋想清楚松坡是谁,葛优就跳出来插科打诨:“那一年,我十七岁,
她也十七岁...”。在逗笑大家之余,将观众的注意力从“松坡”,“十七岁” 这样的
线索上转移开。避免影片立刻被看懂。
姜文的电影爱悄悄的牵扯些政治,但要把子弹对着官府打,未免自讨死路。他准备
打向谁? 这就是本文最后要讨论的问题,也是姜文更大的野心所在。 看官们可以把他
野心想的特别不怕死,但我可不敢胡写。我觉得他把枪口对准时下电影界,对准某位电
影界的官府代言人。
让我们再回顾一下姜文那句“我姜文站着,也能把钱挣了”。这点野心,观众都看
的出来,也不难理解这句有点揶揄闷头挣钱的冯小刚。冯导岂是在于这点揶揄的人?还
主动客串了汤师爷,和葛优联袂出演赚钱众。(冯导不但拍片赚钱发挥稳定,客串也是
稳定的头五分钟就死。)汤师爷落水而死, 葛优演的马邦德为求活命,一直在冒充汤
师爷。 可以说,在电影里,葛优代表了冯小刚。马邦德说的,就是汤师爷说的。也是
冯小刚说的。
汤师爷要赚钱,他向谁跪? 官府代言人“黄四爷”。 他怎么着挣钱? 黄四爷带
头出钱,其他人就得跟着出钱,回头把钱还给黄四爷,得利三七开。
张牧之要站着挣钱,也得在汤师爷的配合下,先忽悠“黄四爷”先出了一百八十万
两银子才行。
关键问题来了,汤师爷想赚钱得跪官府代言人黄四爷,冯导演想赚钱得跪那位爷?
时下电影圈里, 有没有一个“爷”,是公认的官府代言人呢。这位爷,如果像黄
四爷一样恶劣,已成中国电影的毒瘤,就够好了。这位爷,如果像黄四爷一样发家,先
投身于“导”,一步步的向官府靠拢,终究成“爷”,就再好不过了。
有没有这样的一位爷,让姜文这种爷们电影人觉得。“X爷,没有你,对我很重要
”。线索还在电影里
理解子弹的政治隐喻,突破点在于姜文相对于原著,对故事发生时间的改动。
理解子弹的现实所指,突破点在于姜文相对于原著,对角色姓名的改动。
在原著里,黄财主的原名叫黄天榜,”黄天棒”. 在电影里,叫作黄四郎,“黄四
爷”。
韩三爷,您得多么的无畏,才敢于把自己的名字,放在这片儿的出品人上? 您给
这电影投了多少钱来着, 别是一千八百万
(原著师爷姓陈,没县长这人。 电影里分别安上汤,马二名。将将是个“冯”字
,有点附会,放括号里图个好玩吧)
在电影后半, 张麻子对着黄四爷派出来的马车,虚射一枪,“让子弹飞一会”。
片刻,枪声四起。
《让子弹飞》上映一会后,终会成燎原之势。其它手里有枪的导演,编剧,演员,
杂志,评论家们,都会迫不及待的把肚子里藏了多年的子弹打出去。
姜文必将瓦解一个“三爷的王朝”,“剪刀手的王朝”。让黑马们倒下,白马们得
以挣脱沉重的束缚。但”姜文的王朝”,永远不会来临。他会从容的从椅子上站起来,
让别人搬走。自己骑上白马,悠然的离开我们的视线,化为一个传说。
让子弹飞一会儿吧!
V*x
3 楼
挺喜欢这歌。。。
加上一首摇篮曲憋半天也憋不出来。。
还是吼吼吧。。。>中间掺杂了一点厨房剁肉的声音。。
室友阿姨给孩子做饭ing。。
当我走在这里的每一条街道
我的心似乎从来都不能平静
除了发动机的轰鸣和电气之音
我似乎听到了他烛骨般的心跳
我在这里欢笑
我在这里哭泣
我在这里活着
也在这里死去
我在这里祈祷
我在这里迷惘
我在这里寻找
在这里失去
北京 北京
咖啡馆与广场有三个街区
就像霓虹灯到月亮的距离
人们在挣扎中互相告慰和拥抱
寻找着追逐着奄奄一息的碎梦
我们这里欢笑
我们这里哭泣
我们这里活着
也这里死去
我们这里祈祷
我们这里迷惘
我们这里寻找
也在这失去
北京 北京
如果有一天我不得不离去
我希望人们把我埋在这里
在这儿我能感觉到我的存在
在这有太多让我眷恋的东西
我在这里欢笑
我在这里哭泣
我在这里活着
也这里死去
我在这里祈祷
我在这里迷惘
我在这里寻找
也在这失去
北京 北京
加上一首摇篮曲憋半天也憋不出来。。
还是吼吼吧。。。>中间掺杂了一点厨房剁肉的声音。。
室友阿姨给孩子做饭ing。。
当我走在这里的每一条街道
我的心似乎从来都不能平静
除了发动机的轰鸣和电气之音
我似乎听到了他烛骨般的心跳
我在这里欢笑
我在这里哭泣
我在这里活着
也在这里死去
我在这里祈祷
我在这里迷惘
我在这里寻找
在这里失去
北京 北京
咖啡馆与广场有三个街区
就像霓虹灯到月亮的距离
人们在挣扎中互相告慰和拥抱
寻找着追逐着奄奄一息的碎梦
我们这里欢笑
我们这里哭泣
我们这里活着
也这里死去
我们这里祈祷
我们这里迷惘
我们这里寻找
也在这失去
北京 北京
如果有一天我不得不离去
我希望人们把我埋在这里
在这儿我能感觉到我的存在
在这有太多让我眷恋的东西
我在这里欢笑
我在这里哭泣
我在这里活着
也这里死去
我在这里祈祷
我在这里迷惘
我在这里寻找
也在这失去
北京 北京
k*3
4 楼
Kindle 3G刷了多看之后还能用吗?
p*2
5 楼
就是学习Haskell太疯狂了,让人常常质疑为啥不直接上Haskell算了。
c*2
6 楼
Depending on the reason of the I-539 denial. If USCIS denies it because they
think you were not keeping a valid non-immigrant status, then you have to
leave US and return with a visa.
Otherwise if your current non-immigrant status is still valid(I-539 denial
reason unrelated to your status), you can file another COS that is valid
within US.
think you were not keeping a valid non-immigrant status, then you have to
leave US and return with a visa.
Otherwise if your current non-immigrant status is still valid(I-539 denial
reason unrelated to your status), you can file another COS that is valid
within US.
b*g
10 楼
可以去第三国签了 再入境吗?
还是必须回中国签过来?
谢谢
还是必须回中国签过来?
谢谢
c*n
11 楼
bd~~~好听
四当家的有木试过Adele的歌?声线很像,很Jazz
四当家的有木试过Adele的歌?声线很像,很Jazz
w*g
19 楼
因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
不断提醒自己我在用的是hack版,是有罪的.
我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
任”的态度。IO monad其实也是这个意思。
所谓纯FP的意思就是说我不是在做I/O,而是在对一堆I/O操作进行计算。其实
FP只是一种世界观而已,以haskell的眼光看过去, 从C++里面绝对能看到
一个一个的monad。
我早觉得haskell是一种很迂腐的语言。
【在 d******e 的大作中提到】
: haskell的默认string 实现太慢了。比python慢10倍。
也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
不断提醒自己我在用的是hack版,是有罪的.
我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
任”的态度。IO monad其实也是这个意思。
所谓纯FP的意思就是说我不是在做I/O,而是在对一堆I/O操作进行计算。其实
FP只是一种世界观而已,以haskell的眼光看过去, 从C++里面绝对能看到
一个一个的monad。
我早觉得haskell是一种很迂腐的语言。
【在 d******e 的大作中提到】
: haskell的默认string 实现太慢了。比python慢10倍。
p*r
22 楼
我去,虽然我没学习过,不过还是给跪了。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
d*i
25 楼
哈哈,不错的见解。所以现实主义,实用主义是永恒的真理,“PHP是最好的语言”不
是玩笑话。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
是玩笑话。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
V*x
26 楼
谢谢楼上所有童鞋~~汪峰的这首歌反正吧,被我糟禁了~:P
to lily:呵呵,下次再整个锅碗瓢盆各种交织?:)
to cadgn:cadenza同学管你叫卡登,我都快混乱ing。。。
管你叫cad吧。。以示区别。。Adele,难度颇高,无法驾驭。。
只能仰视而已。。另:四当家,脑海中第一个浮现的是。。。
络腮粗犷一身匪气杀富济贫外加掳获别家女儿当压寨夫人
的胡子一枚啊。。。>to airdragon77:琪琪速速搅拌~~哈哈
to zhangdao:Jazz。。其实内个。。这歌好像不走爵士风的。。
误导你们了~>to supercat123:过奖了。。唱是没唱明白,作更是不会。。。
摇篮曲是和一个偶像合作的歌儿,肿是唱不出感觉来。。。
to niupitang:嘿嘿。。汪峰的歌还是男生唱才能唱出那种撕心裂肺的痛苦~
to lily:呵呵,下次再整个锅碗瓢盆各种交织?:)
to cadgn:cadenza同学管你叫卡登,我都快混乱ing。。。
管你叫cad吧。。以示区别。。Adele,难度颇高,无法驾驭。。
只能仰视而已。。另:四当家,脑海中第一个浮现的是。。。
络腮粗犷一身匪气杀富济贫外加掳获别家女儿当压寨夫人
的胡子一枚啊。。。>to airdragon77:琪琪速速搅拌~~哈哈
to zhangdao:Jazz。。其实内个。。这歌好像不走爵士风的。。
误导你们了~>to supercat123:过奖了。。唱是没唱明白,作更是不会。。。
摇篮曲是和一个偶像合作的歌儿,肿是唱不出感觉来。。。
to niupitang:嘿嘿。。汪峰的歌还是男生唱才能唱出那种撕心裂肺的痛苦~
k*3
27 楼
能换回去就行。想入个Kindle 3 3G版,但是不想丢掉免费的3G。
c*9
28 楼
IO monad 龌龊?我觉得总的来说monad是优雅的方式。
”现实“也不是不可变的,“现实”要接近理想才是进步。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
”现实“也不是不可变的,“现实”要接近理想才是进步。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
S*A
31 楼
非常赞同!迂腐非常贴切。
我另外一个观察就是,人们比较容易理解符合
execution flow 的代码。汇编不好读其中一个原因
就是跳来跳去人脑为了理解程序需要记住很多中间
状态。人脑是比较擅长理解过程式的状态,先做个,
下一部做那个,然后这个就变成了那个。
所以结构化的 if else,用空格 indent 来标明程序
机构,就是让程序的代码的阅读结构更加接近
execution flow。帮助人们理解,这一块是干什么的。
人脑不擅长高度抽象的推演和。有些描述很通用很
抽象,例如 meta class 这种,很多人理解就很费力。
人们通常需要看到这个抽象的东西如何实例话才能
理解。
Haskell 的整个就是代码非常不符合 execution flow。
这个给理解和调试都带来困难。Lisp 这类的语言出现
比 C 什么的早很多,甚至有硬件直接支持 Lisp 的。
但是一直推广比不上 C 这样的语言。这是其中一个
原因,这类 FP 比过程式语言难写难维护。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
我另外一个观察就是,人们比较容易理解符合
execution flow 的代码。汇编不好读其中一个原因
就是跳来跳去人脑为了理解程序需要记住很多中间
状态。人脑是比较擅长理解过程式的状态,先做个,
下一部做那个,然后这个就变成了那个。
所以结构化的 if else,用空格 indent 来标明程序
机构,就是让程序的代码的阅读结构更加接近
execution flow。帮助人们理解,这一块是干什么的。
人脑不擅长高度抽象的推演和。有些描述很通用很
抽象,例如 meta class 这种,很多人理解就很费力。
人们通常需要看到这个抽象的东西如何实例话才能
理解。
Haskell 的整个就是代码非常不符合 execution flow。
这个给理解和调试都带来困难。Lisp 这类的语言出现
比 C 什么的早很多,甚至有硬件直接支持 Lisp 的。
但是一直推广比不上 C 这样的语言。这是其中一个
原因,这类 FP 比过程式语言难写难维护。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
l*e
33 楼
可以切换回原系统
w*w
35 楼
呵呵,梦想与现实总有一步之遥
w*w
37 楼
先来熟悉一下声音
d*r
38 楼
Mark 了
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
l*s
40 楼
That is why haskell most often helps you to become a better programmer ...
in another language. It makes you sharp : -)
【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很
in another language. It makes you sharp : -)
【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很
l*n
43 楼
I received such an email today from twitter:
We are seeking to bring on a number of Scala engineers to join Twitter's
backend Web team to help us build, scale and refine high-performance
scalable systems.
We are seeking to bring on a number of Scala engineers to join Twitter's
backend Web team to help us build, scale and refine high-performance
scalable systems.
n*w
44 楼
早期的lisp基本上都是解释的?比较慢性能不及c,尤其当时机器还慢得很。不知道为
什么lisp机没能成功。好像Java机也有人搞过?
还有人把lisp没能流行归结为没有标准的类库。
【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很
什么lisp机没能成功。好像Java机也有人搞过?
还有人把lisp没能流行归结为没有标准的类库。
【在 S*A 的大作中提到】
: 非常赞同!迂腐非常贴切。
: 我另外一个观察就是,人们比较容易理解符合
: execution flow 的代码。汇编不好读其中一个原因
: 就是跳来跳去人脑为了理解程序需要记住很多中间
: 状态。人脑是比较擅长理解过程式的状态,先做个,
: 下一部做那个,然后这个就变成了那个。
: 所以结构化的 if else,用空格 indent 来标明程序
: 机构,就是让程序的代码的阅读结构更加接近
: execution flow。帮助人们理解,这一块是干什么的。
: 人脑不擅长高度抽象的推演和。有些描述很通用很
l*t
45 楼
这很逗比啊。你写个unit test就知道为什么IO应该都滚出去了
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
l*s
56 楼
They both produce native codes, I can't see why lisp must be much slower
than C.
However, the more high level is a language, the more difficult to turn its
performance, simply because there are so many stuffs hidden from you.
【在 S*A 的大作中提到】
: 没有到一一对应的地步。有很多机器码是没有 C 对应的东西的。
: C 的变量需要分配到寄存器,有时候会 spill。
: 但是 C 很容易翻译到机器码是真的。C 可以当高级汇编用。
: 不需要 Lisp talk to 硬件,只是说实现一般的运算逻辑不可能
: 和 C 的运行效率高。假设都是非常好的程序员写的。
than C.
However, the more high level is a language, the more difficult to turn its
performance, simply because there are so many stuffs hidden from you.
【在 S*A 的大作中提到】
: 没有到一一对应的地步。有很多机器码是没有 C 对应的东西的。
: C 的变量需要分配到寄存器,有时候会 spill。
: 但是 C 很容易翻译到机器码是真的。C 可以当高级汇编用。
: 不需要 Lisp talk to 硬件,只是说实现一般的运算逻辑不可能
: 和 C 的运行效率高。假设都是非常好的程序员写的。
S*A
58 楼
你要试一下吗?
http://www.mitbbs.com/article_t1/Programming/31381809_0_4.html
测试数据生成在 80 楼, 完整 C 程序在 83 楼。
这个算法理论背景在这里,我用的算法就是dynamic 那个,
还不是空间最优的解法。空间用了 nxm:
http://www.ics.uci.edu/~eppstein/161/960229.html
欢迎用 Closure 和 Scala 或者 Lisp 来做同样的东西我们来看看
实现的代码运行速度怎样。
有代码可以比较大家就有感觉这个非常接近 C 的 performance 到底
是接近到什么程度。
【在 l*********s 的大作中提到】
: They both produce native codes, I can't see why lisp must be much slower
: than C.
: However, the more high level is a language, the more difficult to turn its
: performance, simply because there are so many stuffs hidden from you.
http://www.mitbbs.com/article_t1/Programming/31381809_0_4.html
测试数据生成在 80 楼, 完整 C 程序在 83 楼。
这个算法理论背景在这里,我用的算法就是dynamic 那个,
还不是空间最优的解法。空间用了 nxm:
http://www.ics.uci.edu/~eppstein/161/960229.html
欢迎用 Closure 和 Scala 或者 Lisp 来做同样的东西我们来看看
实现的代码运行速度怎样。
有代码可以比较大家就有感觉这个非常接近 C 的 performance 到底
是接近到什么程度。
【在 l*********s 的大作中提到】
: They both produce native codes, I can't see why lisp must be much slower
: than C.
: However, the more high level is a language, the more difficult to turn its
: performance, simply because there are so many stuffs hidden from you.
z*g
59 楼
说的真好,越往下越是一坨
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
a*e
60 楼
你混淆了好几个概念,貌似有道理,其实错得很远。
Haskell 语言本身纯,和它依赖库来提供高效实现,没有任何冲突。像 int, string
这种,本来就是不需要放到语言设计里东西。用 ByteString 或者 Text 不会有任何
hack 的感觉,和使用其它的 library 一样使用,我不知道你这种说法有什么依据,哪
些地方 hack 了?用第三方库能用出有罪的感觉,我真是无言以对...
Haskell 用 Monad 来给副作用之间画出界限,比起 imperative 语言里面随便把副作
用堆在一起,是一种进步。你可以说你不 care,但是需要 care 的时候,Haskell 可
以帮你清楚的分开副作用和无副作用,imperative 语言做不到。
的确,IO Monad 被不少搞理论的人诟病,说是 hack,但是你首先要弄清楚 IO Monad
只是众多 Monad 中的一种,Haskell 里面处理 IO 可以用 IO Monad,也可以用别的方
式,并没有强迫你使用 IO Monad,说到底,用 IO Monad 都是库,不是语言本身,用
不用可以由用户自己选择。与此相关的研究一直在向前发展,并没有被 IO Monad 束缚
住。
你所谓的“这不是我的责任”,我也不知道这句话是从何说起。如果要说一个 Haskell
程序员和一个 Python 程序员有什么责任方面的差别,如果最终目的都是要尽可能确
保程序的 type safety, effect safety, thread safety 种种特征,显然 Haskell 程
序员可以从语言本身得到各种帮助,而不是像 Python 程序员那样唯一的依仗只有测试。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
Haskell 语言本身纯,和它依赖库来提供高效实现,没有任何冲突。像 int, string
这种,本来就是不需要放到语言设计里东西。用 ByteString 或者 Text 不会有任何
hack 的感觉,和使用其它的 library 一样使用,我不知道你这种说法有什么依据,哪
些地方 hack 了?用第三方库能用出有罪的感觉,我真是无言以对...
Haskell 用 Monad 来给副作用之间画出界限,比起 imperative 语言里面随便把副作
用堆在一起,是一种进步。你可以说你不 care,但是需要 care 的时候,Haskell 可
以帮你清楚的分开副作用和无副作用,imperative 语言做不到。
的确,IO Monad 被不少搞理论的人诟病,说是 hack,但是你首先要弄清楚 IO Monad
只是众多 Monad 中的一种,Haskell 里面处理 IO 可以用 IO Monad,也可以用别的方
式,并没有强迫你使用 IO Monad,说到底,用 IO Monad 都是库,不是语言本身,用
不用可以由用户自己选择。与此相关的研究一直在向前发展,并没有被 IO Monad 束缚
住。
你所谓的“这不是我的责任”,我也不知道这句话是从何说起。如果要说一个 Haskell
程序员和一个 Python 程序员有什么责任方面的差别,如果最终目的都是要尽可能确
保程序的 type safety, effect safety, thread safety 种种特征,显然 Haskell 程
序员可以从语言本身得到各种帮助,而不是像 Python 程序员那样唯一的依仗只有测试。
【在 w***g 的大作中提到】
: 因为默认string是纯haskell实现的。他们的意思就是你既可以用纯而慢的方法,
: 也可以用快的hack。从有两个string这个现实可以看出在数学上的干净性和
: 性能这两者的取舍间haskell选择了前者。haskell的很多东西都有两个版本,
: 一个是FP的教科书版本,一个是高性能的hack版。然后强迫你在写程序的时候
: 不断提醒自己我在用的是hack版,是有罪的.
: 我看不出纯FP版的string除了证明这种实现很慢以外有任何必要。我的观点是
: 现实世界和底层硬件本身是不干净的,好的编程语言则能够把不干净的抽象成
: 干净的呈现给用户,至于语言本身的实现龌龊点关系不大。Haskell太过
: 注重把语言(包括runtime和库)本身的实现搞得很纯很干净,结果导致一些显示
: 现实世界龌龊性的API的存在,并且通过其命名方式表示出一副“这不是我的责
w*g
61 楼
请科普下Haskell中不用IO monad的IO方式,在GHC中能用即可。
别的都是个人taste问题,没法argue。
Monad
【在 a*****e 的大作中提到】
: 你混淆了好几个概念,貌似有道理,其实错得很远。
: Haskell 语言本身纯,和它依赖库来提供高效实现,没有任何冲突。像 int, string
: 这种,本来就是不需要放到语言设计里东西。用 ByteString 或者 Text 不会有任何
: hack 的感觉,和使用其它的 library 一样使用,我不知道你这种说法有什么依据,哪
: 些地方 hack 了?用第三方库能用出有罪的感觉,我真是无言以对...
: Haskell 用 Monad 来给副作用之间画出界限,比起 imperative 语言里面随便把副作
: 用堆在一起,是一种进步。你可以说你不 care,但是需要 care 的时候,Haskell 可
: 以帮你清楚的分开副作用和无副作用,imperative 语言做不到。
: 的确,IO Monad 被不少搞理论的人诟病,说是 hack,但是你首先要弄清楚 IO Monad
: 只是众多 Monad 中的一种,Haskell 里面处理 IO 可以用 IO Monad,也可以用别的方
别的都是个人taste问题,没法argue。
Monad
【在 a*****e 的大作中提到】
: 你混淆了好几个概念,貌似有道理,其实错得很远。
: Haskell 语言本身纯,和它依赖库来提供高效实现,没有任何冲突。像 int, string
: 这种,本来就是不需要放到语言设计里东西。用 ByteString 或者 Text 不会有任何
: hack 的感觉,和使用其它的 library 一样使用,我不知道你这种说法有什么依据,哪
: 些地方 hack 了?用第三方库能用出有罪的感觉,我真是无言以对...
: Haskell 用 Monad 来给副作用之间画出界限,比起 imperative 语言里面随便把副作
: 用堆在一起,是一种进步。你可以说你不 care,但是需要 care 的时候,Haskell 可
: 以帮你清楚的分开副作用和无副作用,imperative 语言做不到。
: 的确,IO Monad 被不少搞理论的人诟病,说是 hack,但是你首先要弄清楚 IO Monad
: 只是众多 Monad 中的一种,Haskell 里面处理 IO 可以用 IO Monad,也可以用别的方
a*e
62 楼
如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
Monad,可以直接调用 FFI.
如果你是说别的抽象方式,可以看看 effect handler
http://okmij.org/ftp/Haskell/extensible/
domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
http://haskell.cs.yale.edu/?post_type=publication&p=802
【在 w***g 的大作中提到】
: 请科普下Haskell中不用IO monad的IO方式,在GHC中能用即可。
: 别的都是个人taste问题,没法argue。
:
: Monad
Monad,可以直接调用 FFI.
如果你是说别的抽象方式,可以看看 effect handler
http://okmij.org/ftp/Haskell/extensible/
domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
http://haskell.cs.yale.edu/?post_type=publication&p=802
【在 w***g 的大作中提到】
: 请科普下Haskell中不用IO monad的IO方式,在GHC中能用即可。
: 别的都是个人taste问题,没法argue。
:
: Monad
a*e
63 楼
回顾 Haskell 发展历史,IO Monad 还是后来出现的。起初是用的 CPS (continuation
passing style) 的方式来做的,后来 CPS Monad 被发现后,就都使用 Monad 来做了
。使用 ST Monad 封装则更靠后一些,是 SPJ 搞的,因为实在是太方便了,各种
effect 直接都封在 IO Monad 里面像 imperative 语言一样都堆在一起就好了,这种
choose the easy way out 的做法导致它被人(主要是 theoretician)诟病至今。
IO
【在 a*****e 的大作中提到】
: 如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
: Monad,可以直接调用 FFI.
: 如果你是说别的抽象方式,可以看看 effect handler
: http://okmij.org/ftp/Haskell/extensible/
: domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
: http://haskell.cs.yale.edu/?post_type=publication&p=802
passing style) 的方式来做的,后来 CPS Monad 被发现后,就都使用 Monad 来做了
。使用 ST Monad 封装则更靠后一些,是 SPJ 搞的,因为实在是太方便了,各种
effect 直接都封在 IO Monad 里面像 imperative 语言一样都堆在一起就好了,这种
choose the easy way out 的做法导致它被人(主要是 theoretician)诟病至今。
IO
【在 a*****e 的大作中提到】
: 如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
: Monad,可以直接调用 FFI.
: 如果你是说别的抽象方式,可以看看 effect handler
: http://okmij.org/ftp/Haskell/extensible/
: domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
: http://haskell.cs.yale.edu/?post_type=publication&p=802
w*g
64 楼
我怎么记得FFI也是用IO monad实现的。比如下面的页面
https://www.haskell.org/haskellwiki/FFI_Introduction
C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
难道是我查得不对?
你这个claim有可能颠覆我的三观,不得不问问清楚。
IO
【在 a*****e 的大作中提到】
: 如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
: Monad,可以直接调用 FFI.
: 如果你是说别的抽象方式,可以看看 effect handler
: http://okmij.org/ftp/Haskell/extensible/
: domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
: http://haskell.cs.yale.edu/?post_type=publication&p=802
https://www.haskell.org/haskellwiki/FFI_Introduction
C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
难道是我查得不对?
你这个claim有可能颠覆我的三观,不得不问问清楚。
IO
【在 a*****e 的大作中提到】
: 如果你是说底层,其实 IO Monad 就是 ST Monad 封装了诸多 FFI 而已,不想用 IO
: Monad,可以直接调用 FFI.
: 如果你是说别的抽象方式,可以看看 effect handler
: http://okmij.org/ftp/Haskell/extensible/
: domain specific 方面,比如 arrow FRP 里面可以用 wormhole 实现并行互不干扰 IO
: http://haskell.cs.yale.edu/?post_type=publication&p=802
a*e
65 楼
wdong 下面这段话写得非常好,我非常同意:
FP 主要理论就是 function is composable,推论是 that can be a great way of
programming。
前半句无可非议,后半句有争议。但是不可否认的是,the (re)discovery of Monad
是 FP 在这条路上的一个重要贡献。它的指导意义在于,I/Os do not compose like
functions, they compose like Monads。
这是一个 profound understanding of how program works,无论使用什么编程语言,
它的结构和特征都在那里。
【在 w***g 的大作中提到】
: 我怎么记得FFI也是用IO monad实现的。比如下面的页面
: https://www.haskell.org/haskellwiki/FFI_Introduction
: C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
: foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
: 难道是我查得不对?
: 你这个claim有可能颠覆我的三观,不得不问问清楚。
:
: IO
FP 主要理论就是 function is composable,推论是 that can be a great way of
programming。
前半句无可非议,后半句有争议。但是不可否认的是,the (re)discovery of Monad
是 FP 在这条路上的一个重要贡献。它的指导意义在于,I/Os do not compose like
functions, they compose like Monads。
这是一个 profound understanding of how program works,无论使用什么编程语言,
它的结构和特征都在那里。
【在 w***g 的大作中提到】
: 我怎么记得FFI也是用IO monad实现的。比如下面的页面
: https://www.haskell.org/haskellwiki/FFI_Introduction
: C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
: foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
: 难道是我查得不对?
: 你这个claim有可能颠覆我的三观,不得不问问清楚。
:
: IO
a*e
66 楼
你的理解有一点点误差。没有任何理由可以阻止你写出如下声明:
foreign import ccall "set_icanon" set_icanon :: CInt -> ()
然后就可以像调用纯函数一样调用 I/O routine 啦!
之所以 FFI 提供 IO () 这样的声明方式,是为了立刻将有副作用的 FFI 调用封装到
IO Monad 里面去。要是想跳出 IO Monad,完全可以不用。
【在 w***g 的大作中提到】
: 我怎么记得FFI也是用IO monad实现的。比如下面的页面
: https://www.haskell.org/haskellwiki/FFI_Introduction
: C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
: foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
: 难道是我查得不对?
: 你这个claim有可能颠覆我的三观,不得不问问清楚。
:
: IO
foreign import ccall "set_icanon" set_icanon :: CInt -> ()
然后就可以像调用纯函数一样调用 I/O routine 啦!
之所以 FFI 提供 IO () 这样的声明方式,是为了立刻将有副作用的 FFI 调用封装到
IO Monad 里面去。要是想跳出 IO Monad,完全可以不用。
【在 w***g 的大作中提到】
: 我怎么记得FFI也是用IO monad实现的。比如下面的页面
: https://www.haskell.org/haskellwiki/FFI_Introduction
: C实现的一个void set_icanon(int fd),到了haskell就变成带IO的了:
: foreign import ccall "set_icanon" set_icanon :: CInt -> IO ()
: 难道是我查得不对?
: 你这个claim有可能颠覆我的三观,不得不问问清楚。
:
: IO
w*g
67 楼
抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
存在的问题。
你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
切地指的应该是imperative langauage里的I/O source code composition (Haskell里
的IO就是IO monad,没啥like不like的)。而source code composition只是text
composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
身,而是下面三点的自然推论:
1. monad能parse text。
2. imperative language能被parse。
3. I/O逻辑能用imperative language写出来。(有啥I/O逻辑不能用imperative
language写出来的?这个我也想不出来。)
你说的“profound understanding of how program works”的内容应该是:FP研究了
这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说。(符合
范畴论的一般套路。)
为了检验上面的论断,我给出由上面的逻辑可以直接得到的两个推论,大家看是不是这
么回事。
1. 不光是IO,也不光是imperative language。不管是什么语言,只要能写的出来对应
的编译器(这个语言能被parse),那么这个语言里面对应的东西就能用monad写出来。
比如exception handling, java里的annotation,在imperative language里还不怎么
流行的aspect oriented programming,这些都能用monad写出来。这个转换如果不考虑
语法糖的话应该是可以用程序自动实现的。
2. Haskell里所有涉及到IO monad的代码都有等价的imperative language实现。
如果说monad有什么问题,那就是这个概念太抽象了,能做的事情太多了,一般人可以
掌握
IO monad, Maybe, List等各种monad的用法,但是要说精通不带修饰的“monad”那就跟
说我精通写文本文件一样是没有意义的。Monad在haskell里的作用是发明新的user-
defined
programming construction。
靠,abstract nonsense。
【在 a*****e 的大作中提到】
: wdong 下面这段话写得非常好,我非常同意:
:
: FP 主要理论就是 function is composable,推论是 that can be a great way of
: programming。
: 前半句无可非议,后半句有争议。但是不可否认的是,the (re)discovery of Monad
: 是 FP 在这条路上的一个重要贡献。它的指导意义在于,I/Os do not compose like
: functions, they compose like Monads。
: 这是一个 profound understanding of how program works,无论使用什么编程语言,
: 它的结构和特征都在那里。
存在的问题。
你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
切地指的应该是imperative langauage里的I/O source code composition (Haskell里
的IO就是IO monad,没啥like不like的)。而source code composition只是text
composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
身,而是下面三点的自然推论:
1. monad能parse text。
2. imperative language能被parse。
3. I/O逻辑能用imperative language写出来。(有啥I/O逻辑不能用imperative
language写出来的?这个我也想不出来。)
你说的“profound understanding of how program works”的内容应该是:FP研究了
这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说。(符合
范畴论的一般套路。)
为了检验上面的论断,我给出由上面的逻辑可以直接得到的两个推论,大家看是不是这
么回事。
1. 不光是IO,也不光是imperative language。不管是什么语言,只要能写的出来对应
的编译器(这个语言能被parse),那么这个语言里面对应的东西就能用monad写出来。
比如exception handling, java里的annotation,在imperative language里还不怎么
流行的aspect oriented programming,这些都能用monad写出来。这个转换如果不考虑
语法糖的话应该是可以用程序自动实现的。
2. Haskell里所有涉及到IO monad的代码都有等价的imperative language实现。
如果说monad有什么问题,那就是这个概念太抽象了,能做的事情太多了,一般人可以
掌握
IO monad, Maybe, List等各种monad的用法,但是要说精通不带修饰的“monad”那就跟
说我精通写文本文件一样是没有意义的。Monad在haskell里的作用是发明新的user-
defined
programming construction。
靠,abstract nonsense。
【在 a*****e 的大作中提到】
: wdong 下面这段话写得非常好,我非常同意:
:
: FP 主要理论就是 function is composable,推论是 that can be a great way of
: programming。
: 前半句无可非议,后半句有争议。但是不可否认的是,the (re)discovery of Monad
: 是 FP 在这条路上的一个重要贡献。它的指导意义在于,I/Os do not compose like
: functions, they compose like Monads。
: 这是一个 profound understanding of how program works,无论使用什么编程语言,
: 它的结构和特征都在那里。
w*g
68 楼
我在GHC里试了,确实能正常运行。这个我以前确实不知道。如果能人肉保证函数没有
side effect的话是可以不加IO的。但是如果函数确实有side effect的话,那是有可能
引起错误的。所以你说的通过FFI进行I/O我还是无法接受。事实上main的类型就已经被
定死成IO (),IO monad是绕不过去的。
到
【在 a*****e 的大作中提到】
: 你的理解有一点点误差。没有任何理由可以阻止你写出如下声明:
: foreign import ccall "set_icanon" set_icanon :: CInt -> ()
: 然后就可以像调用纯函数一样调用 I/O routine 啦!
: 之所以 FFI 提供 IO () 这样的声明方式,是为了立刻将有副作用的 FFI 调用封装到
: IO Monad 里面去。要是想跳出 IO Monad,完全可以不用。
side effect的话是可以不加IO的。但是如果函数确实有side effect的话,那是有可能
引起错误的。所以你说的通过FFI进行I/O我还是无法接受。事实上main的类型就已经被
定死成IO (),IO monad是绕不过去的。
到
【在 a*****e 的大作中提到】
: 你的理解有一点点误差。没有任何理由可以阻止你写出如下声明:
: foreign import ccall "set_icanon" set_icanon :: CInt -> ()
: 然后就可以像调用纯函数一样调用 I/O routine 啦!
: 之所以 FFI 提供 IO () 这样的声明方式,是为了立刻将有副作用的 FFI 调用封装到
: IO Monad 里面去。要是想跳出 IO Monad,完全可以不用。
a*e
69 楼
我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
applicative 或者 arrows 实现,和 monad 的实现各有优劣。
我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
不加限制的 monad composition 可以做到这点。
而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
不依赖于语言本身的求值顺序等特征。
【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:
是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
applicative 或者 arrows 实现,和 monad 的实现各有优劣。
我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
不加限制的 monad composition 可以做到这点。
而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
不依赖于语言本身的求值顺序等特征。
【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:
w*g
70 楼
是我搞混了,好久没用haskell了,都忘干净了。你把我文中的monad换成applicative
或这arrow,只要还能parse程序,那么我说的一切就应该还成立。
【在 a*****e 的大作中提到】
: 我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
: 是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
: applicative 或者 arrows 实现,和 monad 的实现各有优劣。
: 我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
: 确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
: 不加限制的 monad composition 可以做到这点。
: 而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
: 为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
: composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
: 不依赖于语言本身的求值顺序等特征。
或这arrow,只要还能parse程序,那么我说的一切就应该还成立。
【在 a*****e 的大作中提到】
: 我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
: 是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
: applicative 或者 arrows 实现,和 monad 的实现各有优劣。
: 我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
: 确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
: 不加限制的 monad composition 可以做到这点。
: 而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
: 为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
: composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
: 不依赖于语言本身的求值顺序等特征。
a*e
71 楼
"有side effect的话,那是有可能引起错误的" 的前提是对 FFI 的调用不加限制。
IO Monad = ST Monad + RealWorld,这是一种限制方式。
但显然有其它限制方式,在发明出 IO Monad 以前 Main 可不是现在这个 type.
【在 w***g 的大作中提到】
: 我在GHC里试了,确实能正常运行。这个我以前确实不知道。如果能人肉保证函数没有
: side effect的话是可以不加IO的。但是如果函数确实有side effect的话,那是有可能
: 引起错误的。所以你说的通过FFI进行I/O我还是无法接受。事实上main的类型就已经被
: 定死成IO (),IO monad是绕不过去的。
:
: 到
IO Monad = ST Monad + RealWorld,这是一种限制方式。
但显然有其它限制方式,在发明出 IO Monad 以前 Main 可不是现在这个 type.
【在 w***g 的大作中提到】
: 我在GHC里试了,确实能正常运行。这个我以前确实不知道。如果能人肉保证函数没有
: side effect的话是可以不加IO的。但是如果函数确实有side effect的话,那是有可能
: 引起错误的。所以你说的通过FFI进行I/O我还是无法接受。事实上main的类型就已经被
: 定死成IO (),IO monad是绕不过去的。
:
: 到
w*g
72 楼
如果仅仅是为了描述sequential I/O的话根本就不需要monad啥的。
你再想想看,monad要解决的是要描述由顺序选择循环这三个基本控制结构
可以写出来的IO逻辑。运行这个IO逻辑才产生了一系列sequantial I/O。
【在 a*****e 的大作中提到】
: 我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
: 是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
: applicative 或者 arrows 实现,和 monad 的实现各有优劣。
: 我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
: 确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
: 不加限制的 monad composition 可以做到这点。
: 而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
: 为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
: composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
: 不依赖于语言本身的求值顺序等特征。
你再想想看,monad要解决的是要描述由顺序选择循环这三个基本控制结构
可以写出来的IO逻辑。运行这个IO逻辑才产生了一系列sequantial I/O。
【在 a*****e 的大作中提到】
: 我不是很理解你说的用 monad 描述 parsing 和 monad 表述 I/O 有什么关系,
: 是说 parser combinator 可以用 monad 实现吗?parser combinator 同样可以用
: applicative 或者 arrows 实现,和 monad 的实现各有优劣。
: 我说 I/O compose like monads 前面还要加一个定语: sequential,这是因为需要
: 确保副作用发生的先后顺序。不加限制的 function composition 做不到这点,但
: 不加限制的 monad composition 可以做到这点。
: 而且 text composition 明显是个 monoid,先后顺序不重要,结果一致就好。
: 为什么说 sequential I/O 可以用 Monad 表述,是因为 sequential I/O 之间的
: composition 满足 monad laws,而不是源程序可以写成什么样子,同时它也
: 不依赖于语言本身的求值顺序等特征。
w*g
73 楼
靠,我竟然悟到了这么精辟的道理。待我用英语把这个好好写写发到博客上。
【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:
【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:
a*e
74 楼
"FP研究了这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说
。"
上面这句话,我觉得有必要单独拿出来讲讲。
首先,我们谈的是 composition,而不是源代码写成 text 还是 AST。那么我问几个问
题:
1. (A ; B) ; C 等价于 A ; (B ; C) 吗?
2. A ; B 等价于 B ; A 吗?
3. A @ (B ; C) 等价于 (A @ B) ; (A @ C) 吗?
这里出现的 A B C 代表什么,而括号、分号、@号又代表什么,如果不定义清楚则
无法回答。
如果 ABC 代表自然数,括号表示优先级,分号是加法,@是乘法,那么三条对应的就是
结合律,交换律,分配律,都是满足的。
如果 ABC 代表互不干扰(也不先后干扰)的 Unix 进程,分号是并行执行(share
input),@ 表示 pipe,那么三条也都成立。但如果 ABC 是任意procedure,那么有可
能三条都不成立。
FP研究了这么多年终于发现了programs是可以表述为类型 M a,M 代表了副作用,a 代
表返回值。然后有三个特殊操作:
return :: a -> M a
fmap :: (a -> b) -> M a -> M b
join :: M (M a) -> M a
加上普通的函数操作就可以完整表述任意 imperative program 的组合方式,且满足以
下定律:
join . fmap join ≡ join . join
join . fmap return ≡ join . return = id
join . fmap (fmap f) ≡ fmap f . join
无需知道 M 的实现,无需知道语言的求值顺序,就可以对程序本身进行等价变换,用
于证明或者优化。
这,难道不是一个进步?
【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:
。"
上面这句话,我觉得有必要单独拿出来讲讲。
首先,我们谈的是 composition,而不是源代码写成 text 还是 AST。那么我问几个问
题:
1. (A ; B) ; C 等价于 A ; (B ; C) 吗?
2. A ; B 等价于 B ; A 吗?
3. A @ (B ; C) 等价于 (A @ B) ; (A @ C) 吗?
这里出现的 A B C 代表什么,而括号、分号、@号又代表什么,如果不定义清楚则
无法回答。
如果 ABC 代表自然数,括号表示优先级,分号是加法,@是乘法,那么三条对应的就是
结合律,交换律,分配律,都是满足的。
如果 ABC 代表互不干扰(也不先后干扰)的 Unix 进程,分号是并行执行(share
input),@ 表示 pipe,那么三条也都成立。但如果 ABC 是任意procedure,那么有可
能三条都不成立。
FP研究了这么多年终于发现了programs是可以表述为类型 M a,M 代表了副作用,a 代
表返回值。然后有三个特殊操作:
return :: a -> M a
fmap :: (a -> b) -> M a -> M b
join :: M (M a) -> M a
加上普通的函数操作就可以完整表述任意 imperative program 的组合方式,且满足以
下定律:
join . fmap join ≡ join . join
join . fmap return ≡ join . return = id
join . fmap (fmap f) ≡ fmap f . join
无需知道 M 的实现,无需知道语言的求值顺序,就可以对程序本身进行等价变换,用
于证明或者优化。
这,难道不是一个进步?
【在 w***g 的大作中提到】
: 抱着哲学探讨的态度做下面的回复,不是要拆FP community的台,而是试图指出FP目前
: 存在的问题。
: 你说I/O compose like monads我觉得还不够接近本质。Monad的一个牛B的应用是它可
: 以很干净地描述parsing,或者说是处理text composition。你说的I/O composition确
: 切地指的应该是imperative langauage里的I/O source code composition (Haskell里
: 的IO就是IO monad,没啥like不like的)。而source code composition只是text
: composition的一个特例,所以自然而然也就可以用monad表述了。在haskell里写I/O
: monad的过程本质上是一个人肉parse一段假想的imperative code并转换成用monad表出
: 的中间数据结构(haskell程序)的过程。Monad能用来做I/O不是因为monad能描述I/O本
: 身,而是下面三点的自然推论:
a*e
76 楼
回头又读一遍,我大概知道你要说什么了。
Monad 带来最直接,也最表层的影响,是语法上的。能够把一段代码作为 first class
citizen 对待,这其实也是一个 profound change。
Fist class citizen 的特点:可以作为参数传递,作为返回值,可以赋值给变量。
http://en.wikipedia.org/wiki/First-class_citizen
谈到组合方式,如果对象是 function,可以写成 f(g(x)),如果对象是代码,可以写
成 { A; B } 这在 C 语言里都能做到。问题是 C 和大部分语言里,只有 f g x 可以
是变量,而 A 和 B 则不可以。f(g(x)) 可以求值然后赋予一个变量,A; B 组合的结
果(一段新代码)则不可以赋值给变量。
猛一看似乎不好理解,但一旦接受了,则是一个非常自然的结果。就像越来越多的语言
都已经实现了 lambda 也即 first class function 之后,我相信,first class code
也即 IO Monad 也会逐渐流行起来。
【在 w***g 的大作中提到】
: 靠,我竟然悟到了这么精辟的道理。待我用英语把这个好好写写发到博客上。
Monad 带来最直接,也最表层的影响,是语法上的。能够把一段代码作为 first class
citizen 对待,这其实也是一个 profound change。
Fist class citizen 的特点:可以作为参数传递,作为返回值,可以赋值给变量。
http://en.wikipedia.org/wiki/First-class_citizen
谈到组合方式,如果对象是 function,可以写成 f(g(x)),如果对象是代码,可以写
成 { A; B } 这在 C 语言里都能做到。问题是 C 和大部分语言里,只有 f g x 可以
是变量,而 A 和 B 则不可以。f(g(x)) 可以求值然后赋予一个变量,A; B 组合的结
果(一段新代码)则不可以赋值给变量。
猛一看似乎不好理解,但一旦接受了,则是一个非常自然的结果。就像越来越多的语言
都已经实现了 lambda 也即 first class function 之后,我相信,first class code
也即 IO Monad 也会逐渐流行起来。
【在 w***g 的大作中提到】
: 靠,我竟然悟到了这么精辟的道理。待我用英语把这个好好写写发到博客上。
w*g
77 楼
不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
实现monad:
http://bartoszmilewski.com/2011/07/11/monads-in-c/
所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
么一套系统,不得不说是太牛B了。甩java好几条街。
(这个观点以前在这个版上被批判过,大家需要谨慎对待。)
class
【在 a*****e 的大作中提到】
: 回头又读一遍,我大概知道你要说什么了。
: Monad 带来最直接,也最表层的影响,是语法上的。能够把一段代码作为 first class
: citizen 对待,这其实也是一个 profound change。
: Fist class citizen 的特点:可以作为参数传递,作为返回值,可以赋值给变量。
: http://en.wikipedia.org/wiki/First-class_citizen
: 谈到组合方式,如果对象是 function,可以写成 f(g(x)),如果对象是代码,可以写
: 成 { A; B } 这在 C 语言里都能做到。问题是 C 和大部分语言里,只有 f g x 可以
: 是变量,而 A 和 B 则不可以。f(g(x)) 可以求值然后赋予一个变量,A; B 组合的结
: 果(一段新代码)则不可以赋值给变量。
: 猛一看似乎不好理解,但一旦接受了,则是一个非常自然的结果。就像越来越多的语言
,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
实现monad:
http://bartoszmilewski.com/2011/07/11/monads-in-c/
所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
么一套系统,不得不说是太牛B了。甩java好几条街。
(这个观点以前在这个版上被批判过,大家需要谨慎对待。)
class
【在 a*****e 的大作中提到】
: 回头又读一遍,我大概知道你要说什么了。
: Monad 带来最直接,也最表层的影响,是语法上的。能够把一段代码作为 first class
: citizen 对待,这其实也是一个 profound change。
: Fist class citizen 的特点:可以作为参数传递,作为返回值,可以赋值给变量。
: http://en.wikipedia.org/wiki/First-class_citizen
: 谈到组合方式,如果对象是 function,可以写成 f(g(x)),如果对象是代码,可以写
: 成 { A; B } 这在 C 语言里都能做到。问题是 C 和大部分语言里,只有 f g x 可以
: 是变量,而 A 和 B 则不可以。f(g(x)) 可以求值然后赋予一个变量,A; B 组合的结
: 果(一段新代码)则不可以赋值给变量。
: 猛一看似乎不好理解,但一旦接受了,则是一个非常自然的结果。就像越来越多的语言
d*i
78 楼
大牛高见,对于鼓吹FP的原教旨主义者,还是得像你这样的对传统大众编程语言和FP都
认知很深的人来反驳他们自以为是的谬论来以正视听。
只是
mini
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
认知很深的人来反驳他们自以为是的谬论来以正视听。
只是
mini
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
p*o
79 楼
C++的lambda比函数指针的语法糖还是高级一些的 ...
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
c*9
80 楼
函数指针和lamba完全不同的楖念,它不包合对所指如何操作的信息。用模板可以实现
FP,但不等于模板匹配就是Fp。汇用编什么Fp也都能实现。这样的想法就像知道了变量
可以替换
就以为自己掌握了代数学。
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
FP,但不等于模板匹配就是Fp。汇用编什么Fp也都能实现。这样的想法就像知道了变量
可以替换
就以为自己掌握了代数学。
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
a*e
81 楼
指针当然是 first class,但是函数指针不能够方便地组合,比如在 Haskell 里面写
f . g 的结果就是一个新函数,换到 C++ 里面就没有这么方便。
新的 C++ 标准提供了 lambda 语法糖,虽然需要手工指定 environment variable 也
不方便,但我觉得比有些其它语言里的方式要好。
总的来说,lambda 已经进入了主流语言的语法,是一件好事。但大部分非函数语言都
无法提供一个高效的实现。
另外,真正明晰的函数闭包语义需要严格区分 reference 和 value,这点上在
javascript, ruby, python, perl, 包括 swift 里面,都做得不好,甚至不如 C++。
最后的结果就是 lambda 和 closure 不好用,主要用途也都是充当一个回调的语法糖
而已。归根结底还是因为语义不明晰,这些语言设计者还不能够理解函数语言的精髓。
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
f . g 的结果就是一个新函数,换到 C++ 里面就没有这么方便。
新的 C++ 标准提供了 lambda 语法糖,虽然需要手工指定 environment variable 也
不方便,但我觉得比有些其它语言里的方式要好。
总的来说,lambda 已经进入了主流语言的语法,是一件好事。但大部分非函数语言都
无法提供一个高效的实现。
另外,真正明晰的函数闭包语义需要严格区分 reference 和 value,这点上在
javascript, ruby, python, perl, 包括 swift 里面,都做得不好,甚至不如 C++。
最后的结果就是 lambda 和 closure 不好用,主要用途也都是充当一个回调的语法糖
而已。归根结底还是因为语义不明晰,这些语言设计者还不能够理解函数语言的精髓。
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
a*e
82 楼
另外针对 C++ 的模板,你当然可以说它是 FP,它也足够强大,turing complete 么。
甚至 C 里面的宏,你也可以说它是 FP,因为都是 stateless rewrite rules 么。
可以这么做,但不代表好用,至少我是尽量避免使用 C++ 模板,因为错误信息完全看
不懂。当然我不敢说自己是个多好的 C++ 程序员,我写 C 甚至 Java 都比 C++ 时间
长多了。
最后,你给的链接是 Bartosz Milewski 的文章,这哥们早几年前就从 C++ zealot 变
成 Haskell convert 了,现在为 FP Complete 工作,最近在忙着写 category theory
的书。
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
甚至 C 里面的宏,你也可以说它是 FP,因为都是 stateless rewrite rules 么。
可以这么做,但不代表好用,至少我是尽量避免使用 C++ 模板,因为错误信息完全看
不懂。当然我不敢说自己是个多好的 C++ 程序员,我写 C 甚至 Java 都比 C++ 时间
长多了。
最后,你给的链接是 Bartosz Milewski 的文章,这哥们早几年前就从 C++ zealot 变
成 Haskell convert 了,现在为 FP Complete 工作,最近在忙着写 category theory
的书。
【在 w***g 的大作中提到】
: 不知道你对C语言里面的函数指针有什么看法,符合你说的作为参数传递,作为返回值
: ,可以赋给变量三个条件。C++里面的lambda只是函数指针的语法糖而已。java,
: python这些语言里的lambda也都更像函数指针的语法糖。这些都是伪functional
: programming,只是用了一个lambda的形式而已。C++里面的模板匹配才是真正的FP,基
: 本上就是一个原生态的haskell, 差了点语法糖而已。下面这个帖子就是如何用C++模板
: 实现monad:
: http://bartoszmilewski.com/2011/07/11/monads-in-c/
: 所谓的functional的精髓我觉得是代码没有side effect,这一点其实只能在编译时做
: 到。不是说搞一些叫做function或者叫做lambda的东西在语言里就是functional了。
: C++那批发明者似乎没有搞FP的,但是他们能从对性能的追求和对语言的直觉搞出来这
w*g
83 楼
文章作者convert并不能说明什么。要搞programming language的话基本上就得用
haskell。
C++的模板是有类型系统的,现在可能不完善吧,但是至少是可以完善的。
另外C++里的lambda就是语法糖,所有的lambda都可以通过定义一个重载了()方法的类
来实现。本质上就是带一个隐含this指针参数的函数指针。你说的子程序签套运算我怀
疑C++11也可以用库来实现,但都不能避免side effect的问题。
我Google了下FP的定义
In computer science, functional programming is a programming paradigm, a
style of building the structure and elements of computer programs, that
treats computation as the evaluation of mathematical functions and avoids
changing-state and mutable data.
我觉得关键还是avoid changing-state and mutable data。所有这些带lambda的语言
基本上都不支持functional data structure。我觉得他们离FP还差得很远。
我最近写C++就碰到这么一个case。就是一个递增的数据结构有n个线程读,有一个
线程写,如果有functional data structure可以用的话就会非常爽,因为做
snapshot的成本为0. 最后解决方案只能是维护两个版本的数据结构,一个读一个写,
写完了swap一下指针。
theory
【在 a*****e 的大作中提到】
: 另外针对 C++ 的模板,你当然可以说它是 FP,它也足够强大,turing complete 么。
: 甚至 C 里面的宏,你也可以说它是 FP,因为都是 stateless rewrite rules 么。
: 可以这么做,但不代表好用,至少我是尽量避免使用 C++ 模板,因为错误信息完全看
: 不懂。当然我不敢说自己是个多好的 C++ 程序员,我写 C 甚至 Java 都比 C++ 时间
: 长多了。
: 最后,你给的链接是 Bartosz Milewski 的文章,这哥们早几年前就从 C++ zealot 变
: 成 Haskell convert 了,现在为 FP Complete 工作,最近在忙着写 category theory
: 的书。
haskell。
C++的模板是有类型系统的,现在可能不完善吧,但是至少是可以完善的。
另外C++里的lambda就是语法糖,所有的lambda都可以通过定义一个重载了()方法的类
来实现。本质上就是带一个隐含this指针参数的函数指针。你说的子程序签套运算我怀
疑C++11也可以用库来实现,但都不能避免side effect的问题。
我Google了下FP的定义
In computer science, functional programming is a programming paradigm, a
style of building the structure and elements of computer programs, that
treats computation as the evaluation of mathematical functions and avoids
changing-state and mutable data.
我觉得关键还是avoid changing-state and mutable data。所有这些带lambda的语言
基本上都不支持functional data structure。我觉得他们离FP还差得很远。
我最近写C++就碰到这么一个case。就是一个递增的数据结构有n个线程读,有一个
线程写,如果有functional data structure可以用的话就会非常爽,因为做
snapshot的成本为0. 最后解决方案只能是维护两个版本的数据结构,一个读一个写,
写完了swap一下指针。
theory
【在 a*****e 的大作中提到】
: 另外针对 C++ 的模板,你当然可以说它是 FP,它也足够强大,turing complete 么。
: 甚至 C 里面的宏,你也可以说它是 FP,因为都是 stateless rewrite rules 么。
: 可以这么做,但不代表好用,至少我是尽量避免使用 C++ 模板,因为错误信息完全看
: 不懂。当然我不敢说自己是个多好的 C++ 程序员,我写 C 甚至 Java 都比 C++ 时间
: 长多了。
: 最后,你给的链接是 Bartosz Milewski 的文章,这哥们早几年前就从 C++ zealot 变
: 成 Haskell convert 了,现在为 FP Complete 工作,最近在忙着写 category theory
: 的书。
N*K
84 楼
fp语言能用来做数字电路编程么?
能用来做控制系统编程么?
【在 a*****e 的大作中提到】
: "FP研究了这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说
: 。"
: 上面这句话,我觉得有必要单独拿出来讲讲。
: 首先,我们谈的是 composition,而不是源代码写成 text 还是 AST。那么我问几个问
: 题:
: 1. (A ; B) ; C 等价于 A ; (B ; C) 吗?
: 2. A ; B 等价于 B ; A 吗?
: 3. A @ (B ; C) 等价于 (A @ B) ; (A @ C) 吗?
: 这里出现的 A B C 代表什么,而括号、分号、@号又代表什么,如果不定义清楚则
: 无法回答。
能用来做控制系统编程么?
【在 a*****e 的大作中提到】
: "FP研究了这么多年终于发现了programs是一些可以被parse的文本文件。等于啥都没说
: 。"
: 上面这句话,我觉得有必要单独拿出来讲讲。
: 首先,我们谈的是 composition,而不是源代码写成 text 还是 AST。那么我问几个问
: 题:
: 1. (A ; B) ; C 等价于 A ; (B ; C) 吗?
: 2. A ; B 等价于 B ; A 吗?
: 3. A @ (B ; C) 等价于 (A @ B) ; (A @ C) 吗?
: 这里出现的 A B C 代表什么,而括号、分号、@号又代表什么,如果不定义清楚则
: 无法回答。
a*e
88 楼
的确是这样。声称自己是 FP 语言的通常有两类,一种是支持 first class function
,一种是支持 immutable by default 的。比如 Single Assignment C (SAC),都不支
持 higher-order function,但通常也被认为是 FP。
【在 w***g 的大作中提到】
: 文章作者convert并不能说明什么。要搞programming language的话基本上就得用
: haskell。
: C++的模板是有类型系统的,现在可能不完善吧,但是至少是可以完善的。
: 另外C++里的lambda就是语法糖,所有的lambda都可以通过定义一个重载了()方法的类
: 来实现。本质上就是带一个隐含this指针参数的函数指针。你说的子程序签套运算我怀
: 疑C++11也可以用库来实现,但都不能避免side effect的问题。
: 我Google了下FP的定义
: In computer science, functional programming is a programming paradigm, a
: style of building the structure and elements of computer programs, that
: treats computation as the evaluation of mathematical functions and avoids
,一种是支持 immutable by default 的。比如 Single Assignment C (SAC),都不支
持 higher-order function,但通常也被认为是 FP。
【在 w***g 的大作中提到】
: 文章作者convert并不能说明什么。要搞programming language的话基本上就得用
: haskell。
: C++的模板是有类型系统的,现在可能不完善吧,但是至少是可以完善的。
: 另外C++里的lambda就是语法糖,所有的lambda都可以通过定义一个重载了()方法的类
: 来实现。本质上就是带一个隐含this指针参数的函数指针。你说的子程序签套运算我怀
: 疑C++11也可以用库来实现,但都不能避免side effect的问题。
: 我Google了下FP的定义
: In computer science, functional programming is a programming paradigm, a
: style of building the structure and elements of computer programs, that
: treats computation as the evaluation of mathematical functions and avoids
相关阅读
龙芯为啥不做云计算市场golang為什麼語法和關鍵詞這麼冷門?慘啊,好好的CS博士生,只能來我們公司混。。。还是要做软件啊最近oracle/google的case有了新动态uber车祸主要是sensor fusion的问题请前辈们去GitHub支持年轻人Clearcase version control tool讲讲code review[bssd]Near identity transformation众所周知,快手摊上大事了Re: 这次厉害国的内裤算是被轻轻扒下了 (转载)wps弹出了几个关不掉的窗口?Re: 抖音大火, 腾讯直接封杀, 马化腾: 直接抄!Fuck Oracle[bssd] EE版有人回来review 2011的转马公经历了有没有做clustering比较好的Package 最好有python API芯片R&D是不是比写代码技术含量高kaggle disqualifys 50% teamsInfQ有个讲microservice的文章