Their Distance. or We .

首先,我会说一连串的视频然我想到了一些我的过去吗?

话说秒速5厘米真的很治愈吗?可是为啥看完了我倒是觉得更郁闷更痛苦了,主调过于悲伤了,美好的事物都充斥着说不出道不明的离奇忧伤感。

a chain of short stories about their distance。

6031efef76094b368941f212a3cc7cd98f109d9e

============================================================

我写不出好文了,一下是摘取某博客(我用心修改了)

这个世界上一定存在着一些美好,值得我们为之奋斗到底。

============================================================

题记——
米兰昆德拉在《生命不能承受之轻》中说过,“追求的终极永远是朦胧的,要逃避痛苦,最常见的就是躲进未来。在时间的轨道上,人们总想象有一条线,超脱了这条线,当前的痛苦也许就会永不复存在。”

 

《樱花抄》

入夜以后的东京,其实比烟花更寂寞。
舔着地平线的最后一缕黯淡的余光,被深蓝的夜空吞没的最后一片残云,向远方一盏一盏地蔓延开来意兴阑珊的灯火。

新海诚创造的画面唯美得让人心疼。其实在很多处地方,大可以给画面做一个长时间的定格,像城市的广角镜头,雨天的足球场,残破的邮筒,荒芜草地里掉落的牙膏皮,晚霞里天空中飞机带过的长长云线,清晨一个人在教室里写信的贵树的孤单身影,暴风雪里的车站明灭闪烁的信号灯,倒视镜里渐渐退去的夕阳。如此细腻的画面,与新海诚有些时候刻意定格的瞬间,可以看出他所想表达的一种幽微委婉的淡淡忧伤。每一个静止的画面的背后,都藏着一段不为人知的悲伤。而在影片的很多地方,新海诚过于快速的切换画面反而让观众大脑跟不上眼睛,来不及体会到影片深处汹涌的暗流,对于那些只看过一遍电影的观众,尤是如此,相当遗憾。而那些画面如果观众在看电影时静静地分解动作,慢八拍重放,或许可以更深刻地体会到整部影片所体现的深入骨髓的伤逝之情。

影片里曾有过一只叫声清脆的大斑啄木鸟,出现在贵树前往探望明里的前夜。贵树疲惫地趴倒在桌上睡着了,梦里变成那只飞鸟,一心只想翻山越岭,前往见明里一面。啄木鸟飞过夜的东京,细碎而忧伤的月光和冰冷的城市,头顶漫天的星空,穿越到云的彼端。冬末呼啸的烈风和遥远的距离,都无法阻挡少年的决心。第一话结尾时,还是那只飞鸟,在凄冽的叫声中,贵树和明里就此开始走向每秒5厘米的告别之路,从此再也不曾见面。

 

樱花抄

 

整场大雪和路上不断晚点的列车只是整个阴霾情绪的铺垫,而整个煎熬的过程在换乘站小山贵树丢失了那封花了两个星期写给明里的信件丢失后把这份隐忍的情绪推到了极点,这是封命运攸关的信,如果在好莱坞的片场里,估计主人公此时一定是呼天抢地地跳下站台,不顾疾驰而来的列车,冒着被撞死的危险也要捡回信件。但贵树没有这么做,如果考虑到这封信在后面的剧情中对明里和贵树今后一生命运有可能完全不一样的决定性的作用时,那么贵树没能把它拾起的确只能说是造化弄人了。不过对于只有13岁的贵树来说,也许真的不能太苛刻了。况且那时前往高崎的两毛线列车已经离站台近在咫尺。在强烈的列车前灯里,那一刻像犯了错的孩子一般伤心欲绝地站在站台上的贵树,身影是那么的单薄和消瘦。

影片里有些微妙的细节,不容易被观众察觉,但却是两人此后命运的风水点。两人在岩舟车站分离的那一刻,新海诚再次给出一个细微得难以觉察的剧情。列车启动的最后一刻,可以看到明里表情有一下明显的抽动,她的手指在胸前的背包上轻轻触了一下,最终还是放弃了,只是轻声说了一句,“贵树同学今后也一定会很顺利的,绝对!”一句话,却和无数恋人间生离死别各自天涯只剩下祝福彼此的桥段无比相似。那一刻,电影给出了一份强烈的不详的预感。明里最终选择了深藏那封写满对贵树倾注所有感情的信,只留下一份淡淡祝福,而贵树也没有告诉明里他弄丢了一封写了两个星期载满了所有想对明里倾诉的思念的信件,两个人都选择了沉默,却都没有想到这份沉默终有一天生长成了天荒地老的陌路。
“在树下那吻的前后,我感觉似乎整个世界都发生了变化”这是小说里,两个主人公都曾说过的话,也是彼此都没有送出为重逢而写下的那封信件的最终理由。究竟什么发生了改变,新海诚没有说,但我们可以用丰富的想象力和类似的感情经历来细细品味一下…

 

地图

