http://gist.github.com/1277224 从 8 行到 17259 行。从一个侧面也证明了把静态语言“编译”成动态语言有多困难。Dart 注定是个笑话。 ps. 今天 Eisa 的总行数只有 4643 行。
Category Archives: Browser
JavaScript: 死或新生
原作:JavaScript is Dead. Long Live JavaScript! 翻译: Belleve Invis 此翻译非直译,可能有部分内容省略,为交流用。如有错漏请回复。 序 十六年来, JavaScript 已经完全占领浏览器。它,见证了网页应用(Web Application)的崛起。尽管其他的脚本语言也能担此重任,然而,命运选择了 JavaScript。尽管微软在数年前就在浏览器里加入了 Basic ,但, JavaScript 因为能在所有浏览器中运行,所以它赢了。因能在所有浏览器中运行,自身的质量又并不差,那些浏览器制造商就没有义务给他们的产品增加新语言。 那些华丽的特性——比如闭包——让她成为我们这些情人眼里的西施。编程圈子里经常有这样的忏悔——“是,我知道,这玩意不怎么样,但是给她个机会,好吗?你会爱上她的。”给这语言推销绝非难事。 JavaScript 被说成一个太早拿出来的实验品,而我们一直戴着有色眼镜。 2007 年, Steve Yegge 说 JavaScript 会“引爆程序圈”,现在看来,是真的。从那时到现在,基于 JavaScript 的网页应用已经变得更复杂、更大型以及更好用。借其力量, Web 仍然保持繁荣,丝毫不让移动 App。 最近, JavaScript 在服务器端成功发力。 Node.js 平台,利用其非阻塞 I/O,有望解决无数程序员多年的积怨。作为 Node.js 的选择, JavaScript 可能会在服务器端完成无数前人没有完成的任务。 总而言之, JavaScript 早已横扫全球。但是,如果浏览器今天从地球上消失,又有多少 JavaScript 代码会在第二天写出来?或许她会一夜之间被打入冷宫。幸而,浏览器不会消失,而且还会存活很多年。 随着开发规模的膨胀,那些缺陷逐渐显现,日复一日戳痛开发人员的心。你会觉得奇怪,为什么我写 JavaScript 那么多年我还不是 JavaScript 教教徒,我写的绝大多数 [...]
有关 Essentia
lifesinger 的 Seajs(一个符合 Common JS 规范的模块加载器)很华丽,不过有个问题,就是定义模组的时候必须给明依存项,这让我很不爽。因为,我的理想就是一个东西不出现两次。用 seajs 的话,要写出这样的代码: module.declare(['a', 'b', 'c'], function(require, exports){ var a = require(‘a’) // … }); 因为已经写定,所以不能根据条件进行动态 require。我想要的是这样的代码: module.declare(function(requiring, exports, finish){ requiring(['a', 'b', 'c'], function(){ // …… finish(); }) }); 这可能看起来没什么,不过要是配上 Eisa 的阻塞原语,那就非常强力了。我们可以写出这样的代码: module “mod” -> { using a, b, c from libraries..; // 生成一个阻塞,加载 a, b, c // …… } [...]
Eisa Obstructives: a very brief view.
From: (lofn) var enum = enumerator { yield.. 1; yield.. 2; yield.. 3 }; for var item in enum(): tracel item end; To: enum_$ = enumerator_$(EISA_OBSTRUCTIVE(function(SCHEMATA){ return function(){ var THIS = (this === EISA_M_TOP ? null : this); var ARGS = EISA_SLICE(arguments, 0); var OBSTR1, OBSTR2, OBSTR3, OBSTR4, OBSTR5, OBSTR6, PROGRESS, EOF, ISFUN, COROFUN; PROGRESS=1; [...]
乱谈,和我做 lofn 时候的一点想法,以及 lofn 的异步库
一直想写这文章有段时间了,自己了解不少语言(自然的 & 程序的),也做过编译器,随便说说,应该还是可以的罢。如果说的不对请回复指正,谢谢。 很多人都在说语言的好坏,比如 Perl 和 Python 社区间持续的争论、Linus 炮轰 C++、老赵力挺 C# 等等。除开骂人时的快感,这些嘴仗没有什么意义:即是 Linus Towards 也无法说服 MS 扔掉 C++ 改用纯 C,也不能让一个有了 N 年 Java 经验的人改用 C#(倒是可能改用 Scala)。在这,我也不想让任何人改用其他语言(那会杀了他们),只是想让你们能多有些了解,此外,如果以后有再次选择的机会,能选择一个称手的语言。 在说程序语言之前,先来乱扯下自然语言。我不研究语言学(我有个同学是),我的很多理解都是基于数理逻辑,而非语言学。自然语言的语系众多,有些语言“好学”、有些“难学”。比如说,拉丁语和古希腊语的语序是一种修辞——句子部分间的关系完全由屈折变化决定。因此,他们都是很美、很有表现力的语言(因为可以用很短的句子表示复杂而精确的语义),也是很难学的语言。古汉语也是如此:当我们阅读文言文的时候,都会感叹怎么那么一点点字就有那么多意思! 与此相反,现代英语和现代汉语则更加“分析化”(Analytic),几乎所有能表现复杂语义的东西都用介词明示出来了。结果呢,原来很有韵味的话突然没了感觉,像是 “Cogito ergo sum” 变成 “I think, therefore I am”,没了韵味。现在的语言多了简易性,而少了美感和厚重感。
前端代码之丑 [2]:丑陋的条件语句
实际代码 今天的代码很简单,但每次评审时碰到类似场景,总会让我有些小不淡定: // 代码 1 if (‘s’ == type.value) { cont.style.display = ‘none’; if (cont.shim) cont.shim.style.display = ‘none’; if (cats) cats.style.display = ‘none’; } else { cont.style.display = ”; if (cont.shim) cont.shim.style.display = ”; if (cats) cats.style.display = ”; }
前端代码之丑 [1]:分支化技巧
看了 InfoQ 的 代码之丑 专栏,心痒痒忍不住,前端也来一个系列吧。 分析的代码片段大都来自实际项目。还希望代码主人多多包容,让我们一起共同研究探讨,互助学习提高。 实际代码 今天要分析的是获取邮费目的地的一段代码(做了部分简化,整体保持原貌): var DEST_MAP = { ’1′: ‘全国’, ’110000′: ‘北京’, ’230000′: ‘黑龙江’ }; // 注:精简了数据。真实代码中,有 36 个键值对,表示全国各个省份。 var DEST_MAP_UTF8 = { ’1′: ‘全國’, ’110000′: ‘北京’, ’230000′: ‘黑龍江’ }; var doc = document, EMPTY = ”; var charset = doc.charset || doc['characterSet'] || ‘gb2312′; var isUTF8 = charset.toLowerCase().indexOf(‘utf-8′) != -1; [...]
js要给力之:代码能有多烂?
转载自http://bbs.51js.com/viewthread.php?tid=88174,原文作者 Aimingoo,感谢您的好文章。 烂代码是怎么定义的? KissyUI 是淘宝 Kissy 这个前端项目的一个群,龙藏同学在看完我在公司内网的“读烂代码系列”之后就在群里问呵:烂代码是怎么定义的? 是呵,到底什么才算烂代码呢?这让我想到一件事,是另一个网友在 gtalk 上问我的一个问题:他需要 a, b, c 三个条件全真时为假,全假时也为假,请问如何判断。
一个“大”题目有趣的答案
lifesinger 出了个题目: f = function() { return true; }; g = function() { return false; }; ( function() { if (g() && [] == ![]) { f = function f() { return false; }; function g() { return true; }; } })(); f(); // What’s the result?
第一段 lofn 代码
var gettags = do { var entify = s :> s.replace(‘[&"<>]‘ as RegExp.g, ch :> { if ch == ‘&’, return ‘&’ else if ch == ‘”‘, return ‘&quod;’ else if ch == ‘<’, return ‘<’ else, return ‘>’ }); var gen_tag = tag :> function: var obj = derive this; var props = ”; [...]