我知道 JavaScript 不支持宏(Lisp 风格的),但我想知道是否有人有解决方案来模拟宏?我用谷歌搜索了它,其中一种解决方案建议使用eval()
,但正如他所说,成本会很高。
他们真的不必很花哨。我只想和他们做一些简单的事情。而且它不应该使调试变得更加困难:)
我知道 JavaScript 不支持宏(Lisp 风格的),但我想知道是否有人有解决方案来模拟宏?我用谷歌搜索了它,其中一种解决方案建议使用eval()
,但正如他所说,成本会很高。
他们真的不必很花哨。我只想和他们做一些简单的事情。而且它不应该使调试变得更加困难:)
你可以使用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
希望能帮助到你...
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 中的其他任何东西更昂贵。