And*_*sen 19 javascript lisp browser macros
我知道JavaScript不支持宏(Lisp风格的),但我想知道是否有人有解决方案可能模拟宏?我用谷歌搜索,其中一个解决方案建议使用eval(),但正如他所说,将是非常昂贵的.
他们并不一定非常喜欢.我只想用它们做简单的事情.它不应该使调试更加困难:)
Luí*_*ira 24
你可以使用parenscript.那将为你提供Javascript的宏.
小智 5
我用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+';';
}
Run Code Online (Sandbox Code Playgroud)
使用"宏",所以代码是"动态"生成的,我们不需要对它进行函数调用,也不需要为每个构造写出大量重复的代码......
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
Run Code Online (Sandbox Code Playgroud)
现在我们可以像这样执行模拟代码:
OP[MEM[PC]](); // MEM is an array of bytes and PC the program counter
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你...
function unless(condition,body) {
return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}
eval(unless( function() {
return false;
}, function() {
alert("OK");
}));
Run Code Online (Sandbox Code Playgroud)
Jam*_*ran -1
JavaScript 被解释。Eval 并不比 Javascript 中的其他任何东西更昂贵。