`
sunrenen
  • 浏览: 40211 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[改进]还是那个让JavaScript具有(类似)Lambda表达式编程能力

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

view sourceprint?
01 eval(function () { 

02   var s = '', ww = [v] > (s += v); 

03   var ws = [n] > ww(' <A href="#">(' + n + ')</A> '); 

04   

05   pnView3(14, [n] > ww(' [' + n + '] '), 

06    1, 37, 

07    ws, [] > ww(' ... '), 

08    2, 1 

09   ); 

10   

11   document.write(s); 

12 } .lamda0());


不过,由于运算符优先级的关系,比较、门、赋值等运算符仍然不能直接写在(伪)Lambda表达式中。

也就是说

view sourceprint?
1 function(a, b){ a == b }
仍然需要写成

view sourceprint?
1 [a, b] > (a == b)


另外,选择的pattern本身是具有实际效果的——当把一个数组和另一样东西进行比较的时候,脚本引擎会先尝试把两边都转化成数值,如果不成功就转化成字符串再比较。

不过我想正常情况下应该很少有人会拿数组跟别的东西这么比——所以甚至不需要主动去避免,只要用不到(伪)Lambda表达式的时候不特意去这样用就没问题了。



新的实现代码如下:

view sourceprint?
01 /*! 

02 L-amda "a-Lambda", a module provides Alternate "Lambda" style programming ability for JavaScript. 

03 Created By NanaLich. 2010-09-10 

04 This module is published under WTFPL v2, so you just DO WHAT THE Fxxx YOU WANT TO with it. 

05 */

06   

07 !function () { 

08   function attachEntry(o, a, m) { 

09     var i, j, n; 

10     o = [].concat(o); 

11   

12     while (i = o.shift()) { 

13       for (j in a) { 

14         if (!i[n = a[j]]) i[n] = m; 

15       } 

16     } 

17   } 

18   

19   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; 

20   var xy = /[\n\r),;\]}]|$/.source; 

21   

22   function rxClone(rx) { 

23     return new RegExp(rx.source, (rx.global ? 'g' : '') + (rx.ignoreCase ? 'i' : '') + (rx.multiline ? 'm' : '')); 

24   } 

25   attachEntry(RegExp, ['clone'], rxClone); 

26   attachEntry(RegExp.prototype, ['clone'], function () { return rxClone(this); }); 

27   

28   function translateLambda(s) { 

29     var m, l = 0, r = '', x = xx.clone(); // 由于firefox、safari等浏览器对全局匹配正则表达式有过度的优化,所以这里采用一种迂回的办法创建不重复的正则表达式实例 

30   

31     while (m = x.exec(s)) { 

32       var h = m[0]; 

33   

34       switch (h.charAt(0)) { // 判断期待的语法成分 

35         case '$': // 函数传参 

36         case ')': 

37         case ']': 

38         case '"': // 匹配到了字符串 

39         case "'": 

40           continue; // 以上皆跳过 

41       } 

42   

43       var p, q, t, k = m[4].length, y = new RegExp(k ? '\\)' : xy, 'g'); 

44   

45       r += s.substring(l, p = m.index); // 在结果字符串上附加之前余留的内容 

46       y.lastIndex = l = p + h.length; // 从伪运算符之后开始寻找右括号或者其它符号 

47   

48       while (q = y.exec(s)) { 

49         q = q.index; 

50         try { 

51           t = 'return(' + s.substring(l, q) + ');'; 

52           new Function(t); // 语法测试 

53   

54           r += m[1] + 'function(' + m[2] + '){ ' + translateLambda(t) + ' }'; // 翻译里面的内容 

55   

56           x.lastIndex = l = q + k; // 下一次查找从当前边界之后开始 

57   

58           break; 

59         } catch (ex) { } 

60       } 

61       if (!q) l = p; // 说明找不到右括号或者有效的代码,直接附加所有匹配的内容 

62     } 

63   

64     try { 

65       r += s.substr(l); 

66   

67       new Function(r); // 语法测试 

68       return r; 

69     } catch (ex) { // 失败,返回原文 

70       return s; 

71     } 

72   }; 

73   

74   var lamdaAliases = ["translateLambda", "lambda", "lamda"]; 

75   attachEntry(String, lamdaAliases, translateLambda); 

76   attachEntry(String.prototype, lamdaAliases, function () { return translateLambda(this); }); 

77   

78   var funPrototype = Function.prototype; 

79   attachEntry(Function, lamdaAliases, function (func) { return translateLambda('0,' + func); }); 

80   attachEntry(funPrototype, lamdaAliases, function () { return translateLambda('0,' + this); }); 

81   

82   var lamda0aliases = ['lambdaInit', 'lambda0', 'lamda0']; 

83   attachEntry(Function, lamda0aliases, function (func) { return translateLambda('!' + func + '()'); }); 

84   attachEntry(funPrototype, lamda0aliases, function () { return translateLambda('!' + this + '()'); }); 

85 } ();
这次为函数增加了专门的方法,去掉了之前蹩足的判断、也增加了新方法稍微简化调用过程;

修正了有额外空格时无法判断期望语法成分的BUG。



另外由于Codeplex再次抽疯,这次还是没有下载。
分享到:
评论

相关推荐

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

    在JavaScript中实现类似Lambda表达式的编程能力,虽然原生JavaScript语法并不支持Lambda表达式,但是可以通过一些技巧或第三方库来模拟这种行为。这篇文章介绍了一种方法,该方法能够使***ript代码在某些程度上具备...

    深入理解Kotlin中的Lambda表达式

    Kotlin的一大亮点在于它对函数式编程的支持,尤其是通过lambda表达式的形式。本文将围绕这一主题进行深入探讨,涵盖Lambda表达式的基本概念、语法特点、使用场景及其与函数类型的关联。 #### 1. 引言 在传统的命令...

    Lambda 表达式

    Lambda表达式是编程语言中的一种简洁的匿名函数表示方式,尤其在C#、Java和JavaScript等语言中广泛应用。在.NET框架中,Lambda表达式与LINQ(Language Integrated Query,语言集成查询)紧密关联,用于数据操作和...

    Kotlin Lambda 表达式:函数式编程的瑞士军刀

    4. **函数式编程**:支持函数式编程范式,提供了 Lambda 表达式等特性。 5. **扩展性**:Kotlin 允许扩展现有类的功能。 6. **协程**:Kotlin 支持协程,这使得编写异步代码更加简洁。 7. **空安全**:Kotlin 的空...

    Lambda表达式里面修改外部变量问题

    在Java 8中引入的Lambda表达式是一种简洁的匿名函数表示方式,它允许开发者以更紧凑的代码处理函数式编程任务。然而,在Lambda表达式中直接修改外部变量可能会导致编译错误,因为Java要求这些变量必须是final或...

    Java 8 新特性详细介绍Lambda表达式、Stream API、接口的默认方法

    Java 8作为Java语言的一个重要里程碑,引入了一系列创新特性,极大地提升了开发效率和代码...无论是函数式编程的支持,还是对异步编程和日期处理的改进,Java 8都为开发者提供了更多可能性,推动了Java生态系统的发展。

    Java 8 引入lambda表达式的原因解析

    lambda表达式还与其他新特性,如方法引用来配合,进一步增强了Java 8的函数式编程能力。例如,你可以直接使用方法名作为lambda表达式,如`Arrays.sort(list, Integer::compareTo)`,这使得代码更加简洁且易于理解。 ...

    lambda.js:JavaScript 中的 Lambda 演算

    它是函数式编程语言的理论基础,包括 JavaScript 在内的许多现代编程语言都受到了 Lambda 演算的影响。Lambda 演算的核心概念是通过匿名函数(也就是 Lambda 表达式)来表示和操作计算。 **JavaScript 中的 Lambda ...

    Lambda和高阶函数_刘新宇.pdf

    在Java、Python、JavaScript等语言中,Lambda表达式常常用于简化代码,特别是在处理集合和事件驱动编程时。例如,在Java 8引入Lambda表达式后,我们可以更方便地处理流(Stream)数据,通过一行代码就能实现复杂的数据...

    毕业设计:公车派遣系统,EF框架+T4模板+Lambda表达式+三层设计+MVC.zip

    综上所述,这个“公车派遣系统”项目涵盖了多种IT知识点,包括但不限于.NET EF框架、T4模板、Lambda表达式、三层架构、MVC模式、Vue.js前端开发以及Java后端编程。这些技术组合在一起,构建了一个完整的Web应用程序...

    前端开源库-lambda-chop

    Lambda表达式,也称为匿名函数,是JavaScript中一种简洁的定义函数的方式,常用于函数式编程。Lambda Chop库则进一步扩展了这一功能,通过Sweet.js宏系统,实现了对Lambda表达式的增强。 1. **Currying(柯里化)**...

    有趣的JS的演算

    在JavaScript的世界里,"有趣的JS的演算"主要指的是JavaScript中的函数式编程特性,特别是其中的Lambda表达式。在这个话题中,我们将深入探讨JavaScript中的Lambda表达式,以及它如何为编程带来独特的演算方式。 ...

    将字符串转换成lumbda

    在编程领域,Lambda 表达式是一种简洁的匿名函数表示方式,它在许多现代编程语言中,如 Python、Java、C# 和 JavaScript 中被广泛使用。Lambda 表达式允许我们将函数作为值来处理,这在函数式编程中非常常见。在某些...

    Lambda in Canvas – 谈谈函数式编程在前端开发中的应用

    在前端开发领域,Lambda表达式和函数式编程思想正逐渐成为主流,这主要得益于它们能够带来更简洁、可维护的代码。"Lambda in Canvas"这个主题深入探讨了如何将函数式编程的概念应用于Canvas画布的交互与动画实现,...

    lambda Functional_Programming.zip

    在许多支持函数式编程的语言中,如Java、Python和JavaScript,Lambda表达式通常用简短的语法来定义。例如,Python中的 `(x, y) -&gt; x + y` 就是一个简单的Lambda表达式,它接受两个参数x和y,返回它们的和。 ### 2. ...

    JavaScript版lamdba演算

    Lambda表达式由三部分组成:参数列表、箭头(→)和函数体。在JavaScript中,λ表达式通常表示为`function`关键字的简写形式,即一个匿名函数。例如: ```javascript const add = (x, y) =&gt; x + y; ``` 这里的`add`...

    java8新特性导师讲授精简版

    Lambda表达式是Java 8中最引人注目的特性之一,它为函数式编程提供了强大的支持。Lambda允许我们以简洁的方式定义匿名函数,无需创建完整的类即可传递行为。它们可以作为参数传递给方法,也可以作为返回值。Lambda...

Global site tag (gtag.js) - Google Analytics