30

JavaScript がマクロ (Lisp スタイルのもの) をサポートしていないことは知っていますが、マクロをシミュレートするための解決策があるかどうか疑問に思っていましたか? 私はそれをグーグルで検索し、ソリューションの1つが を使用することを提案し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でゲームボーイエミュレーターを作成し、次のように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 に答える
-2

JavaScriptは解釈されます。Eval は、Javascript の他の何よりもコストがかかりません。

于 2008-10-11T01:50:58.667 に答える