在Javascript中元编程是否可行?

Ram*_*Vel 15 javascript dsl metaprogramming

在我的日常工作中,我碰巧编写了链接的javascript函数,类似于LINQ表达式来查询JSON结果.

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

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

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

var Result = from obj1 as x where x.status
groupby x.status having count(x.status)  > 5
select x.status;
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个?

干杯

Ramesh Vel

Geo*_*lly 18

不,JavaScript不支持此功能.

但这看起来也很不错:

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


Ira*_*ter 6

大多数人坚持尝试从他们喜欢的语言内部进行元编程.如果语言不能很好地支持元编程,那就行不通; 其他答案都观察到JavaScript没有.

解决这个问题的方法是使用程序转换工具从语言 外部进行元编程.这样的工具可以解析源代码,并对其进行任意转换(这就是元编程所做的事情),然后吐出修改后的程序.

如果你有一个通用的程序变换系统,可以解析任意的语言,然后你可以做的元编程/用任何一种语言,你喜欢.请参阅我们针对此类工具的DMS软件重新设计工具包,该工具具有针对C,C++,Java,C#,COBOL,PHP和ECMAScript的强大前端以及许多其他编程语言,并已用于所有这些的元编程.

在您的情况下,您希望使用SQL查询的新语法扩展JavaScript语法,然后将它们转换为纯JavaScript.(这与Intentional Programming非常相似)DMS可以轻松地让您使用其他规则构建JavaScript方言,然后您可以使用其程序转换功能来生成等效的标准Javascript.

话虽如此,我不是"地球上每个程序员的自定义语法"的忠实粉丝,这是故意编程引导恕我直言的地方.

如果有大量用户可以发现这些有价值,那么这是一件好事.这个想法可能是也可能不是其中之一; 问题的一部分是,如果不进行实验,你就无法找到答案,而且可能无法获得足够的社会牵引力.


Chi*_*hii 5

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

但你在问题中看到的东西看起来很棒,我不知道为什么你希望它看起来像你的建议.


Nic*_*kis 5

考虑到这个问题是几年前问的,我会尝试结合目前的技术来补充。

从 ECMAScript 6 开始,现在通过SymbolReflectProxy对象在某种意义上支持元编程。

通过在网上搜索,我发现了一系列关于这个主题的非常有趣的文章,作者是 Keith Kirkel:

ES6 中的元编程:符号及其出色的原因

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

ES6 中的元编程:第 2 部分 - 反思

简而言之,Reflect 实际上是所有那些仅通过 JavaScript 引擎内部可用的“内部方法”的集合,现在暴露在一个单独的、方便的对象中。它的用法类似于 Java 和 C# 的反射功能。它们用于发现有关您的代码的非常低级别的信息(通过自省进行反射)。

ES6 中的元编程:第 3 部分 - 代理

简而言之,Proxies 是处理程序对象,负责包装对象并通过陷阱(Reflection through intercession)拦截它们的行为。

当然,这些对象提供了特定的元编程功能,与元编程语言相比限制性要大得多,但仍然可以提供基本元编程的便捷方式,实际上主要是通过反射实践。

最后,值得一提的是,在 JavaScript 中的分阶段元编程方面有一些值得注意的正在进行的研究工作