对于九州的鹿儿岛与宇都宮以北的岩舟究竟有多远,请读者自己看看地图就知道了。
距离对于恋人来说是可怕的力量,而日渐逝去的时间给了可怕这班车一个永远都到达不了的终点。贵树一直在努力寻找和渴望着那股保护明里的力量,却始终无法逾越现实给他带来的无比遥远的距离和永无边际的无助。明里一直在等待着贵树终有一天能跨越那道鸿沟,再次来到她的面前,但却终于被吞没在时间的洪流里…

 

《宇航员》

在宇航员里面,贵树常常坐着一个梦,他和一个轮廓模糊的女孩坐在遥远星球的草原上,眺望远在天边映衬在璀璨光辉里的地球。长大着的明里的面孔对他来说,已渐渐变得模糊而未知。鹿儿岛拥有着无比清澈高远的天空,无比柔和的大块云团,以及无比湛蓝的海水。只是它离繁华的东京,和恋人所在的地方是那么地遥远,遥远到就连在梦里,都再也无法触及。

暗恋着贵树的澄田花苗是心酸的,甚至为了让自己心里有勇气向贵树表白,把成功冲上浪花作为向贵树表白的资格。从初二开始暗恋贵树直到他远赴东京上大学,为了和他上同一所高中拼命学习,5个365天把这份纯洁的情感深藏心底,究竟需要多大的勇气,耐心和毅力,又是需要怎样的一份认真的喜欢才能坚持的下来的。

 

轨迹

 

为了和心仪的人一起共同骑过回家时那条短短的路,每天都带着一份揣测不安的心守在车库的后面,如此细腻的女生心思,在每天都得经历的煎熬里,却不曾犹豫和后悔地坚持了5年。澄田是带着一份无时无刻都深陷于暗恋的痛苦中,但每次见到贵树就又感到无比幸福的无能为力心情,度过那漫漫煎熬的五年的。

影片里最让我心酸的一个片段:在便利店外阴暗的街灯下,每次看到贵树给什么人发短信时,澄田总是在心里默想,如果那个人是她,该是会有多么的幸福…

当花苗的卡布跃出院子热情地舔着归来的主人时,贵树脸上给了一个特写,那是一张黯然神伤,心思如冰的脸,对贵树来说,花苗回家时至少还有她的卡布来迎接,而他和远在天边的明里已是多少年没见过面了,只有不断麻木,无谓而重复地写着永远没有收件人的短信,向一片没有回声的空白诉说着已经快要彻底把他淹没了的万念俱灰。
那时的澄田,其实就像是她在山坡上贵树旁掷出的那架纸飞机,被大风吹向缀满银河星光的夜空,只是一心地为了喜欢的人孤独地在漆黑里向前,却从不曾知道自己什么时候能够到达终点,什么时候又终究会被抛回地面,直至摔得遍体鳞伤…

 

CG

 

而贵树所要经历的,则是一次更为漆黑漫长永无止境的孤独之旅,“那真正是一段让人无法想象的孤独旅程,在真正的黑暗中,一味前行着,连一个氢原子也碰不到,只是深信着世界的秘密存在于深渊之中,怀着想要接近这秘密的决心。”

电影里有一段原声音乐,夹杂在清新的鹿儿岛一个阳光明媚的充满海风的气息的早晨里,风格类似玛丽和马克思的主题曲,都采用了ambient music的曲风。而澄田在这样的一天也终于乘上了浪花之巅。也许在她生命里再没有一天能比这一天这么重要了,在毕业前,她终于努力让自己在的内心里找到了一个配得上贵树的理由了,并决定对深藏了五年来的感情宣誓表白了。

“拼命地,只是一味地向天空伸出双手,发射如此巨大的物体,注视于存在于无尽远方的某些东西”与其说,这句话是澄田在说她泪流满面那一刻腾空而起的宇宙飞船,不如说,她终于明白了自己的处境。贵树的内心对她而言,就像是那遥远的无尽远方,无论她是怎样努力地奔跑,也是永远无法到达的。在夜色里,澄田望着渐渐远去的贵树的背影,那是一盏始终在孤单中前行的失落的身影,一张总是对她如此温柔却永远无法被读懂的轮廓。她心里的那盏黯淡的灯火,终于熄灭,曾在黑暗里奋力带她孤独向前的那双翅膀,也终于折断了所有的羽翼,掉落在黑夜的另一边。在泪水落下的那一刻,澄田终于可以不再继续她的无尽的黑暗之旅,而贵树,仍然孤单地穿梭在永无止境的道路上…

升空之时

 

《秒速五厘米》

秒速五厘米

 

多年后的东京,樱花依然如此绚烂地凋落,洁白的花瓣,散乱一地,落进敞开的窗户里。每一朵花瓣都像一颗凋零的心,而每个故事,早已千疮百孔。
“只是一心地前进,想要触碰到那些无法触及的东西,但却不知道那具体指什么。等我回过神来才发现,日渐疲惫的心,是如此痛苦。”

