如何在JavaScript中模拟宏?

And*_*sen 19 javascript lisp browser macros

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

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

Luí*_*ira 24

你可以使用parenscript.那将为你提供Javascript的宏.

  • @CesarCanassa parenscript是一个Common Lisp库,适用于大多数(可能是所有)主要实现(我自己尝试过).Clojurescript是一个更适合市场的市场,适合不同的观众. (5认同)
  • 不同的解决方案... Parenscript 是一个相当薄的层,与 ClojureScript 不同。 (4认同)
  • 不仅是不同的解决方案,也是不同的语言 (3认同)

And*_*een 22

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

  • SweetJS从2017年开始就没有更新过,你知道2022年SweetJS的背景是什么吗?除了mozilla之外,我还没有听说/见过其他人/公司在JS中使用宏。您对此有个人经验吗?谢谢 (3认同)

And*_*sen 10

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


小智 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)

希望能帮助到你...

  • 模拟器的源代码可以在任何地方使用吗? (2认同)
  • 我不认为这是真的.它可能是一个eval,但eval只发生一次.一旦它是一个函数,它应该以正常的函数速度执行任意次数. (2认同)

Vol*_*vka 5

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 中的其他任何东西更昂贵。

  • Ash,我认为 James 想要表达的观点是,对于一次性交易, eval 的运行速度与 JavaScript 一样快,因为*无论哪种方式*解释器都在做同样的事情 - 获取一个字符串并执行它。你认为字面上的 JavaScript 是什么?它是 HTML 文件中的一个字符串。 (7认同)
  • 我承认,这可能是 2000 年左右浏览器中 Javascript 的情况,但今天,对纯 Javascript 代码(即非评估)进行了认真的优化,而且这种情况只会继续下去。任何语言的字符串中的代码都无法在任何地方进行优化。 (2认同)