如何在JavaScript中模拟宏?

如何在JavaScript中模拟宏?,javascript,browser,macros,lisp,Javascript,Browser,Macros,Lisp,我知道JavaScript不支持宏(Lisp风格的宏),但我想知道是否有人有办法模拟宏?我在谷歌上搜索了一下,其中一个解决方案建议使用eval(),但正如他所说的那样,这将非常昂贵 它们不一定非得很花哨。我只想和他们做一些简单的事情。而且这不会使调试变得非常困难:)解释Javascript。Eval的成本并不比Javascript中的其他任何东西都高。您可以使用它。这将为您提供用于Javascript的宏。我已经用Javascript编写了一个gameboy模拟器,我通过以下方式模拟用于cpu仿

我知道JavaScript不支持宏(Lisp风格的宏),但我想知道是否有人有办法模拟宏?我在谷歌上搜索了一下,其中一个解决方案建议使用eval(),但正如他所说的那样,这将非常昂贵


它们不一定非得很花哨。我只想和他们做一些简单的事情。而且这不会使调试变得非常困难:)

解释Javascript。Eval的成本并不比Javascript中的其他任何东西都高。

您可以使用它。这将为您提供用于Javascript的宏。

我已经用Javascript编写了一个gameboy模拟器,我通过以下方式模拟用于cpu仿真的宏:

宏代码(函数返回包含宏代码的字符串):

现在,我们可以执行如下模拟代码:

OP[MEM[PC]](); // MEM is an array of bytes and PC the program counter
希望它能有所帮助……

人们现在也可以使用它将clojure编译成javascript并以这种方式获取宏。注意ClojureScript使用Google闭包。

是编译为Javascript的最新语言,支持宏。它有一个类似Lisp的树语法,但也保持相同的Javascript语义。
function unless(condition,body) {
    return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}


eval(unless( function() {
    return false;
  }, function() {
    alert("OK");
}));


免责声明:我是。

Mozilla的一个库(名为)的作者,该库旨在用JavaScript模拟宏。例如,您可以使用SweetJS将
函数
关键字替换为
def

检查Linux/Unix/GNU M4处理器。它是任何语言的通用且强大的宏处理器。它特别面向Algol风格的语言,JavaScript是其中的一员。

错了!詹姆斯,请仔细阅读这个问题:并在做出误导性陈述之前验证你的观点。每次调用eval时,必须解析/解释传递给eval的字符串!是的,每次调用eval时都必须解析传递给eval的字符串——但每隔一行javascript也必须解析。口译员就是这样工作的。至于你链接到的答案,他从来没有提到速度,只是“更容易阅读,也不太可能出现错误”。我承认浏览器中的Javascript可能就是这种情况,比如说2000年左右,但今天,对普通Javascript代码(即非评估代码)进行了严重的优化,这只会继续下去。任何语言的字符串中的代码都无法在任何地方进行优化。Ash,我相信James试图说明的一点是,对于一次性交易,eval的工作速度与文字JavaScript一样快,因为无论哪种方式,解释器都在做同样的事情——获取字符串并执行它。你认为文字JavaScript是什么?这是HTML文件中的一个字符串。这不是一个坏主意,但遗憾的是,该解决方案添加了太多的eval和2x函数定义+宏是在编译时展开的,所以我们需要在JavaScript中添加编译阶段,或者忘记宏。我们只能通过调用eval()函数来编译JavaScript,所以无论如何我们都需要eval()。宏是语法糖,可以获得更简洁、更具表现力的代码。它们不会从理论上增加你能做或不能做的事情的类型。它们在编译时消耗一次,使运行时成本为零。这里的示例fail:eval每次都会被调用,代码比直接编写等价的javascript更冗长,更不易理解。要使宏发挥作用,您应该能够使用以下语法:除非('false','alert(“OK”))@NicolasBousquet宏使您能够在执行代码之前(以及在编译之前,宏扩展时间)对代码进行操作。没有宏你无法做到这一点。最终,宏生成的代码与手工编写的代码一样强大,但任何图灵完整语言都会给你这一点。重要的是他们增加了你的能力。-1虽然2008年parenscript还可以,但现在你真的应该使用ClojureScript。不同的解决方案。。。与ClojureScript不同,Parenscript是一个相当薄的层。不仅仅是不同的解决方案,不同的语言too@CesarCanassaparenscript是一个常见的Lisp库,它适用于大多数(可能是所有)主要实现(我自己也尝试过)。Clojurescript是一个更为利基的市场,适合不同的受众。LispyScript是一种同形语言(如Scheme和Common Lisp)吗?LispyScript与ParenScript有任何关系吗?它们看起来很像我,因为它们都是编译成JavaScript的Lisp方言@AndersonGreen我认为Santosh的说法是LispyScript类似于lisp,但不是lisp方言。不再维护?LispyScript不再维护,不应使用。
new Function(string)
是一个
eval()
上下文,因此具有与
eval()相同的性能特征
我不认为这是真的。它可能是一个eval,但eval只发生一次。一旦它是一个函数,它应该以正常的函数速度执行任意次数。IIRC,与“普通”JavaScript代码不同,过去的情况是大多数JS引擎都没有优化
function
对象。然而,当我读到这篇文章时已经是几年前的事了,所以我想知道现在普通的JS引擎对它们的支持有多好。特别是在所有的努力都投入到闭包优化中。
OP[MEM[PC]](); // MEM is an array of bytes and PC the program counter
function unless(condition,body) {
    return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}


eval(unless( function() {
    return false;
  }, function() {
    alert("OK");
}));