我知道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
希望有帮助...
LispyScript是编译为Javascript的最新语言,支持宏。它具有类似于树语法的Lisp,但也保持相同的Javascript语义。免责声明:我是LispyScript的作者。
function unless(condition,body) {
return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}
eval(unless( function() {
return false;
}, function() {
alert("OK");
}));
检查Linux / Unix / GNU M4处理器。它是任何语言的通用且功能强大的宏处理器。它特别面向JavaScript所属的Algol风格的语言。
解释了Java语言。与Java语言中的其他任何功能相比,Eval的成本更高。