Как я могу симулировать макросы в JavaScript? - PullRequest
18 голосов
/ 11 октября 2008

Я знаю, что JavaScript не поддерживает макросы (в стиле Лисп), но мне было интересно, есть ли у кого-нибудь решение для симуляции макросов? Я гуглил это, и одно из решений предложило использовать eval (), но, по его словам, было бы довольно дорого.

Они не должны быть очень причудливыми. Я просто хочу сделать с ними простые вещи. И это не должно значительно усложнять отладку:)

Ответы [ 7 ]

24 голосов
/ 11 октября 2008

Вы можете использовать parenscript . Это даст вам макросы для Javascript.

21 голосов
/ 05 января 2013

Библиотека Mozilla (называемая SweetJS ) предназначена для имитации макросов в JavaScript. Например, вы можете использовать SweetJS для замены ключевого слова function на def.

10 голосов
/ 21 июля 2011

Теперь можно также использовать ClojureScript для компиляции clojure для javascript и получения макросов таким образом. Примечание. ClojureScript использует Google Closure.

5 голосов
/ 07 сентября 2009

Я написал эмулятор gameboy в javascript и симулирую макросы для эмуляции процессора следующим образом:

код макроса (функция возвращает строку с кодом макроса):

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 голосов
/ 06 августа 2012

LispyScript - это новейший язык, который компилируется в Javascript, который поддерживает макросы. Он имеет синтаксис дерева, похожего на Lisp, но поддерживает ту же семантику Javascript. Отказ от ответственности: я являюсь автором LispyScript .

3 голосов
/ 26 октября 2009
function unless(condition,body) {
    return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}


eval(unless( function() {
    return false;
  }, function() {
    alert("OK");
}));
0 голосов
/ 11 октября 2008

Javascript интерпретируется. Eval не более дорог, чем все остальное в Javascript.

...