JavaScript具有类似Lambda表达式编程能力的代码(改进版)


Posted in Javascript onSeptember 14, 2010

在发了博文之后,我又花了一些时间尝试解决这个问题……经过几次尝试之后,我找到了另一种pattern,括号并不再是必要的了:

eval(function () { 
var s = '', ww = [v] > (s += v); 
var ws = [n] > ww(' <A href="#">(' + n + ')</A> '); 
pnView3(14, [n] > ww(' [' + n + '] '), 
1, 37, 
ws, [] > ww(' ... '), 
2, 1 
); 
document.write(s); 
} .lamda0());

不过,由于运算符优先级的关系,比较、门、赋值等运算符仍然不能直接写在(伪)Lambda表达式中。
也就是说
function(a, b){ a == b }

仍然需要写成
[a, b] > (a == b)

另外,选择的pattern本身是具有实际效果的——当把一个数组和另一样东西进行比较的时候,脚本引擎会先尝试把两边都转化成数值,如果不成功就转化成字符串再比较。
不过我想正常情况下应该很少有人会拿数组跟别的东西这么比——所以甚至不需要主动去避免,只要用不到(伪)Lambda表达式的时候不特意去这样用就没问题了。

新的实现代码如下:

/*! 
L-amda "a-Lambda", a module provides Alternate "Lambda" style programming ability for JavaScript. 
Created By NanaLich. 2010-09-10 
This module is published under WTFPL v2, so you just DO WHAT THE Fxxx YOU WANT TO with it. 
*/ 
!function () { 
function attachEntry(o, a, m) { 
var i, j, n; 
o = [].concat(o); 
while (i = o.shift()) { 
for (j in a) { 
if (!i[n = a[j]]) i[n] = m; 
} 
} 
} 
var xx = /"(?:\\[\s\S]|[^\x22])*"|'(?:\\[\s\S]|[^\x27])*'|([^\s\w]\s*)\[(\s*|\s*[A-Z$_][\w$]*\s*(?:,\s*[A-Z$_][\w$]*\s*)*)\]\s*(>)\s*(\(?)/gi; 
var xy = /[\n\r),;\]}]|$/.source; 
function rxClone(rx) { 
return new RegExp(rx.source, (rx.global ? 'g' : '') + (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '')); 
} 
attachEntry(RegExp, ['clone'], rxClone); 
attachEntry(RegExp.prototype, ['clone'], function () { return rxClone(this); }); 
function translateLambda(s) { 
var m, l = 0, r = '', x = xx.clone(); // 由于firefox、safari等浏览器对全局匹配正则表达式有过度的优化,所以这里采用一种迂回的办法创建不重复的正则表达式实例 
while (m = x.exec(s)) { 
var h = m[0]; 
switch (h.charAt(0)) { // 判断期待的语法成分 
case '$': // 函数传参 
case ')': 
case ']': 
case '"': // 匹配到了字符串 
case "'": 
continue; // 以上皆跳过 
} 
var p, q, t, k = m[4].length, y = new RegExp(k ? '\\)' : xy, 'g'); 
r += s.substring(l, p = m.index); // 在结果字符串上附加之前余留的内容 
y.lastIndex = l = p + h.length; // 从伪运算符之后开始寻找右括号或者其它符号 
while (q = y.exec(s)) { 
q = q.index; 
try { 
t = 'return(' + s.substring(l, q) + ');'; 
new Function(t); // 语法测试 
r += m[1] + 'function(' + m[2] + '){ ' + translateLambda(t) + ' }'; // 翻译里面的内容 
x.lastIndex = l = q + k; // 下一次查找从当前边界之后开始 
break; 
} catch (ex) { } 
} 
if (!q) l = p; // 说明找不到右括号或者有效的代码,直接附加所有匹配的内容 
} 
try { 
r += s.substr(l); 
new Function(r); // 语法测试 
return r; 
} catch (ex) { // 失败,返回原文 
return s; 
} 
}; 
var lamdaAliases = ["translateLambda", "lambda", "lamda"]; 
attachEntry(String, lamdaAliases, translateLambda); 
attachEntry(String.prototype, lamdaAliases, function () { return translateLambda(this); }); 
var funPrototype = Function.prototype; 
attachEntry(Function, lamdaAliases, function (func) { return translateLambda('0,' + func); }); 
attachEntry(funPrototype, lamdaAliases, function () { return translateLambda('0,' + this); }); 
var lamda0aliases = ['lambdaInit', 'lambda0', 'lamda0']; 
attachEntry(Function, lamda0aliases, function (func) { return translateLambda('!' + func + '()'); }); 
attachEntry(funPrototype, lamda0aliases, function () { return translateLambda('!' + this + '()'); }); 
} ();

这次为函数增加了专门的方法,去掉了之前蹩足的判断、也增加了新方法稍微简化调用过程;
修正了有额外空格时无法判断期望语法成分的BUG。

另外由于Codeplex再次抽疯,这次还是没有下载。

Javascript 相关文章推荐
js 表格隔行颜色
Dec 02 Javascript
CheckBoxList多选样式jquery、C#获取选择项
Sep 06 Javascript
JavaScript中Math对象方法使用概述
Jan 02 Javascript
DOM节点深度克隆函数cloneNode()用法实例
Jan 12 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
Jul 27 Javascript
JavaScript代码轻松实现网页内容禁止复制(代码简单)
Oct 23 Javascript
简单实现JS对dom操作封装
Dec 02 Javascript
JS模仿腾讯图片站的图片翻页按钮效果完整实例
Jun 21 Javascript
解决Jquery下拉框数据动态获取的问题
Jan 25 jQuery
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 Javascript
JavaScript常见事件处理程序实例总结
Jan 05 Javascript
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
手把手教你自己写一个js表单验证框架的方法
Sep 14 #Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
Sep 14 #Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
Sep 14 #Javascript
基于jquery的划词搜索实现(备忘)
Sep 14 #Javascript
基于jquery的页面划词搜索JS
Sep 14 #Javascript
基于Jquery的实现回车键Enter切换焦点
Sep 14 #Javascript
js输出列表实现代码
Sep 12 #Javascript
You might like
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
php猜单词游戏
2015/09/29 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
js版本A*寻路算法
2006/12/22 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
js友好的时间返回函数
2016/08/24 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
浅谈angularjs module返回对象的坑(推荐)
2016/10/21 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
JS 组件系列之BootstrapTable的treegrid功能
2017/06/16 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
2017/11/28 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
python中reload(module)的用法示例详解
2017/09/15 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
python调用API实现智能回复机器人
2018/04/10 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
新浪网技术部笔试题
2016/08/26 面试题
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
大学生职业生涯规划书范文
2014/01/14 职场文书
公司合并协议书范本
2014/09/30 职场文书
焦点访谈观后感
2015/06/11 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
世界十大动漫制作公司排行榜,迪士尼上榜,第二是美国代表性文化符
2022/03/18 欧美动漫