当贵树走进书店,随手拿起一本书,看到当初发射的卫星已到达太阳系外,而属于他的那段旅程,究竟又到达了哪里。

15年了,十五年前的铁道两旁,明里说,真希望明年这时还能一起看樱花。十五年后,铁道两旁,一切都那么地相似,仿佛昨天一般,一样的铁轨,一样漫天的樱花,却终于隔开了世上最远的距离。从我的心到达你的心,秒速五厘米的分离,日日夜夜,终究也已绕地球一圈。当列车终于消失在眼前,你的身影,早已离去。就这样,相信总有一天还能一起看樱花的愿望,也最终风干在记忆里,像挂在悲伤孩子脸上的泪痕,成为永恒…

 

归宿

 

永恒和梦的相似之处,就在于他们都是永远也无法实现的…

当初看完第一遍时,其实我也在想,究竟是什么阻隔了贵树和明里之间的联系,如果他们仍然像过去一样用书信和电话保持着联系,纵使贵树再也没法通过列车前往探望明里,纵使他还没能攒够一个人飞往东京的机票,纵使他的手机里无法理解地没有明里的号码。他们依然还有希望的。

在影片的后期采访里,新海诚对这个话题给出他的一个模糊不清的回答,原话大概是,对于在时间和空间这种无能为力的客观因素下,在这样一个时代,这样的情况可能已经渐渐变得平常。
之后个人在重看时,特别注意了片尾的MV片段的细节,由于放的太快,外加观影时还要注意字幕。所以不可避免地在这一段观众会错失很多重要的细节。重看几遍后,才渐渐看出一些倪端。这里仔细作个回放:
离开书店的贵树再次经过曾经住过的旧宅,视野停留在少年时曾无数次打开的信箱上。
坐在贵树曾经独自前来探望她的那条东京和岩舟之间的路上,长大后的明里发呆地盯着窗外,眼神带着淡淡的迷茫。
辞职后的贵树独自穿梭在繁华的东京的夜景里,漫天飘落的雪花和当初前往探望明里那个夜晚如此熟悉。
十四岁那年,独自看着漫天凋落的樱花的明里。追在贵树后面的澄田。
在那次相聚分离后,一封明里开了个头,却终于再也无话可说的信件。
两人的生活终于渐渐地没有了交集,而此刻,如果当初贵树没有遗失在风里的那封信件在明里手上,事情也许又会有多大的不同吧。
这是明里寄给贵树的最后一封信,之后渐渐地两人的信箱都只剩下一片空白。

 

空白

 

贵树抬头的瞬间,眼前又浮现起在雪地里奔跑着的明里,那时他们都还小,而那张被冻得微微发红的脸,却再也没有给他答案。

十四岁那年,一个人坐在教室角落发呆的明里,一个人坐在教室角落发呆的贵树,没寄出去的信件,没打出去的电话。
MV的最后,画面再次切回到两人未寄出的两封信件。在列车晚点的几个小时里,明里在候车室火炉旁写下的那封,和贵树倾注了两个星期,最终丢失在刺骨的寒风里的那封,拉开了这场秒速五厘米的漫长旅程的序幕,也就此在不经意间注定了两人的结局。

“然后某一天清晨,我发觉自己以前那么认真诚恳的感情,已经消失得无影无踪。”贵树坚持了十五年的感情,十五年来醒着睡着站着坐着梦里梦外都放在心上的竭尽全力想要去维护的那份感情终于还是无疾而终。仍记得在返程东京的路上,将手掌贴在车窗上的贵树,那么坚决地渴望总有一天能够拥有保护明里的力量。在十五年夜以继日的煎熬中,在终于可以兑现诺言的一天到来之时,那个他想保护的人却已经随风而去,消失在岁月的风尘里。

贵树的等待是悲情的,而澄田则是追随着悲情的悲情。爱情本就没有对错,在错误的地方错误的时间遇上正确的人,本就是一场悲剧。花苗是可怜的,她把一个女孩子最青春的年华都赌在了一场从一开始就没有结局的暗恋上,在她成年之后,她一去不返的青春年华留给她的所有记忆只是无数个充满苦涩的夜晚。五年来她所有的心情,都是关于一个男生的,一个她永远也无法走进,总是注视着无比遥远的远方的男生。而这段每天都使她更加痛苦的暗恋心情也注定将会在她记忆深处陪她度过一生…

 

....

 

最后的One more time, one more chance虽然是老歌,却真正切合此时此地,我甚至怀疑新海诚的初衷不过是做一出最好的MV来配合这首歌。

最后伴随歌声的镜头,精致的画面切换,精致的光影变化,随着视线改变的拍摄角度,这一切都更像MV。

人生如同告诉错身而过的列车,再一次回头,也没有one more chance。

夜空下的东京璀璨如星辰。

世界很大,我们很小。


旋律版的。

 

