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

如果让莎士比亚、海明威编写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博客

盘点2013年Facebook七大最受欢迎的hack 见证中国开源的力量:“开源力量”2013年度庆典活动亮点汇总 专访APU13讲师、西电朱虎明:概念难以理解成异构编程最大阻力 盘点2013:21款最优秀的开源数据库 苹果三星再次谈判,欲和解所有侵权案 应对iOS in the Car,Google将携手奥迪推Android车载系统 10个技巧让你更轻松地使用AWS 《近匠》第04期:移动开发技术访谈,多看科技CTO王毅——阅读未来 2013年Linux领域重要事件回顾 2013年12月操作系统份额:Windows XP跌破30%大关 Linux小幅上涨 Snapchat存安全漏洞 460万用户信息被窃 年底广告高峰:AdMob团队支招“马上赚钱” 从远程调用框架认识Zookeeper 盘点Hadoop生态圈:13个让大象飞起来的开源工具 【开源推荐】Ejoy2D:“风魂”游戏引擎作者云风的又一力作 Web应用在IE11里的实际使用性能 回顾2013年十个值得关注的WordPress设计主题 为什么Google眼镜注定会失败? 2013移动开发工具盘点:最火原型设计工具 2013年12月份浏览器份额:IE 11暴涨3倍 【PPT集萃】十位一线专家分享Spark现状与未来(二) 2014年,怎么做产品才能获得成功? 年末新游盘点:2014年移动游戏四大趋势 IDC:全球有1850万程序猿 4成爱好者在写代码 PHP开发框架流行度排名:Laravel居首 2013年度最强AngularJS资源合集 研发周报:回顾2013、技术栈的选择、开源成趋势 TIOBE 2014年1月编程语言排行榜:Transact-SQL力挫Objective-C 夺得桂冠 IBM:这五个智能技术的发展,将会改变我们生活 一周消息树: 微软的2013,Surface的2014 Amazon CTO Werner Vogels:云和SaaS正在快速风靡全球 com入门问题 怎么把用程序加入的控件建立事件呢?高手请进! ADO问题:这样的也会报错,高手解释一下!急,在线等待!!!! 如何用VC给Word加载页眉页脚???? 数据挖掘 急需VC++的高手指点一下,北京的最好,呵呵,成了请你吃饭! 98下的闪存问题 在线等~~~~~~~~ 文件的问题 谁来看看,好难啊 关于oracle数据打包的问题 SQL出错了...以前装好一次..不知道被谁搞了,启动不起了..我重装..就这样了 急!!!为什么的为加了<% %>,传 上去就不能打开呢?去掉又可以的,改成客户端运行又可以 如何将服务器a里mysql的所有数据导道服务器b中? 动网论坛6问题:论坛版面信息(版名、斑竹、版面说明)经常自动丢失 大家帮帮我!!!!!!!!!!!!!!! 数据仓库与数据库 动态创建的列和手工填加的列有什么不同吗? SQL语句中openrowset函数的问题?12点以前结帖,在线等待!!!!!!!!!!!!!!!!! 请问在win2000server中对于ftp设置... Promise真的是混蛋!B死他!(驱动高手帮忙) 客户端怎么封装数据库? 谢谢 杀不出毒,机子还很慢,请大家看看 急啊!系统有问题! 请问怎样知道自己程序的某个DLL是否已经加载? 将数据导出到excel,同名文件自动覆盖应该怎么做? 求教高手! 制作发邮件程序出错,高手请教! 求助高手:在JavaScript中如何赋值给父窗体上的某一ASPX控件? 菜鸟的问题 怎么web页面控制打印范围? 推箱子的每一关是用算法算的,还是人编的? 为什么北京的高程准考证到现在还没有发呀??? 谁有类似万网的域名查询系统??高分相送! 我想搞软件开发,学点网络知识,请问有多大用处? 在ASP.Net中,用VB.net写代码,怎么取得到的记录集中的记录个数啊? 请教双网隔离方案 重装系统以后,如何对Microsoft Outlook里的各种参数、选项进行设置? 求OA设计方案 请 ychuiming(飞天),hkbarton(宁静至远||淡泊明志) 进来接分 在ASP.Net中,用VB.net写代码,怎么取得到的记录集中的记录个数啊? pb中有没有与或操作符?就象VB中的Xor这类操作符? 如何从一个单一的JSP程序员迈进J2EE的世界--请高手指点迷津 第一次来csdn,请各位多多关照。随便问一个巨傻的关于BDE的问题。 离职,却被原来公司经理阴了一下 求AutoResize控件(分不够可加) 谁做过远程代理的程序(急,100分求助,不够再给) mm不让我去接她 树形菜单的问题 如何限制对SQLSERVER的请求访问数? 各位,跪谢了!不能见死不救啊! session 问题 我的服务器 无法更改 session值了 structured writing是什么意思? Abstract should be structured under the heading 'abstract' 投英文文章时邮件里有这样一句话 搞不太懂 明知故问英语怎么写 英语.请大家看看有没有语序大问题(小问题就算了),掉没掉什么词,①Current science is developing to show the completion of this theory.②He made friends with them to affect their view③He has doubted about her behavior in 俩英语句子,请大家看看有没有语序大问题,掉没掉什么词,①there are some great influence for health to exercise ②it was discovered represent medical progress Be there in August.I can't decide which one i w I can't use your pen,( )there is no ink in it. 什么什么地奚落 什么什么是填一个词 日语中发音类似“奚落获悉”相同的词是什么意思 自失的词性是 涩是什么词性 怎么理解其引申意义? 农夫山泉派员举报《京华时报》 称实行20家网贷平台陷兑付危机 投资人面临疑百度帮新客户侵权 百度老客户状告百美国国务卿克里促埃及政府勿延长全国紧局势动荡民众对政治改革灰心 埃及再现缅甸发生沉船事故 载有70人船只仅8民调显示超3/4德国人认为美国国安局美国国务卿克里促埃及政府勿延长全国紧局势动荡民众对政治改革灰心 埃及再现南华早报:“监听事件”削弱美国软实力外媒:十八届三中全会或为“革命性”改最最火爆的杭州赛区海选下周日开锣124位民工工资怎么办?杭州市区天气预报“快房专家导购团”为你在线答疑解惑C罗无限期“伤停”全怪加纳巫师?标题导航昨天查处违反错峰限行车辆450辆5次杭州社区垃圾分类大赛今起欢迎社区报名全国卫视19岁学生把毒药搁进了奶奶的饮料里却明天的买房讲座专家告诉你腾蛟记狂行六道剑舞凌天笑忘西游传奇武道成神传洪荒之流氓大佬混元大罗天道意能哥布林传奇寒雨迷蒙妖仙缘少林寺旅游一线天旅游峻极峰旅游大法王寺旅游嵩岳寺塔旅游嵩阳书院旅游洛阳老街旅游塔尔寺班禅行宫旅游英德奇洞温泉旅游成都市博物馆旅游南山一棵树观景园旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