30

我知道 JavaScript 不支持宏(Lisp 风格的),但我想知道是否有人有解决方案来模拟宏?我用谷歌搜索了它,其中一种解决方案建议使用eval(),但正如他所说,成本会很高。

他们真的不必很花哨。我只想和他们做一些简单的事情。而且它不应该使调试变得更加困难:)

4

8 回答 8

27

你可以使用parenscript。这将为您提供 Javascript 的宏。

于 2008-10-11T16:57:31.160 回答
24

Mozilla 的一个库(称为SweetJS)旨在模拟 JavaScript 中的宏。例如,您可以使用 SweetJS 将function关键字替换为def.

于 2013-01-05T01:43:50.150 回答
12

现在还可以使用ClojureScript将 clojure 编译为 javascript 并以这种方式获取宏。注意 ClojureScript 使用 Google Closure。

于 2011-07-21T12:28:10.837 回答
7

我用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

希望能帮助到你...

于 2009-09-07T19:27:48.833 回答
5
function unless(condition,body) {
    return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}


eval(unless( function() {
    return false;
  }, function() {
    alert("OK");
}));
于 2009-10-26T10:53:34.620 回答
3

LispyScript是最新的编译成 Javascript 的语言,它支持宏。它具有类似 Lisp 的树语法,但也保持相同的 Javascript 语义。免责声明:我是LispyScript的作者。

于 2012-08-06T10:05:37.210 回答
1

查看 Linux/Unix/GNU M4 处理器。它是适用于任何语言的通用且强大的宏处理器。它特别面向 JavaScript 所属的 Algol 风格的语言。

于 2020-05-09T18:53:56.230 回答
-2

Javascript被解释。Eval 并不比 Javascript 中的其他任何东西更昂贵。

于 2008-10-11T01:50:58.667 回答