当列车拖着冗长的车轮与铁轨之间铿锵喧嚣渐渐远去,明里和贵树都静静地站定了身子。微微的风拂起了贵树衣领的一角,也吹乱了明里细碎的发梢。
那对十几年前被急驰的列车冲散了的目光,终于重新地触碰到彼此最熟悉最陌生的对半。就这么静悄悄静悄悄地凝望着。四周是如此地安静,只有铁轨旁的信号灯在一旁像个孩子般地观望着。还有漫天漫天洁白馥郁的樱花,一如十五年前那般无声细腻地飘落着。
飘进了公寓楼敞开的窗户里,飘落到响着钟声的小学校园里。
“等到明年的这个时候,我们还一起看樱花吧。”
贵树觉得眼前的轮廓渐渐地模糊了起来,他以为那只是风吹进了沙子,轻轻地抬起手想要揉去。
一片樱花瓣落在他的袖口上。可是,哪来的风呢。只有漫天的樱花始终静静地飘落着,仿佛十五年来从来都不曾停过一般…

Existimans – 目测一个不平凡的次元

“次元”源自日语,意思就是“维度
比如“三次元”即三维,“二次元”即二维。
随着日本动漫在中国的普及,“次元”这个词得以流传开来。
在日本ACG作品当中所指称的“次元”通常是指作品当中的幻想世界以及其各种要素的集合体。例如一个规则秩序读者现存的世界完全不同,比如说魔法钢弹所存在的世界,经常被称为“异次元世界”,或简称为“异次元”。
另外,在传统上以平面的媒体所表现的虚拟角色,如漫画动画中的人物,因其二维空间的本质,而常被称为“二次元角色”,以有别于现实(三维空间)的人物。但是,以三维电脑图像所制作的角色,因其处于虚拟世界又具有立体性的概念,而被称为“2.5次元角色”。
立体造型的玩偶等物,从本来的定义来说应该是三次元角色,但因为本身通常基于二次元角色立体化而来,又或者强调其虚拟的本质,所以有时候也被称为“2.5次元角色”
基于以上的语源,那些只对于ACG当中登场的虚拟角色抱持兴趣或感情,而对现实中的异性没有兴趣的人,就被戏称为“二次元世界的住人”,情况严重者被戏称为二次元禁断症候群。
总而言之,一元可以看成一条线,二元可以看成面,三元则可以看成立体的空间。在超出人类的感知外或许还有四维的存在。
虽然“次元”一词在汉语中有明确的代替词可以表义,但是由于文化对人的潜移默化的影响,它得以在相当一部分人群中被流传和使用。
巡音流歌
===========================
以上来自度娘。
===========================
重点来了。
Existimans – 拉丁文“思维”的意思
Existimans
上图是自己无脑设计的LOGO,虽然被老湿喷的那个这个的。但还是觉得要用它了(因为搞不出更好的了,_(:з」∠)_)。
以前我说过,现在的导航,搜索引擎弱爆了,或者对我来说没有任何的实际用处,直接在专题站或者资料站、特定的站点找东西对于我来说比直接搜索引擎更加方便和快捷。我说过我要重新发明搜索引擎。现在来打打借今天这个不平凡的日志打打名声而已。
============================================
无脑的广告结束。重点来啦~\(≧▽≦)/~
============================================
今天,感谢CCAV,感谢Thiece,感谢WordPress,感谢Stuccess,感谢iMuuzi.。
悼念莫大大受难了19周年。来到地球OL这个万恶的游戏当中。
总之,起立默哀三分钟。
没了。
============================================
感觉正文好短,坑爹呢~(Thiece:没办法,没事可写的,不加些广告文字字数就不够了)

Lisp语言为什么如此先进?

本文转自阮一峰的网络日志

 

上周,《黑客与画家》总算翻译完成,已经交给出版社了。

翻译完这本书,累得像生了一场大病。把书稿交出去的时候,心里空荡荡的,也不知道自己得到了什么,失去了什么。

希望这个中译本和我的努力,能得到读者认同和肯定。

下面是此书中非常棒的一篇文章,原文写于八年前,至今仍然具有启发性,作者眼光之超前令人佩服。由于我不懂Lisp语言,所以田春同学帮忙校读了一遍,纠正了一些翻译不当之处,在此表示衷心感谢。

巡音露卡

============================

为什么Lisp语言如此先进?

作者:Paul Graham

译者:阮一峰

英文原文:Revenge of the Nerds

(节选自即将出版的《黑客与画家》中译本)
一、

如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。

Python模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能,也一起模仿了。至于Ruby,如果回到1975年,你声称它是一种Lisp方言,没有人会反对。

编程语言现在的发展,不过刚刚赶上1958年Lisp语言的水平。

二、

1958年,John McCarthy设计了Lisp语言。我认为,当前最新潮的编程语言,只是实现了他在1958年的设想而已。

这怎么可能呢?计算机技术的发展,不是日新月异吗?1958年的技术,怎么可能超过今天的水平呢?

让我告诉你原因。

这是因为John McCarthy本来没打算把Lisp设计成编程语言,至少不是我们现在意义上的编程语言。他的原意只是想做一种理论演算,用更简洁的方式定义图灵机。

所以,为什么上个世纪50年代的编程语言,到现在还没有过时?简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序(Quicksort)算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。

三、

Fortran语言也是上个世纪50年代出现的,并且一直使用至今。它代表了语言设计的一种完全不同的方向。Lisp是无意中从纯理论发展为编程语言,而Fortran从一开始就是作为编程语言设计出来的。但是,今天我们把Lisp看成高级语言,而把Fortran看成一种相当低层次的语言。

1956年,Fortran刚诞生的时候,叫做Fortran I,与今天的Fortran语言差别极大。Fortran I实际上是汇编语言加上数学,在某些方面,还不如今天的汇编语言强大。比如,它不支持子程序,只有分支跳转结构(branch)。

Lisp和Fortran代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。Lisp刚设计出来的时候,就很强大,接下来的二十年,它提高了自己的运行速度。而那些所谓的主流语言,把更快的运行速度作为设计的出发点,然后再用超过四十年的时间,一步步变得更强大。

直到今天,最高级的主流语言,也只是刚刚接近Lisp的水平。虽然已经很接近了,但还是没有Lisp那样强大。

四、

Lisp语言诞生的时候,就包含了9种新思想。其中一些我们今天已经习以为常,另一些则刚刚在其他高级语言中出现,至今还有2种是Lisp独有的。按照被大众接受的程度,这9种思想依次是:

1. 条件结构(即”if-then-else”结构)。现在大家都觉得这是理所当然的,但是Fortran I就没有这个结构,它只有基于底层机器指令的goto结构。

2. 函数也是一种数据类型。在Lisp语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literal representation),能够储存在变量中,也能当作参数传递。一种数据类型应该有的功能,它都有。

3. 递归。Lisp是第一种支持递归函数的高级语言。

4. 变量的动态类型。在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们指向的数据。

5. 垃圾回收机制。

6. 程序由表达式(expression)组成。Lisp程序是一些表达式区块的集合,每个表达式都返回一个值。这与Fortran和大多数后来的语言都截然不同,它们的程序由表达式和语句(statement)组成。

区分表达式和语句,在Fortran I中是很自然的,因为它不支持语句嵌套。所以,如果你需要用数学式子计算一个值,那就只有用表达式返回这个值,没有其他语法结构可用,因为否则就无法处理这个值。

后来,新的编程语言支持区块结构(block),这种限制当然也就不存在了。但是为时已晚,表达式和语句的区分已经根深蒂固。它从Fortran扩散到Algol语言,接着又扩散到它们两者的后继语言。

7. 符号(symbol)类型。符号实际上是一种指针,指向储存在哈希表中的字符串。所以,比较两个符号是否相等,只要看它们的指针是否一样就行了,不用逐个字符地比较。

8. 代码使用符号和常量组成的树形表示法(notation)。

9. 无论什么时候,整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期。你可以在读取期编译或运行代码;也可以在编译期读取或运行代码;还可以在运行期读取或者编译代码。

在读取期运行代码,使得用户可以重新调整(reprogram)Lisp的语法;在编译期运行代码,则是Lisp宏的工作基础;在运行期编译代码,使得Lisp可以在Emacs这样的程序中,充当扩展语言(extension language);在运行期读取代码,使得程序之间可以用S-表达式(S-expression)通信,近来XML格式的出现使得这个概念被重新”发明”出来了。

五、

Lisp语言刚出现的时候,它的思想与其他编程语言大相径庭。后者的设计思想主要由50年代后期的硬件决定。随着时间流逝,流行的编程语言不断更新换代,语言设计思想逐渐向Lisp靠拢。

思想1到思想5已经被广泛接受,思想6开始在主流编程语言中出现,思想7在Python语言中有所实现,不过似乎没有专用的语法。

思想8可能是最有意思的一点。它与思想9只是由于偶然原因,才成为Lisp语言的一部分,因为它们不属于John McCarthy的原始构想,是由他的学生Steve Russell自行添加的。它们从此使得Lisp看上去很古怪,但也成为了这种语言最独一无二的特点。Lisp古怪的形式,倒不是因为它的语法很古怪,而是因为它根本没有语法,程序直接以解析树(parse tree)的形式表达出来。在其他语言中,这种形式只是经过解析在后台产生,但是Lisp直接采用它作为表达形式。它由列表构成,而列表则是Lisp的基本数据结构。

用一门语言自己的数据结构来表达该语言,这被证明是非常强大的功能。思想8和思想9,意味着你可以写出一种能够自己编程的程序。这可能听起来很怪异,但是对于Lisp语言却是再普通不过。最常用的做法就是使用宏。

术语”宏”在Lisp语言中,与其他语言中的意思不一样。Lisp宏无所不包,它既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。如果你想真正地理解Lisp语言,或者想拓宽你的编程视野,那么你必须学习宏。

就我所知,宏(采用Lisp语言的定义)目前仍然是Lisp独有的。一个原因是为了使用宏,你大概不得不让你的语言看上去像Lisp一样古怪。另一个可能的原因是,如果你想为自己的语言添上这种终极武器,你从此就不能声称自己发明了新语言,只能说发明了一种Lisp的新方言。

我把这件事当作笑话说出来,但是事实就是如此。如果你创造了一种新语言,其中有car、cdr、cons、quote、cond、atom、eq这样的功能,还有一种把函数写成列表的表示方法,那么在它们的基础上,你完全可以推导出Lisp语言的所有其他部分。事实上,Lisp语言就是这样定义的,John McCarthy把语言设计成这个样子,就是为了让这种推导成为可能。

六、

就算Lisp确实代表了目前主流编程语言不断靠近的一个方向,这是否意味着你就应该用它编程呢?

如果使用一种不那么强大的语言,你又会有多少损失呢?有时不采用最尖端的技术,不也是一种明智的选择吗?这么多人使用主流编程语言,这本身不也说明那些语言有可取之处吗?

另一方面,选择哪一种编程语言,许多项目是无所谓的,反正不同的语言都能完成工作。一般来说,条件越苛刻的项目,强大的编程语言就越能发挥作用。但是,无数的项目根本没有苛刻条件的限制。大多数的编程任务,可能只要写一些很小的程序,然后用胶水语言把这些小程序连起来就行了。你可以用自己熟悉的编程语言,或者用对于特定项目来说有着最强大函数库的语言,来写这些小程序。如果你只是需要在Windows应用程序之间传递数据,使用Visual Basic照样能达到目的。

那么,Lisp的编程优势体现在哪里呢?

七、

语言的编程能力越强大,写出来的程序就越短(当然不是指字符数量,而是指独立的语法单位)。

代码的数量很重要,因为开发一个程序耗费的时间,主要取决于程序的长度。如果同一个软件,一种语言写出来的代码比另一种语言长三倍,这意味着你开发它耗费的时间也会多三倍。而且即使你多雇佣人手,也无助于减少开发时间,因为当团队规模超过某个门槛时,再增加人手只会带来净损失。Fred Brooks在他的名著《人月神话》(The Mythical Man-Month)中,描述了这种现象,我的所见所闻印证了他的说法。

如果使用Lisp语言,能让程序变得多短?以Lisp和C的比较为例,我听到的大多数说法是C代码的长度是Lisp的7倍到10倍。但是最近,New Architect杂志上有一篇介绍ITA软件公司的文章,里面说”一行Lisp代码相当于20行C代码”,因为此文都是引用ITA总裁的话,所以我想这个数字来自ITA的编程实践。 如果真是这样,那么我们可以相信这句话。ITA的软件,不仅使用Lisp语言,还同时大量使用C和C++,所以这是他们的经验谈。

根据上面的这个数字,如果你与ITA竞争,而且你使用C语言开发软件,那么ITA的开发速度将比你快20倍。如果你需要一年时间实现某个功能,它只需要不到三星期。反过来说,如果某个新功能,它开发了三个月,那么你需要五年才能做出来。

你知道吗?上面的对比,还只是考虑到最好的情况。当我们只比较代码数量的时候,言下之意就是假设使用功能较弱的语言,也能开发出同样的软件。但是事实上,程序员使用某种语言能做到的事情,是有极限的。如果你想用一种低层次的语言,解决一个很难的问题,那么你将会面临各种情况极其复杂、乃至想不清楚的窘境。

所以,当我说假定你与ITA竞争,你用五年时间做出的东西,ITA在Lisp语言的帮助下只用三个月就完成了,我指的五年还是一切顺利、没有犯错误、也没有遇到太大麻烦的五年。事实上,按照大多数公司的实际情况,计划中五年完成的项目,很可能永远都不会完成。

我承认,上面的例子太极端。ITA似乎有一批非常聪明的黑客,而C语言又是一种很低层次的语言。但是,在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。

附录:编程能力

为了解释我所说的语言编程能力不一样,请考虑下面的问题。我们需要写一个函数,它能够生成累加器,即这个函数接受一个参数n,然后返回另一个函数,后者接受参数i,然后返回n增加(increment)了i后的值。

Common Lisp的写法如下:

  (defun foo (n)
(lambda (i) (incf n i)))

Ruby的写法几乎完全相同:

  def foo (n)
lambda {|i| n += i } end

Perl 5的写法则是:

  sub foo {
my ($n) = @_;
sub {$n += shift}
}

这比Lisp和Ruby的版本,有更多的语法元素,因为在Perl语言中,你不得不手工提取参数。

Smalltalk的写法稍微比Lisp和Ruby的长一点:

  foo: n
|s|
s := n.
^[:i| s := s+i. ]

