如何在JavaScript中模拟宏?

问题描述 投票:21回答:8

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

他们不一定非要花哨。我只想对他们做简单的事情。而且它不应该使调试变得非常困难:)

javascript browser macros lisp
8个回答
25
投票

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


22
投票

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


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+';';
}

使用“宏”,因此代码是“即时”生成的,我们不需要为每个指令进行函数调用或编写很多重复的代码...

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
投票

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


3
投票
function unless(condition,body) {
    return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}


eval(unless( function() {
    return false;
  }, function() {
    alert("OK");
}));

0
投票

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


-2
投票

解释了Java语言。与Java语言中的其他任何功能相比,Eval的成本更高。

© www.soinside.com 2019 - 2024. All rights reserved.