说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如果让莎士比亚、海明威编写JavaScript代码

HTML文档下载 WORD文档下载 PDF文档下载
每位开发者都有自己习惯的编码风格,而文学作家也有自己标志性的写作方式。试想一下,如果让莎士比亚、海明威这样的大文豪来写JavaScript代码,会呈现出什么样的风格呢?

本文作者Angus Croll是Twitter工程师、JavaScript迷、文学迷,并且非常喜欢作家海明威。他在梦中"梦见"一些名人编写JavaScript代码,不同的作家呈现出各种编程风格,大家不妨一起来品尝下。

下面是对原文的摘译。

最近,我做了一个梦,我请海明威和其他四位文学名人替我编写JavaScript代码,一个函数返回一个给定长度的斐波纳契数列。有趣地是,他们每个人都以不同的方式完成了这一题,并且都做的很好——只是我想说,每个解决方案工作起来都好比广告(即使是Andre Breton的),后来我又请包括海明威在内的7名文豪用JavaScript来编写阶乘,似乎一切都那么神奇,但他们都成功地完成了,大家不妨来看看结果吧。

一、实现斐波纳契数列

1.欧内斯特·海明威(Ernest Hemingway 美国作家)

代表作:《老人与海》《太阳照样升起》《永别了,武器》《丧钟为谁而鸣》

function fibonacci(size) {  var first = 0, second = 1, next, count = 2, result = [first, second];  if(size < 2)    return "the request was made but it was not good"  while(count++ < size) {    next = first + second;    first = second;    second = next;    result.push(next);  }  return result;}

简洁明了的代码,没有任何多余的字母和变量,没有精心设计的逻辑和聪明的变量命名,非常平淡地表明了它是做什么的,仅此而已,这就是海明威的魅力之处。