因为在Smalltalk中,局部变量(lexical variable)是有效的,但是你无法给一个参数赋值,因此不得不设置了一个新变量,接受累加后的值。

Javascript的写法也比Lisp和Ruby稍微长一点,因为Javascript依然区分语句和表达式,所以你需要明确指定return语句,来返回一个值:

  function foo (n) {
return function (i) {
return n += i } }

(实事求是地说,Perl也保留了语句和表达式的区别,但是使用了典型的Perl方式处理,使你可以省略return。)

如果想把Lisp/Ruby/Perl/Smalltalk/Javascript的版本改成Python,你会遇到一些限制。因为Python并不完全支持局部变量,你不得不创造一种数据结构,来接受n的值。而且尽管Python确实支持函数数据类型,但是没有一种字面量的表示方式(literal representation)可以生成函数(除非函数体只有一个表达式),所以你需要创造一个命名函数,把它返回。最后的写法如下:

  def foo (n):
s = [n]
def bar (i):
s[0] += i
return s[0]
return bar

Python用户完全可以合理地质疑,为什么不能写成下面这样:

  def foo (n):
return lambda i: return n += i

或者:

  def foo (n):
lambda i: n += i

我猜想,Python有一天会支持这样的写法。(如果你不想等到Python慢慢进化到更像Lisp,你总是可以直接……)

在面向对象编程的语言中,你能够在有限程度上模拟一个闭包(即一个函数,通过它可以引用由包含这个函数的代码所定义的变量)。你定义一个类(class),里面有一个方法和一个属性,用于替换封闭作用域(enclosing scope)中的所有变量。这有点类似于让程序员自己做代码分析,本来这应该是由支持局部作用域的编译器完成的。如果有多个函数,同时指向相同的变量,那么这种方法就会失效,但是在这个简单的例子中,它已经足够了。

Python高手看来也同意,这是解决这个问题的比较好的方法,写法如下:

  def foo (n):
class acc:
def _ _init_ _ (self, s):
self.s = s
def inc (self, i):
self.s += i
return self.s
return acc (n).inc

或者

  class foo:
def _ _init_ _ (self, n):
self.n = n
def _ _call_ _ (self, i):
self.n += i
return self.n

我添加这一段,原因是想避免Python爱好者说我误解这种语言。但是,在我看来,这两种写法好像都比第一个版本更复杂。你实际上就是在做同样的事,只不过划出了一个独立的区域,保存累加器函数,区别只是保存在对象的一个属性中,而不是保存在列表(list)的头(head)中。使用这些特殊的内部属性名(尤其是__call__),看上去并不像常规的解法,更像是一种破解。

在Perl和Python的较量中,Python黑客的观点似乎是认为Python比Perl更优雅,但是这个例子表明,最终来说,编程能力决定了优雅。Perl的写法更简单(包含更少的语法元素),尽管它的语法有一点丑陋。

其他语言怎么样?前文曾经提到过Fortran、C、C++、Java和Visual Basic,看上去使用它们,根本无法解决这个问题。Ken Anderson说,Java只能写出一个近似的解法:

  public interface Inttoint {
public int call (int i);
}

public static Inttoint foo (final int n) {
return new Inttoint () {
int s = n;
public int call (int i) {
s = s + i;
return s;
}};
}

这种写法不符合题目要求,因为它只对整数有效。

当然,我说使用其他语言无法解决这个问题,这句话并不完全正确。所有这些语言都是图灵等价的,这意味着严格地说,你能使用它们之中的任何一种语言,写出任何一个程序。那么,怎样才能做到这一点呢?就这个小小的例子而言,你可以使用这些不那么强大的语言,写一个Lisp解释器就行了。

这样做听上去好像开玩笑,但是在大型编程项目中,却不同程度地广泛存在。因此,有人把它总结出来,起名为”格林斯潘第十定律”(Greenspun’s Tenth Rule):

“任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。”

如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用(a)使用一种强大的语言,(b)为这个难题写一个事实上的解释器,或者(c)你自己变成这个难题的人肉编译器。在Python的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现局部变量的功能。

这种实践不仅很普遍,而且已经制度化了。举例来说,在面向对象编程的世界中,我们大量听到”模式”(pattern)这个词,我觉得那些”模式”就是现实中的因素(c),也就是人肉编译器。 当我在自己的程序中,发现用到了模式,我觉得这就表明某个地方出错了。程序的形式,应该仅仅反映它所要解决的问题。代码中其他任何外加的形式,都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码,通过宏的扩展自动实现。

(完)

 

=====================================

感谢阮一峰的文章咯。

最近想买副好耳机,然后就搜集了一些“煲”的资料

前言:

