我知道JavaScript不支持宏(Lisp风格的),但我想知道是否有人有解决方案可能模拟宏?我用谷歌搜索,其中一个解决方案建议使用eval(),但正如他所说,将是非常昂贵的。
他们并不一定非常喜欢。我只想用它们做简单的事情。它不应该使调试更加困难:)
答案 0 :(得分:24)
您可以使用parenscript。那将为你提供Javascript的宏。
答案 1 :(得分:21)
Mozilla的一个库(名为SweetJS)旨在模拟JavaScript中的宏。例如,您可以使用SweetJS将function
关键字替换为def
。
答案 2 :(得分:10)
现在也可以使用ClojureScript将clojure编译为javascript并以此方式获取宏。注意ClojureScript使用Google Closure。
答案 3 :(得分: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+';';
}
使用“宏”,所以代码是“动态”生成的,我们不需要对它进行函数调用,也不需要为每个构造写出大量重复的代码......
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
希望它有所帮助...
答案 4 :(得分:4)
LispyScript是编译为Javascript的最新语言,支持宏。它有一个类似Lisp的树语法,但也保持相同的Javascript语义。 免责声明:我是LispyScript的作者。
答案 5 :(得分:3)
function unless(condition,body) {
return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}
eval(unless( function() {
return false;
}, function() {
alert("OK");
}));
答案 6 :(得分:0)
签出Linux / Unix / GNU M4处理器。它是任何语言的通用且功能强大的宏处理器。它特别针对JavaScript所属的Algol风格的语言。
答案 7 :(得分:-2)
Javascript被解释。对于Javascript中的任何其他内容,Eval的成本并不高。