在Javascript中可以进行元编程吗?
在我的日常工作中,我碰巧编写了链式javascript函数,该函数类似于LINQ表达式,用于查询JSON结果在Javascript中可以进行元编程吗?,javascript,metaprogramming,dsl,Javascript,Metaprogramming,Dsl,在我的日常工作中,我碰巧编写了链式javascript函数,该函数类似于LINQ表达式,用于查询JSON结果 var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status"); 它工作完美,并给出了预期的结果 我想知道如果代码是这样写的(以一种更可读的方式),这看起来很棒 有没有办法做到这一点 干杯 Ramesh Vel否
var Result = from(obj1).as("x").where("x.id=5").groupby("x.status").having(count("x.status") > 5).select("x.status");
它工作完美,并给出了预期的结果
我想知道如果代码是这样写的(以一种更可读的方式),这看起来很棒
有没有办法做到这一点
干杯
Ramesh Vel否。JavaScript不支持此功能 但这看起来也很不错:
var Result = from(obj1)
.as("x")
.where("x.id=5")
.groupby("x.status")
.having(count("x.status") > 5)
.select("x.status");
也许你想要一些东西,比如如果你有JSON数据。我在一家商店找到了这个。如果不是你所需要的,可以从那里链接到很多其他工具
(这项工作也正在进行:)虽然不是您想要的,但是可以用javascript编写解析器,只解析查询(存储为字符串)然后执行它。e、 例如,使用像这样的库(毫无疑问还有其他库)应该不会太难实现
但是你的问题看起来已经很好了,我不知道你为什么希望它看起来像你建议的那样 您想要的是将javascript解析器更改为SQL解析器。创建它不是为了这样做,javascript语法不允许这样做
您拥有的是90%类似SQL(它直接映射到SQL上)和100%有效的javascript,这是一项伟大的成就。我对标题中的问题的回答是:是的,元编程是可能的,但它不会提供SQL解析器,因为它必须使用javascript语法。大多数人坚持尝试从他们喜爱的语言内部进行元编程。如果语言不能很好地支持元编程,那么这是行不通的;其他答案表明JavaScript没有 解决这个问题的一种方法是使用 . 这些工具可以解析源代码,并对其执行任意转换(元编程就是这么做的),然后抛出修改后的程序 如果您有一个通用程序转换系统,可以解析任意语言,那么您就可以使用您喜欢的任何语言进行元编程。请参阅我们的工具,它有C++、C++、爪哇、Cype、COBOL、PHP和ECMAScript以及许多其他编程语言的强大前端,并已用于所有这些元编程。 在您的例子中,您希望使用SQL查询的新语法扩展JavaScript语法,然后将它们转换为普通JavaScript。(这很像有意编程) DMS将很容易让您使用附加规则构建JavaScript方言,然后您可以使用其程序转换功能生成等效的标准JavaScript 话虽如此,我并不是“地球上每个程序员的自定义语法”的狂热爱好者,这正是故意编程导致IMHO的原因
如果有大量的用户认为这很有价值,那么这是一件好事。这个想法可能是,也可能不是其中之一;问题的一部分在于,如果不进行实验,您就无法找到答案,而且它可能无法获得足够的社会吸引力。好吧,在您的代码示例中:
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有闭包和动态类型,所以您可以在其中做一些非常漂亮和优雅的事情。只是让你知道。在纯JS中,不,你不能。但有了正确的预处理器,这是可能的
您可以对宏或(上帝饶恕我)执行类似的操作。考虑到这个问题是几年前提出的,我将根据当前的技术尝试添加更多内容 从ECMAScript 6开始,元编程现在在某种意义上通过、和对象得到支持 通过在网上搜索,我找到了一系列关于这个主题的非常有趣的文章,作者是Keith Kirkel: 简言之,符号是可以添加到对象内部的新原语(实际上不是属性),并且非常方便地将元编程属性传递给对象。符号都是关于通过修改现有类来改变它们的行为(实现中的反射) 简言之,Reflect实际上是所有这些“内部方法”的集合,这些方法只通过JavaScript引擎内部提供,现在暴露在一个简单的对象中。它的用法类似于Java和C的反射功能。它们用于发现有关代码的非常低级的信息(通过内省进行反射) 简言之,代理是处理程序对象,负责包装对象并通过陷阱(通过交互反射)拦截其行为 当然,这些对象提供了特定的元编程功能,与元编程语言相比限制性更大,但实际上仍然可以提供基本元编程的简便方法,主要是通过反射实践
最后,值得一提的是,JavaScript中的分段元编程有一些值得注意的地方。感谢Chii的回复。。实际上我只是在尝试不同的可能性。我有c#背景,最近开始使用javascript,只是想探索JS的特性。。。这就是原因。。谢谢你的链接。。我已经环顾了JS解析器,就像你提到的那样。。我发现它很有用。。再次感谢..*cough**cough*您可以将代码放入一些HTML标记或文本文件中。然后你可以用Javascript拥有自己的DSL。。。
.having(function(x){ return x.status > 5; })