如何在JavaScript中模拟宏?

时间:2008-10-11 01:15:40

标签: javascript browser macros lisp

我知道JavaScript不支持宏(Lisp风格的),但我想知道是否有人有解决方案可能模拟宏?我用谷歌搜索,其中一个解决方案建议使用eval(),但正如他所说,将是非常昂贵的。

他们并不一定非常喜欢。我只想用它们做简单的事情。它不应该使调试更加困难:)

8 个答案:

答案 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的成本并不高。