2009-09-01 76 views
14

在我的日常工作中,我碰巧写了链式JavaScript函数,它像LINQ表达式来查询JSON结果。是否可以在Javascript中进行元编程?

var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status"); 

它完美地工作,并给出预期的结果。

我想知道这看起来真棒,如果代码是这样写的(更可读的方式)

var Result = from obj1 as x where x.status 
groupby x.status having count(x.status) > 5 
select x.status; 

是有办法做到这一点?

干杯

拉梅什VEL

+4

\ *咳嗽* * http://www.hugoware.net/Projects/jLinq \ *咳嗽* * – 2010-07-20 02:04:03

+0

你可以把你的代码放在一些HTML标记或文本文件中。然后,你可以有你自己的DSL与Javascript ... – Philip 2010-11-18 14:13:21

回答

17

号JavaScript不支持此功能。

但是,这看起来相当不错过:

var Result = from(obj1) 
      .as("x") 
      .where("x.id=5") 
      .groupby("x.status") 
      .having(count("x.status") > 5) 
      .select("x.status"); 
5

虽然不大,你想要的东西,就可以使用JavaScript编写解析器,只是解析查询(存储为字符串),然后执行它。例如,使用像http://jscc.jmksf.com/这样的库(毫无疑问,那里有其他的),它实现起来应该太难了。

但是你在这个问题上看起来已经很棒了,我不确定你为什么希望它看起来像你的建议。

+0

感谢您的答复Chii ..其实我只是试验不同的可能性。我用c#背景,latestlty在JavaScript中开始,只是想探索JS的功能...多数民众赞成的原因..多谢链接..我已经看过像你提到的JS解析器..和我发现http://www.codeplex.com/jsinq是有用的..再次感谢.. – RameshVel 2009-09-01 10:52:30

1

Wat你想要的是将JavaScript解析器更改为SQL解析器。它并没有被创建,JavaScript语法不允许你。

你有什么像SQL(它直接映射到它)90%,和100%的有效JavaScript,这是一个伟大的成就。我在标题中回答的问题是:是的,元编程是可能的,但是它不会给你一个SQL解析器,因为它必然会使用JavaScript语法。

6

大多数人坚持尝试从元程序里面他们最喜欢的语言。如果语言不能很好地支持元编程,那就行不通了;其他答案已经观察到JavaScript没有。

解决的办法是从做元编程之外的语言,使用 program transformation tools。这些工具可以解析源代码,并对其进行任意转换(这就是元编程无论如何),然后吐出修改过的程序。

如果您有一个通用的程序转换系统,可以解析任意语言,那么您可以使用任何您喜欢的语言进行元编程。请参阅我们的DMS Software Reengineering Toolkit,该工具具有用于C,C++,Java,C#,COBOL,PHP和ECMAScript以及许多其他编程语言的健壮前端,并且已用于所有这些元编程。

对于您的情况,您希望使用SQL语法的新语法扩展JavaScript语法,然后将它们转换为纯JavaScript。 (这与意图编程很相似) DMS可以轻松让您使用附加规则构建JavaScript方言,然后您可以使用其程序转换功能来生成等效的标准Javascript。尽管如此,我并不是“地球上每个程序员的自定义语法”的热衷者,这是故意编程导致恕我直言的地方。

如果有大量的用户会发现这种有价值的东西,这是一件好事。这个想法可能是也可能不是其中之一;问题的一部分是你没有做实验就没有找到答案,并且可能无法获得足够的社会影响力。

3

好了,你的代码示例:

var Result = from(obj1) 
      .as("x") 
      .where("x.id=5") 
      .groupby("x.status") 
      .having(count("x.status") > 5) 
      .select("x.status"); 

我看到的唯一问题(比用作标识符select除外),你嵌入一个谓词作为函数参数。你必须改变它的功能:

  .having(function(x){ return x.status > 5; }) 

JavaScript有闭包和动态打字,所以你可以做一些非常漂亮和优雅的东西。只是让你知道。

+0

感谢乔伊,这是一个好主意.. :) – RameshVel 2010-07-20 04:52:46

2

在纯JS不,你不能。但有了正确的预处理器,这是可能的。

你可以用类似sweet.js的宏或(神原谅我)GPP

1

考虑到几年前提出这个问题,我会尝试在现有技术的基础上增加更多。

从ECMAScript 6起,现在通过SymbolReflectProxy对象支持元编程。

通过在网络上搜索,我发现了一系列关于这个问题很有趣的文章,由Keith基尔克尔写:

Metaprogramming in ES6: Symbols and why they're awesome

总之,符号是可以在对象内增加新的原语(实际上没有属性),并且非常方便将元编程属性传递给它。符号都是关于通过修改现有类的行为(实现中的反射)来改变它们的行为。

Metaprogramming in ES6: Part 2 - Reflect

总之,体现的是有效地所有这些都是独家提供通过JavaScript引擎内部,现在暴露在一个单一的,方便的对象那些“内部方法”的集合。它的用法类似于Java和C#的Reflection功能。它们被用来发现关于你的代码的非常低层次的信息(通过自省进行反思)。

Metaprogramming in ES6: Part 3 - Proxies

总之,代理是处理对象,负责包装的对象,并通过陷阱拦截他们的行为(通过调解反射)。实际上,这些对象提供了特定的元编程功能,与元编程语言相比,限制性更强,但仍然可以提供基本元编程的便捷方式,主要是通过反射实践。

最后,值得一提的是,有一些值得注意的ongoing research work在JavaScript中的阶段元编程。

相关问题