суббота, 7 февраля 2009 г.

how do i haskell in javascript

Если бы хэскелл был джаваскриптом а джаваскрипт бы был хэскеллом, то там были бы такие операторы!


var plus = function(left) {
return function(right) {
return left + right;
};
};

var sum = plus(121)(232);

var ternary = function(left) {
return left ?
function(middle) {
return function() {
return middle;
}
} :
function() {
return function(right) {
return right;
}
};
};

var oddity = ternary(sum % 2)('odd')('even');

// теперь как бы сделать чтобы по true запускалась одна ветка а по false другая

пятница, 6 февраля 2009 г.

how do i force windows script to run in console

Если нам надо выводить большие простыни текста, скрипт надо гонять в консоли. Но по умолчанию *.js запускается в wscript, а не в cscript.

Тут можно сделать так:



if(WScript.FullName.match(new RegExp('wscript', 'i'))) {
// мы запускаемся не в консоли
var sh = new ActiveXObject('WScript.Shell');
// скопируем коммандную строку, добавим установку ждать
// нажатия клавиши после работы, чтобы окно не сразу
// закрывалось
var cmdLine = 'cscript /nologo ' + WScript.ScriptFullName + ' /pause';
sh.Run(cmdLine);
return;
}




Факты, которых я не знал:
- out.Write('\x1b[2J') очищает экран терминала, но только если гонять cscript в rxvt или каком-нибудь другом ANSI-enabled терминале;
- консоль Windows 2000/XP не понимает ANSI escape sequences;

среда, 4 февраля 2009 г.

full optimisation

вот полная оптимизация в msvs 2003
это cl /Ox


{
pos += 1;
00680717 add eax,1
0068071A mov dword ptr [esi],eax
len = 1;
0068071C mov dword ptr [edi],1
// сосчитаем символы до закрывающей кавычки или конца строки
//while (!strchr("\"",string[pos+len] )&&(string[pos+len]!= '\0'))
// while(!memchr("\"\0", string[pos + len], 2) // интересно, как быстрее?
while(string[pos + len] && (string[pos + len] != '"'))
00680722 mov eax,dword ptr [ebx]
00680724 mov ecx,dword ptr [esi]
00680726 cmp byte ptr [ecx+eax+1],0
0068072B je $L92588+36h (68074Dh)
0068072D lea ecx,[ecx]
00680730 mov ecx,dword ptr [edi]
00680732 mov edx,dword ptr [esi]
00680734 add edx,ecx
00680736 cmp byte ptr [edx+eax],22h < --------o
0068073A je $L92588+36h (68074Dh) \
len++; \
0068073C add ecx,1 \
0068073F mov dword ptr [edi],ecx один и тот же адрес
00680741 mov ecx,dword ptr [esi] /
00680743 add ecx,dword ptr [edi] /
00680745 mov eax,dword ptr [ebx] ; eax не менялся /
00680747 cmp byte ptr [ecx+eax],0 < -------- o
0068074B jne $L92588+19h (680730h)
0068074D pop edi
0068074E pop esi
return TOKEN_WORD;
0068074F xor eax,eax
00680751 pop ebx
}
};//End case
}
00680752 ret 8



Она очень умная но не складывать string[pos + len] второй раз не додумалась.

Также, что такое lea ecx, [ecx] o_O
EDIT Я понял! Это выравнивание.