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操作页面表格,元素的一些技巧
Feb 02 Javascript
关于javascript function对象那些迷惑分析
Oct 24 Javascript
JS随机生成不重复数据的实例方法
Jul 17 Javascript
文本框(input)获取焦点(onfocus)时样式改变的示例代码
Jan 10 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
Jun 10 Javascript
jquery实现简洁文件上传表单样式
Nov 02 Javascript
值得分享的轻量级Bootstrap Table表格插件
May 30 Javascript
浅谈javascript:两种注释,声明变量,定义函数
Oct 05 Javascript
浅谈vue.js导入css库(elementUi)的方法
Mar 09 Javascript
json数据格式常见操作示例
Jun 13 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
Sep 01 Javascript
手把手教你自己写一个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也可以?成Shell Script
2006/10/09 PHP
php 全文搜索和替换的实现代码
2008/07/29 PHP
php开发环境配置记录
2011/01/14 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
PHP如何使用Memcached
2016/04/05 PHP
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
2017/02/20 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Python正则表达式经典入门教程
2017/05/22 Python
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
python实现计算器功能
2019/10/31 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
幼儿园端午节活动方案
2014/08/25 职场文书
争先创优公开承诺书
2014/08/30 职场文书
会议欢迎词范文
2015/01/27 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB