【发布时间】:2010-09-16 15:37:21
【问题描述】:
我知道 JavaScript 不支持宏(Lisp 风格的),但我想知道是否有人有解决方案来模拟宏?我用谷歌搜索了一下,其中一个解决方案建议使用eval(),但正如他所说,成本会很高。
他们真的不必很花哨。我只想和他们做一些简单的事情。而且它不应该使调试变得更加困难:)
【问题讨论】:
标签: javascript macros metaprogramming
我知道 JavaScript 不支持宏(Lisp 风格的),但我想知道是否有人有解决方案来模拟宏?我用谷歌搜索了一下,其中一个解决方案建议使用eval(),但正如他所说,成本会很高。
他们真的不必很花哨。我只想和他们做一些简单的事情。而且它不应该使调试变得更加困难:)
【问题讨论】:
标签: javascript macros metaprogramming
您可以使用parenscript。这将为您提供 Javascript 的宏。
【讨论】:
Mozilla 的一个库(称为SweetJS)旨在模拟 JavaScript 中的宏。例如,您可以使用 SweetJS 将 function 关键字替换为 def。
【讨论】:
现在还可以使用ClojureScript 将clojure 编译为javascript 并以这种方式获取宏。注意 ClojureScript 使用 Google Closure。
【讨论】:
我用 javascript 编写了一个 gameboy 模拟器,并以这种方式模拟 cpu 模拟的宏:
宏代码(函数返回带有宏代码的字符串):
function CPU_CP_A(R,C) { // this function simulates the CP instruction,
return ''+ // sets CPU flags and stores in CCC the number
'FZ=(RA=='+R+');'+ // of cpu cycles needed
'FN=1;'+
'FC=RA<'+R+';'+
'FH=(RA&0x0F)<('+R+'&0x0F);'+
'ICC='+C+';';
}
使用“宏”,因此代码是“动态”生成的,我们不需要对它进行函数调用或为每个指令编写大量重复的代码......
OP[0xB8]=new Function(CPU_CP_A('RB',4)); // CP B
OP[0xB9]=new Function(CPU_CP_A('RC',4)); // CP C
OP[0xBA]=new Function(CPU_CP_A('RD',4)); // CP D
OP[0xBB]=new Function(CPU_CP_A('RE',4)); // CP E
OP[0xBC]=new Function('T1=HL>>8;'+CPU_CP_A('T1',4)); // CP H
OP[0xBD]=new Function('T1=HL&0xFF;'+CPU_CP_A('T1',4)); // CP L
OP[0xBE]=new Function('T1=MEM[HL];'+CPU_CP_A('T1',8)); // CP (HL)
OP[0xBF]=new Function(CPU_CP_A('RA',4)); // CP A
现在我们可以像这样执行模拟代码:
OP[MEM[PC]](); // MEM is an array of bytes and PC the program counter
希望对你有帮助...
【讨论】:
new Function(string) 是eval() 上下文,因此具有与eval() 相同的性能特征
Function 对象,这与“普通” JavaScript 代码不同。然而,当我读到这篇文章是几年前的事了,所以我想知道现在普通的 JS 引擎对它们的支持程度如何。尤其是在闭包优化方面付出了所有努力。
function unless(condition,body) {
return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}
eval(unless( function() {
return false;
}, function() {
alert("OK");
}));
【讨论】:
LispyScript 是最新的编译成 Javascript 的语言,它支持宏。它具有类似 Lisp 的树语法,但也保持相同的 Javascript 语义。 免责声明:我是LispyScript的作者。
【讨论】:
查看 Linux/Unix/GNU M4 处理器。它是适用于任何语言的通用且功能强大的宏处理器。它特别面向 JavaScript 所属的 Algol 风格的语言。
【讨论】:
Javascript 被解释。 Eval 并不比 Javascript 中的其他任何东西更昂贵。
【讨论】: