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 相关文章推荐
javascript重复绑定事件造成的后果说明
Mar 02 Javascript
js 为label标签和div标签赋值的方法
Aug 08 Javascript
js 三级关联菜单效果实例
Aug 13 Javascript
自己实现ajax封装示例分享
Apr 01 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
JavaScript的removeChild()函数用法详解
Dec 27 Javascript
jQuery插件HighCharts实现的2D回归直线散点效果示例【附demo源码下载】
Mar 09 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
vue中的数据绑定原理的实现
Jul 02 Javascript
js设计模式之单例模式原理与用法详解
Aug 15 Javascript
layui数据表格重载实现往后台传参
Nov 15 Javascript
详解Vue的异步更新实现原理
Dec 22 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错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
使用PHP计算两个路径的相对路径
2013/06/14 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
2018/02/10 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
JavaScript 动态改变图片大小
2009/06/11 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
2014/07/04 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
python中enumerate的用法实例解析
2014/08/18 Python
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
python生成二维码的实例详解
2017/10/29 Python
python如何对实例属性进行类型检查
2018/03/20 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
使用python实现多维数据降维操作
2020/02/24 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
在keras里实现自定义上采样层
2020/06/28 Python
Python实现数字的格式化输出
2020/08/01 Python
详解python tcp编程
2020/08/24 Python
python调用win32接口进行截图的示例
2020/11/11 Python
学校食品安全实施方案
2014/06/14 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
2016年教师反腐倡廉心得体会
2016/01/13 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
教你用python实现12306余票查询
2021/06/30 Python