2.威廉·莎士比亚(William Shakespeare 英国诗人、戏剧家

代表作: 《哈姆雷特》《奥赛罗》《李尔王》《罗密欧与朱丽叶》等

function theSeriesOfFIBONACCI(theSize) {  //a CALCKULATION in two acts.  //employ'ng the humourous logick of JAVA-SCRIPTE  //Dramatis Personae  var theResult; //an ARRAY to contain THE NUMBERS  var theCounter; //a NUMBER, serv'nt to the FOR LOOP  //ACT I: in which a ZERO is added for INITIATION  //[ENTER: theResult]  //Upon the noble list bestow a zero  var theResult = [0];  //ACT II: a LOOP in which the final TWO NUMBERS are QUEREED and SUMM'D  //[ENTER: theCounter]  //Commence at one and venture o'er the numbers  for (theCounter = 1; theCounter < theSize; theCounter++) {    //By divination set adjoining members    theResult[theCounter] = (theResult[theCounter-1]||1) + theResult[Math.max(0, theCounter-2)];  }  //'Tis done, and here's the answer.  return theResult;  //[Exuent]}

大家可以看看莎士比亚是如何使用抑扬格五音步编写注释的。熟悉他戏剧的朋友应该对抑扬格五音步非常熟悉吧。

3.安德烈·布勒东(Andre Breton 法国诗人)

代表作:《超现实主义宣言》

function Colette(umbrella) {  var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;  Array.prototype.embrace = [].push;  while(2 + staircase++ < umbrella) {    bassoon = galleons + brigantines;    armada.embrace(brigantines = (galleons = brigantines, bassoon));  }  return armada;}

整个解决方案的逻辑非常清晰、优雅,在galleons、brigantines、bassoons这三个之间,使用逗号操作符对它们进行同时转移。

4.罗贝托·波拉尼奥(Roberto Bolano 智利小说家、诗人)

代表作:《荒野侦探》《2666》

function LeonardoPisanoBigollo(l) {  if(l < 0) {    return "I'd prefer not to respond. (Although several replies occur to me)"  }  /**/  //Everything is getting complicated.  for (var i=2,r=[0,1].slice(0,l);i<l;r.push(r[i-1]+r[i-2]),i++)  /**/  //Here are some other mathematicians. Mostly it's just nonsense.  rationalTheorists = ["Archimedes of Syracuse", "Pierre de Fermat (such margins, boys!)", "Srinivasa Ramanujan", "Rene Descartes", "Leonhard Euler", "Carl Gauss", "Johann Bernoulli", "Jacob Bernoulli", "Aryabhata", "Brahmagupta", "Bhaskara II", "Nilakantha Somayaji", "Omar Khayyám", "Muhammad ibn Mūsā al-Khwārizmī", "Bernhard Riemann", "Gottfried Leibniz", "Andrey Kolmogorov", "Euclid of Alexandria", "Jules Henri Poincaré", "Srinivasa Ramanujan", "Alexander Grothendieck (who could forget?)", "David Hilbert", "Alan Turing", "von Neumann", "Kurt Gödel", "Joseph-Louis Lagrange", "Georg Cantor", "William Rowan Hamilton", "Carl Jacobi", "Évariste Galois", "Nikolay Lobachevsky", "Rene Descartes", "Joseph Fourier", "Pierre-Simon Laplace", "Alonzo Church", "Nikolay Bogolyubov"]  /**/  //I didn't understand any of this, but here it is anyway.  return r  /**/  //Nothing happens here and if it does I'd rather not talk about it.}

长短不齐的段落,缺少分号,使用隐式全局变量——对每一个变量都做进一步深入的说明。

5. 查尔斯·狄更斯(CharlesDickens 英国小说家)

代表作:《匹克威克外传》《雾都孤儿》《 双城记 》等

function mrFibbowicksNumbers(enormity) {  var assortment = [0,1,1], tally = 3, artfulRatio = 1.61803;  while(tally++ < enormity) {    //here is an exceedingly clever device    assortment.push(Math.round(assortment[tally-2] * artfulRatio));  }  //should there be an overabundance of elements, a remedy need be applied  return assortment.slice(0, enormity);}

从代码中可以看出,他没有体会到斐波那契数列的基本理念,而是采用乘法解决。代码里也有些有趣的命名,但缺乏核心地理解。

二、实现factorial(n)阶乘

以上是这些著名的作家用JavaScript编写斐波那契数列,下面再让我们看看,作家们是如何用JavaScript/CoffeeScript编写factorial(n)的。

1. 杰克·凯鲁亚克(Jack Kerouac 美国小说家)

代表作:《在路上》《贩毒者》等

/*...the only numbers for me are the mad ones, take forty-three like asteam engine with a talky caboose at the end*/ n = 43, /*and that lankyfellow in a cocked fedora*/ r = 1 /*then back to our number, our madnumber, mad to become one*/ while (n > 1) /*mad to descend*/ n--, /*madto multiply*/ r = r * n /*and at the end, you see the blue center-lightpop, and everybody goes 1.4050061177528801e+51...*/r

上面代码只能返回43的阶乘,如果想要实现另一个数的阶乘,你还需重写代码。不过,最值得注意地是,注释和代码几乎没有区别,无法分辨,从侧面反映了Kerouac的风格,很长、狂野和狂想式的流露。

2.塞缪尔·约翰逊(SamuelJohnson 英国作家、诗人)

代表作:《英语大辞典》《伦敦》《人类欲望的虚幻》等

# In which various NUMBERS are summon'd by# means of ELECTRONICK CONJURYfactorial = (n) ->   # All argument is against it; yet all belief is for it   return 1 unless n   # Ingenious sophistry to prove the palp'bly OBVIOUS   return 1 if n is 1   # Recursion (n.)   # a program that calls 'pon itself in the manner of   # a dog returning unto its VOMIT   return n * factorial n - 1

整段代码比较稀疏,中间也掺杂着Johnson的精言妙语:其中,他也对factorial(0)应该为1进行了怀疑,他应该用一个完整的句子来表达factorial(1)就是1,从其字典里进行推测,完成了一个具有讽刺定义的递归解除。

Johnson的整个解决方案充满着艺术和模仿的结合——带有整洁表达式地温和的自我嘲讽和真正美丽的混合。

3.詹姆斯·乔伊斯(JamesJoyce 爱尔兰作家、诗人)

代表作:《尤利西斯》

function hacktorial(integette) {  var nonthings = [undefined, null, false, 0, '', NaN];  var resultution = 1;  if (integette == 0) {    //behold the strangerous zeroine!    resultution = 1;  } else {    while (integette > 1)    //caligulate by multicapables    resultution = resultution * integette--;  }  with(resultution) {    var duodismal =  Function('return this').call(toString(12));    var disemvowel = Function("n","return n?parseInt(n,12):'0'")    return [      disemvowel(duodismal.slice(0,-1)),      'shillings and',      disemvowel(duodismal[duodismal.length-1]), 'pence'    ].join(' ');  }  //klikkaklakkaklaskaklopatzklatschabattacreppycrottygraddahappluddyappladdypkonpkot!}

Joyce不仅仅是解决了阶乘问题,前半部分代码已经解决了这个问题,但Joyce坚决把结果转换为当时的货币:先令和便士。

结果:

hacktorial(3) //"0 shillings and 6 pence"hacktorial(4) //"2 shillings and 0 pence"hacktorial(7) //"420 shillings and 0 pence"hacktorial(21) //"4257578514309120000 shillings and 0 pence"

4.理查德·费曼(Richard Feynman美国物理学家)

代表作:《费曼物理学讲义》《物理之美》

//using Ramanujan's approximationfunction fractorail(n){  with(Math) {    var r = sqrt(PI)*pow(n/E,n);    r *= pow(8*pow(n, 3) + 4*(n*n) + n + 1/30, 1/6);    return r;  }}

费曼的工作的特点是具有大胆的创意和非常古怪的才华,从它所编写的这段代码中也能看出。

结果,不要担心一些“舍入误差”,如果你非常熟悉JavaScript,你就应该知道:

fractorail(3); //6.00005fractorail(1.1); //1.04671fractorail(5.2); //169.40628

5. 阿瑟·柯南·道尔(ArthurConan Doyle世界著名小说家)

代表作:《福尔摩斯探案集》《失落的世界》

"use strict";//In solving a problem of this sort, the grand thing is to be able to reason backwards...//some things are easier known than explained!var caseHistory = new Object({2:2, 6:3});function unfactorial(evidence){    //first, humility!    if (evidence === 1) {      return "Watson, I am at a loss!"    }    //second, logical precedence!    if(caseHistory[evidence]){      //elementary!      return caseHistory[evidence];    }    //third, eliminate the impossible!    if(evidence === 0 || evidence % 24 !== 0) {      return "charlatans!";    }    //fourth, deduction!    var theDeduction, enumarator = evidence, denominator = 1;    while(enumarator % denominator === 0) {      enumarator = enumarator/denominator++;      if (enumarator === denominator) {        theDeduction = enumarator;      }    }    theDeduction = theDeduction || "impostors";    //What one man can invent another can discover!    caseHistory[evidence] = theDeduction;    //What remains, however improbable, must be the truth!    return theDeduction;}

正如大家想象的那样, 柯南道尔的设计过程是精确和认真有序的,此外,大家可能注意到,他让其应用程序在strict模式运行——容不得半点马虎。

6.简·奥斯汀(Jane Austen 英国小说家)

代表作:《理智与情感》 《傲慢与偏见》

factorial = (function() {  //I declare...  var ledger = {};  return function reckoning(quantity) {    if (isNaN(quantity)) {      console.log("I have not the pleasure of understanding you");      return;    }    //It is a truth universally acknowledged that two values    //can only be adjudged truly agreeable by means of ===    if (quantity === 0) {      return 1;    }    //Mr Crockford teaches that we be wary of inherited property...    if (ledger.hasOwnProperty(quantity)) {      return ledger[quantity];    }    //Pray persist until an answer is furnished    return ledger[quantity] = quantity * reckoning(quantity - 1);  };})();

Jane Austen解决方案的亮点之一是代码工艺和结构的完整性,主要体现在代码块的整洁上,她调用模块模式,隐藏历史数据(或ledger)在上层结构的文件夹里;第二个则是体现了Jane Austen的俏皮,甚至是颠覆性的,对power的讽刺和荒谬的约定。

7. 欧内斯特·海明威(ErnestHemingway 美国小说家)

代表作:《老人与海》《太阳照样升起》等

//Economy.function factorial(n) {  return n < 2 ? 1: factorial(n-1)*n;}
代码足以说明一切。

我们从中所学到的

这些著名的小说家、诗人、戏剧家的伟大之处在于他们勇于开拓新方式,尝试新的技术并且打破我们一直所遵循的规律。

最优秀的英语作家具有着对规则的蔑视。——Steven Pinker

JavaScript作为最流行的编程语言之一,它的进步取决于开发者们地大胆创新、研究以及发现新模式,这样才能惠及更多的人。

各位开发者们,如果让你们喜欢的作家来编写JavaScript代码会是啥样呢?不妨一起探讨下吧。

来自: Angus Croll博客

指点传媒CEO专访:紧握二三线市场用户命脉 专访Waygo创始人:白切鸡怎么翻译? 探究共享软件海外营销新策略(西安站) 讲师秀8:车音网沈康麒和他的智能驾车服务 数据可视化独领风骚:看这6家初创公司如何玩转大数据? 最新研究显示:IE10防恶意软件能力比Chrome等浏览器都要强 Windows Blue正式定名Windows 8.1 对Windows 8及RT用户免费 Testin云测试破1000万次 自动化测试成趋势 接手Android后首次接受媒体采访 Sundar Pichai谈Android未来 C语言实现二分法查找 让开发者高效编程的10个新框架 Google Analytics中显示访客停留时间为“0”的秘密 大数据之惑 麻省理工三位物理学家自建数据库服务Cloudant 融资1200万美元 网页浏览器进入再造新时代 AMD揭露HSA运算架构新技术hUMA细节 美团悄然上线云主机服务:与亚马逊殊途同归,还是另有谋划? 微软发布deep-tech团队招募令,期望获得下一代开发者的支持 2013谷歌I/O开发者大会:发布多个软件产品和服务 C语言实现二分法求解方程 开发测试云与虚拟化解决方案 学苹果?微软淘汰Points支付系统改用Gift cards 甲骨文改变Java版本号命名方式 [CTO俱乐部第97期]中科院、腾讯、深圳明源研发团队管理经验分享 Android Studio来了,它能取代Eclipse吗? Google Play Game不够开放,被OpenKit炮轰 Google Play Game Service详解 不仅提供API更提供后端支持 IBM Power走向Linux,是必然的! 美国国家安全局解密特工培训手册:如何利用谷歌等大众搜索工具搜集保密数据 微软IE10如何保护上网安全(大图) 谷歌无畏苹果的理由:强力的算法和基础设施架构 如何将HTML文本直接显示在CppWebBrowser中?(不使用临时表) PB中有没有类似VC中ListMember功能的东东呢? 怪啊怪啊,ListView的问题 如何取得任务栏的高度? 哪里有《Effective STL》下载? 哪里有《Effective STL》下载? Load Servlet ? word 和 数据库 谁能帮我看一下程序? 帮我看看这几个宏什么意思? 程序员!女人对你重要么???? 这是我第四天的C#学习笔记,敬请高手指教 谁先回来马上给分(简单问题) 机器的usb问题!! 兄弟们,小弟刚接触JSP,帮忙解决一个问题。 请教PHP.INI配置里的SESSION! 刚开始接触.net 求购程序,请进. 求购程序 求购程序 推荐一些适合初学者看的书吧 一家位于Montreal, Canada的公司,求购一个程序 如何保存UNICODE的字符串到硬盘上 如何将HTML文本直接显示在CppWebBrowser中?(不使用临时表) 如何保存UNICODE的字符串到硬盘上 redhat第4第5两个iso文件是做什么的 关于jsp做客户端调用ejb的问题?????望各位兄弟们救救我吧!!!!! COOL!将所有菜单设置为半透明的代码(只适用于WIN2000以下版本) 请问谁知道如何用jakarta-jmeter进行压力测试? 如何判断文件夹是否存在 在Win2K Server安装Oracle817时,没有安装数据库,后在创建数据库时出现"ORA-12560:TNS:协议适配器错误"... 请教.net服务器问题 解决这个问题,给你200分!!!!!!!!!!(回头追加给你!) 我是初学者,请问.net framework先进性在哪里? 有谁试过用JAVA编FTP软件? 很简单的listBox问题,HELP 今年大四,现在找工作,求助,我怎么样………UP有分。 寻找!! IE的文本输入框,输入一字符会联想,请问怎样去掉这个联想?(Win2K) 哪位大俠能賜教 哪位大俠能賜教 你们说VC到底要学些什么?VC更偏底层,总做这种纯技术总也做不完。迷茫~~~ 请问,在Oracle里建trigger是不是有什么说法呢?一个正常的不能在正常的trigger在Oracle里运行也说compilation errors. 请教:提取字符串里每个字符首字母,谢谢!!! aa模块代码 关于强烈要求恢复可用分增长、可用分转移、非技术区得分转换为可用分的建议!! SOS:如何找到窗口中多个进程其中我所需要的那一个? SOS:如何找到窗口中多个进程其中我所需要的那一个? 笑的人再发几个 query1.next是将指针移向下一条,啊向上条一记录是用什么命令呢? 对话框中使用工具栏如何进行更新? i really have no more time! this form is issued 是写在一份有两部分的表格的第二部分的头子上的,两份表都没有要钱啊~ 这题目挺简单的,可是我看不懂,麻烦用文字语言说明下谢谢了. have more time for 翻译 form.ShowDialog(this)this指的是什么? 范是什么意思 高中化学必修二 三段法 题目.过程答案正确吗?又快又正确立给好评 there is a book on the desk改为复数句 有范是什么意思 一道初三数(或高一)学题 要分析的过程 This is my new shirt改为否定句 there is an apple on the desk同义句. “女”字旁加一个“青”字读什么?是繁体字吗?我不知道是否读“qian” 但搜索结果是否认的 It is not my shirt 和 This is not my shirt ,有什么区别 There is an apple on the desk改为--- --- --- --- there on the desk 温带季风气候的年平均气温是多少 you can have more time.我是在书上看见的,一般都这么用吗? 宾语从句的相关练习及答案.主要是翻译句子的 用:因为.就...造一个比喻句和一个拟人句 You'll have more time for s_______. 明星范是什么意思 Whose jacket is this?Is it Mr.Wang's?No,____is on the desk.英语急死我了!求求各位亲了! 一月平均气温都在0度以下的是?下列各组省区中,一月平均气温都在0度以下的是:A.川、滇、黔B.湘、粤、赣C.鄂、豫、皖D.陕、甘、宁 在form的onsubmit后面的函数中,//return:提交 //return false:不提交 ,那return true 谢 是please not talk any more还是please not to talk any more? there is a knife on the table.的复数形式是什么 iphone版的扩散性MA百万亚瑟王一直更新闪退怎么办? 如图:已知DE//FG,AC,BC分别是角BAE和角ABG的角平分线,AC于BC交于点C,求证:AC垂直BC还有一题,锐角三角形ABC中,角A=52°,边AB,AC的垂直平分线相交于点O,求角BOC的度数。这题本来就没图,上面 小学三年级的,第三题,请学霸帮忙 英语你吃饭了吗怎么说 翻译Please let us have more time,will you? 赤字旁加个贞是什么字左边一个赤,右边加个贞字读什么? 你吃饭了吗?用英文怎么说 左边一个“女”右边一个“贞”是什么字?读什么? 运动会场面描写的结尾怎么写 Let's read form the b______ of this book 金字旁一个贞是什么字 Article of association和memorandum of association何意? 有点范 是什么意思 为了改善居民住房条件,我市计划用未来两年的时间,将城镇居民的住房面积由现在的人均约为10平方米提高到12.1平方米,若每年的年增长率相同,则年增长率为()A 7% B10% C11% D12% 英语翻译通常的翻译“谅解备忘录”似乎是外交达成的协议,那么在公司企业、外资银行内,这是个什么文件?中文叫什么? Have,not,chat,with,you,for,a,long,time是什么意思 This is Helen spaeking.的意思 memorandum of association是什么意思 “失范行为”的定义是什么? This is Helen中文怎么说 memorandum of understanding 的中文翻译是什么? i have not heard ( )you for a long time 沉默的什么组词沉默的.什么 we have time for one more person.如何翻译 I have not heard from you for some time ,so 怎么接句子? 英语翻译急 onBlur="check(this.form,this) 谁能给我未出生的孩子起个有含义有诗意有好听的名字我姓范?谁能给我未出生的孩子起个有含义有诗意有好听的名字?我姓范. 与沉默老狼相近的词是? 谁帮忙解释下javascript:this.disabled = true;this.document.form.submit();在IE下正常,但是在360极速浏览器下不正常 跳舞起范怎么解释,我们跳一个民族舞,其中老师在教的过程要我们起个范,准确的解释是什么 (法律)第7题,求解释,保证好评 ......function clckcntr(eventobject){if(event.ctrlKey && window.event.keyCode==13){clckcnt++;if (clckcnt>1) {alert('留言正在提交,请耐心等待!');return false;}document.FORM.Submit.disabled = true; this.document.FORM.submit();}}......这段 U-Kiss的起范的英文名是什么?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