Ответ 1
Вы можете использовать parenscript. Это даст вам макросы для Javascript.
Я знаю, что JavaScript не поддерживает макросы (Lisp -style), но мне было интересно, есть ли у кого-нибудь решение для моделирования макросов? Я разобрал его, и одно из решений, предложенное с использованием eval(), но, по его словам, было бы довольно дорогостоящим.
Они действительно не должны быть очень интересными. Я просто хочу сделать с ними простые вещи. И это не должно сделать отладку значительно сложнее:)
Вы можете использовать parenscript. Это даст вам макросы для Javascript.
Библиотека Mozilla (называемая SweetJS) предназначена для имитации макросов в JavaScript. Например, вы можете использовать SweetJS, чтобы заменить ключевое слово function
на def
.
Можно также использовать ClojureScript для компиляции clojure в javascript и таким образом получить макросы. Примечание. ClojureScript использует Google Closure.
Я написал эмулятор 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
Надеюсь, что это поможет...
LispyScript - это последний язык, который компилируется в Javascript, который поддерживает макросы. Он имеет синтаксис дерева Lisp, но также поддерживает ту же самую семантику Javascript. Отказ от ответственности: я являюсь автором LispyScript.
function unless(condition,body) {
return 'if(! '+condition.toSource()+'() ) {' + body.toSource()+'(); }';
}
eval(unless( function() {
return false;
}, function() {
alert("OK");
}));
Javascript интерпретируется. Eval не является более дорогостоящим, чем что-либо еще в Javascript.