阅读更多

每位开发者都有自己习惯的编码风格,而文学作家也有自己标志性的写作方式。试想一下,如果让莎士比亚、海明威这样的大文豪来写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. 查尔斯·狄更斯(Charles Dickens 英国小说家)

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

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 a
steam engine with a talky caboose at the end*/
n = 43,
/*and that lanky
fellow in a cocked fedora*/
r = 1
/*then back to our number, our mad
number, mad to become one*/
while (n > 1)
/*mad to descend*/
n--,
/*mad
to multiply*/
r = r * n
/*and at the end, you see the blue center-light
pop, and everybody goes 1.4050061177528801e+51...*/
r

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

 

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

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

# In which various NUMBERS are summon'd by
# means of ELECTRONICK CONJURY
factorial = (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.  詹姆斯·乔伊斯(James Joyce 爱尔兰作家、诗人)

代表作:《尤利西斯》

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 approximation
function 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.00005
fractorail(1.1);
//1.04671
fractorail(5.2);
//169.40628

 

5.   阿瑟·柯南·道尔(Arthur Conan 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.   欧内斯特·海明威(Ernest Hemingway 美国小说家)

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

//Economy.
function factorial(n) {
  return n < 2 ? 1: factorial(n-1)*n;
}

代码足以说明一切。

我们从中所学到的

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

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

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

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

via:Angus Croll博客

来自: CSDN
9
1
评论 共 9 条 请登录后发表评论
9 楼 iaimstar 2013-07-15 14:39
clxy 写道
草拟个儒道佛三教版的Hello world。

儒:
function helloWorld() {
	var 子曰 = document.write;
	子曰("天下有道,丘不与易也!");
}


道:
function helloWorld() {
	document.write("人法地,地法天,天法道,道法自然。");
}


佛:
function helloWorld() {
	//document.write("");
}





佛的精髓了
8 楼 Ethan.Lu 2013-07-14 22:35
这是何等境界
7 楼 clxy 2013-07-13 12:26
草拟个儒道佛三教版的Hello world。

儒:
function helloWorld() {
	var 子曰 = document.write;
	子曰("天下有道,丘不与易也!");
}


道:
function helloWorld() {
	document.write("人法地,地法天,天法道,道法自然。");
}


佛:
function helloWorld() {
	//document.write("");
}


6 楼 Leon.Wood 2013-07-12 18:29
first blood!
double kill!
5 楼 steafler 2013-07-12 17:45
程序员中的文艺青年啊,小说读过不少呀
4 楼 linger_yan 2013-07-12 17:41
对啊,让他们写注释挺不错。
3 楼 sulifeng 2013-07-12 16:37
真文艺啊
2 楼 yunzhu 2013-07-12 11:02
这作者真牛X,程序员中的文艺青年啊
1 楼 dsjt 2013-07-12 11:02
如果让莎士比亚、海明威来写注释

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • horatio:莎士比亚编程语言的javascript编译器

    钟表 莎士比亚编程语言的javascript编译器

  • 高红梅:第三章 海明威社会身份的定位 第一节 文学梦与作家身份的认同

    第三章 海明威社会身份的定位 海明威一生都在世界各地旅行,其足迹遍及欧洲、非洲、美洲和亚洲,有世界公民的美誉。正如学者卡洛斯·贝克(Baker ,Carlos)所言,“早在他五十五岁荣获诺贝尔文学奖多年以前,海...

  • 莎士比亚戏剧的现代西方文学理论研究述评

    从莎士比亚的同时代人本·琼生起始,关于莎剧的评论和研究几乎贯穿整个西方文学理论发展史,从精神分析、女权主义、存在主义、原型批评、接受理论、后殖民主义批评、生态批评、后现代主义、一直到新历史主义构成了一条...

  • 无心剑中译莎士比亚《可否将你比夏天》

    无心剑翻译的莎士比亚十四行诗第18首,将原诗的韵律与情感巧妙地融入中文之中,展现出了译者深厚的翻译功底和对原文意境的深刻理解。这首诗是莎士比亚对所爱之人不朽之美的赞美,以及通过诗歌赋予其永恒生命的承诺。

  • 无心剑中译莎士比亚《无价柔情长相伴》

    莎士比亚十四行诗第29首 Sonnet 29 - 无价柔情长相伴 When in disgrace with fortune and men’s eyes I all alone beweep my outcast state, And trouble deaf heav’n with my bootless cries, And look upon ...

  • 莎士比亚数据集_如何使用深度学习写莎士比亚

    莎士比亚数据集 “开玩笑地说了许多真实的话。” ―威廉·莎士比亚, 李尔王 “噢,主啊,当心嫉妒; 是嘲笑的绿眼怪物 它以肉为食。” ― 奥赛罗的威廉·莎士比亚 “有个星星在跳舞,在那之下我出生了。” 威廉...

  • shakespeare:莎士比亚元数据管理系统

    莎士比亚 莎士比亚元数据管理系统

  • 人生永无止境的意思是什么_人生就是永无止境的奋斗---读海明威《老人与海》...

    海明威,这个中过两百多块弹片的硬汉作家,在《老人与海》中,写出了挑战极限的勇敢,诠释了关于生命的内涵,读来心灵为之震颤。小说的梗概是:老渔夫桑提亚哥84天未捕到鱼了,他几乎饿死,但仍不放弃、不服输,同行...

  • 用nltk模仿莎士比亚写十四行诗

    找完《大道争锋》中的诗句还不过瘾,如果能自己来写才有点意思。于是我就从英文诗开始,用莎士比亚的风格来写十四行诗。 开始编程 学习素材 既然要模仿莎士比亚写十四行诗,首先就得搞到莎士比亚的原文,给我们的AI...

  • shakesnippet:提供随机选择的莎士比亚摘要

    片段提供随机选择的莎士比亚摘要。 莎士比亚的文字来自。 有关更多详细信息,请参见。安装npm install shakesnippet用法shakesnippet( { numberOfLines: 20 }, logSnippet);function logSnippet(error, snippet) { ...

  • sonnet-116:通过输入重新发现莎士比亚著名的十四行诗

    通过键入重新发现莎士比亚著名的十四行诗。 在浏览器中打开index.html 。

  • chatGPT代码写的有点好啊,程序员要失业了?

    能直接生成代码、会自动修复bug、在线问诊、模仿莎士比亚风格写作……各种话题都能hold住,它就是OpenAI刚刚推出的——ChatGPT。有脑洞大开的网友甚至用它来设计游戏:先用ChatGPT生成游戏设定,再用Midjourney出图...

  • 莎士比亚猴子:一种使用猴子和遗传算法编写莎士比亚的网络应用程序

    莎士比亚猴子 编写莎士比亚或任何其他短消息的遗传算法。 允许用户调整进化参数。 站点: :

  • 100天精通Python丨基础知识篇 —— 06、一千个程序员有一千套编码规范

    一千个读者有一千个哈姆莱特。 -- 莎士比亚 一千个程序员有一千套编码规范。 -- 不吃西红柿

  • Tensorflow快餐教程(12) - 用机器写莎士比亚的戏剧

    上一节我们学习了Tensorflow的高层API封装,可以通过简单的几步就生成一个DNN分类器来解决MNIST手写识别问题。 尽管Tensorflow也在不断推进Estimator API。但是,这并不是工具的全部。在Tensorflow官方的API方外,...

  • shakespeare-magnets:莎士比亚式折弯的在线多用户冰箱磁铁模拟器

    它是客户端-服务器同步库的演示/测试平台,并且由于它而需要的实际代码非常少。 在后台,浏览器通过websocket与服务器进行通信。 用ES6编写,由Babel和Browserify编译。 设置 # npm install # npm start Server ...

  • 西门子S7-200SMART与V20变频器基于Modbus通讯的稳定控制及应用

    内容概要:本文详细介绍了西门子S7-200SMART PLC与V20变频器通过Modbus RTU协议进行通信的具体方法和技术要点。首先阐述了硬件连接方式,强调了正确的接线和参数设置对于稳定通信的重要性。接着深入讲解了PLC程序的设计,包括Modbus主站初始化、启停控制、频率设定以及断电自恢复等功能模块的实现。此外还分享了一些实用的经验技巧,如避免通讯冲突、处理浮点数转换等问题。最后提到该方案已在实际生产环境中成功应用,表现出良好的稳定性和可靠性。 适合人群:从事自动化控制系统集成的技术人员,特别是熟悉西门子PLC和变频器产品的工程师。 使用场景及目标:适用于需要将旧型号PLC与变频器进行高效集成的企业,在不影响原有设备的基础上提升系统的智能化水平,减少人工干预,提高生产效率。 其他说明:文中提供了大量具体的编程实例和参数配置指南,有助于读者快速掌握相关技能并应用于实际工作中。同时提醒读者注意一些常见的错误及其解决方案,帮助规避潜在的风险。

  • 西门子PLC电机控制程序:封装好的功能块助力高效工业自动化

    内容概要:本文详细介绍了西门子PLC中用于电机控制的封装功能块,涵盖正转、反转、变频控制等多种功能。通过简化底层代码,提高编程效率和系统可靠性。文章展示了如何使用功能块实现正转、反转、变频控制、模拟量处理、故障处理等功能,并结合用户自定义数据类型(UDT)和多重背景技术,实现对大量电机的高效管理。此外,还提供了具体的代码示例,帮助读者更好地理解和应用这些功能块。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是那些需要频繁处理电机控制任务的人群。 使用场景及目标:适用于需要简化电机控制编程、提高系统可靠性和可维护性的工业环境。主要目标是减少重复编码的工作量,提升开发效率,确保系统稳定运行。 其他说明:文中提供的代码示例和方法不仅有助于初学者快速入门,也为有经验的工程师提供了优化现有系统的思路。通过使用这些功能块,可以在短时间内完成复杂电机控制系统的搭建和调试。

  • 腐败感知指数(CPI)数据和各种治理指标数据集

    全球腐败感知数据(2000-2023)——3000行 33个指标 关于数据集 该数据集包含3000行和33列,涵盖了2000年至2023年的腐败感知指数(CPI)数据和各种治理指标。它包括国家排名、分数和其他指标,如公共部门腐败、司法腐败、贿赂指数、商业道德、民主指数、法治、政府效率、经济指标和人类发展指数。 这些数据可用于: 腐败趋势分析 腐败对GDP、人类发展指数和治理的影响 跨国比较 数据可视化和机器学习模型 该数据集对研究人员、数据分析师、政策制定者和对研究全球腐败趋势非常有用。

Global site tag (gtag.js) - Google Analytics