我知道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
希望能帮助到你...