发烧音箱需要“煲”,通过让主要模拟电子部件、喇叭物理结构进行磨合,从而进入稳定工作状态、发挥出最佳声音。耳机的音乐空间更注重个人听音、细微改变更容易被呈现,因此要让发烧耳机发挥出最佳状态,就更需要“煲”。但现在,很多新玩家往往不具备“煲耳机”过程中必须有经验和技巧,导致大家拿到的耳机可能还没有发挥出十成的功力,耳机整个表现都还有潜力可挖,立即下结论为时尚早。那么我们应该如何正确的“煲耳机”,走出发烧耳机“煲”的误区?今天我们就一起来探讨一下,要成为准耳机发烧友所应该了解的“煲耳机”知识。

2298780_s18_thumb

发烧耳机要“煲”才能发挥出最佳状态

1、耳机的价格和音质成正比,“煲”的作用有限?

一味的认为耳机高价就等于高质,是入门烧友对产品最大的误解。老鸟都会说:“适合自己的才是最好的”,这句话在笔者看来也绝对是“烧”的经验的结晶。音乐如同食材、器材如同味道,因此每个玩家都会有自己的喜好。在对器材的追逐、体验过程中,玩家都会逐渐形成自己的听音观。业界有实力厂商、同一系列的器材,不同价格往往的确也代表着不同的音质,但从各厂商横向看来,发烧耳机产品差异化十分显著,因此就不能简单的以价格论定音质。

2313474_200779141116684_thumb

发烧耳机产品差异化十分显著,不能简单的以价格论定音质

高端耳机也不是直接插上音源设备就可以发出天籁之音,大家还需要一个正确煲耳机过程,正如新车在正常使用前要经过“磨合期”,使内部的机械装置充分协调配合、达到最佳运作状态一样,耳机内部的发声单元也需要这样的一个“磨合期”从而进入最佳状态,这就是玩家要煲耳机的原因。

2313474_ceVlmro37XCeM_thumb

耳机内部的发声单元需要一个“磨合期”才能进入最佳状态

2、煲耳机,到底能让耳机产生哪些变化?

一款全新高端耳机拿到手,在第一个月甚至第一周内,其声音变化往往是比较明显的。在持续的“煲”的过程中,感受这种声音的微妙提升,其本身也是一件很有成就感的事情,能充分让我们体会到“DIY”的乐趣。通过“煲”,耳机音场往往会显得更疏松、更舒缓,发挥得更自如,而逐渐消除听感上的紧涩、不自然现象。

2313474_306_thumb

通过“煲”,耳机往往会发挥得更自如

煲耳机实际就是在煲振膜,耳机振膜本身在制造过程中就存在内部应力,在粘结音圈和固定在骨架上时又产生了装配应力,煲耳机就是使这些应力逐步消失,使振膜逐步顺化达到最佳发声状态。煲好了耳机,再听音乐时,振膜震动起来就会非常的自如,音质也较先前提高不少,所以对发烧耳机来说,一个月、甚至三个月“煲”的过程是很有必要的。

2313474_2255227_002_thumb

对高端耳机来说,一个月、甚至三个月“煲”的过程是很有必要的

3、煲耳机应该怎么操作?就是长时间放音乐吗?

但是,玩家如果煲耳机的方法不当的话,也是有可能缩短耳机的使用寿命、甚至对耳机会产生永久物理损伤的,功率过载、振膜振幅过大等因素,都会导致振膜拍边等意外情况的发生。而且在煲耳机过程中,如果长时间大功率驱动耳机,会缩短耳机寿命,同样会出现不可修复的物理损伤,因此我们要有技巧的煲耳机。

2313474_950_thumb

耳机煲机时间一般应不少于50小时,可以一周甚至一月内分段完成

煲耳机的音源选择,我们可以利用电脑设备播放白噪音和粉红噪音来交替“煲”,网上有很多这样的煲箱/煲耳机软件下载。其次我们也可以用动态不大的音乐来“煲”,甚至可以选择频响范围非常宽广的“煲机碟”,要注意的是阻抗越高、灵敏度越低的耳机,煲的时间也应该相应的增长,耳机的整体煲机时间一般应该不少于50个小时,可以一周、甚至一个月时间内分段完成。

2313474_20071025102336997_thumb

对随身耳机而言,边用边煲也是一个很好的方法

另外,边用边煲也是一个很好的方法,对便携类耳机尤其适用。使用过程本身也就是耳机的一个磨合过程,因此,利用我们听音乐的时间对耳机进行“锻炼”,是一个很两全其美的方法。

 

总结:

“煲”耳机的最终效果,和耳机的本身的质素也是有非常大的关系的,并不是所有的耳机煲过之后都会变好声,但煲耳机,却绝对可以让发烧器材运行的更稳定。“煲耳机”是一个较长的过程,需要耐心、技巧,以及对声音的发现能力。希望我们今天的努力,可以帮助各位烧友消除一些误区,达到共同成长的目的。

附件

顺便就送上了煲机音乐吧,每天播放3到5次,大约一个星期到一个月就可以了,3个月达到最高。

传送门

 

The rain

好吧,又是一些推荐,觉得不错的图片。不一样的雨

(更多…)