繁体   English   中英

如何在 JavaScript 中模拟宏?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM