[英]How can I simulate macros in JavaScript?
我知道 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 中的其他任何东西更昂贵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.