Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中可以进行元编程吗?_Javascript_Metaprogramming_Dsl - Fatal编程技术网

在Javascript中可以进行元编程吗?

在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否

在我的日常工作中,我碰巧编写了链式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

否。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; })