Да, но тут возникает такая проблема: формально CPS-преобразование глобальное, и компиляторам нужно знать, внутри каких функций используются продолжения (прямо или опосредованно), а внутри каких — нет. А без этого знания компилятор преобразует вызовы request.sendBody/sendHeader и других библиотечных вызовов (но не сами библиотечные функции, естественно).
Так что надо пробовать, смотреть, какой код генерируют эти компиляторы и можно ли указать функции, которые конвертировать не надо (или, может быть, компилятор не конвертирует функции, про которые ничего не знает, но в этом случае тоже будут проблемы).
Пусть хотя бы добавят в v8, и то будет большой прогресс :)
Если я правильно помню, в новый стандарт ECMAscript продолжения не вошли из-за давления Microsoft, т.к. их нельзя эффективно реализовать на .NET (я имею в виду Jscript .NET). Опять виновата Microsoft :) хотя, возможно, и другие вендоры были не очень рады.
Но не всё потеряно — есть несколько Source-to-Source компиляторов Javascript. Не знаю, удастся ли их использовать вместе с node.js, всё собираюсь попробовать:
Конечно, можно. function в 4-й строке — самый что ни на есть continuation.
Однако на уровне языке продолжений как объектов первого класса нет, их приходится делать самому, вставляя в нужных местах function и скобочки. А вот в Scheme — есть. См. call-with-current-continuation. en.wikipedia.org/wiki/Call-with-current-continuation
Точно так же в C нет поддержки замыканий. Их, конечно, можно сделать с помощью указателей на функции, передавая им enironment в виде структуры, и можно даже говорить, что это «скорее вопрос стиля программирования»… Но это не значит, что там замыкания есть.
Чего не хватает джаваскрипту, чтобы превратиться в идеальное решение для написания асинхронных приложений (в том числе AJAX), так это поддержки продолжений на уровне языка, чтобы можно было писать асинхронный код линейно, а не с помощью огромного количества вложеных замыканий.
mod-lisp — это нечто вроде mod_fastcgi, так что его можно использовать хоть с чем, ничего особенно лиспового там нет, просто тупой как валенок протокол передачи запроса от апача приложению.
ИМХО, лучше взять GNU clisp и запустить на нём лисповый веб-сервер Hunchentoot. Или использовать fastcgi-модуль, который идёт в комплекте clisp.
«Мир Лиспа» там, перевод Practical Common Lisp (ищется в гугле), если хорошо знаете английский и интересно написание собственных реализаций — Lisp in Small Pieces и Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp (ищится в пираццких интернет-библиотеках).
А интерпретатор на списках — это, извините, баловство. Лисп надо компилировать ;)
Скажите пожалуйста, а почему у вас в первом уроке постоянно повторяется Intel 64, Intel 64, но лишь вскользь упоминается, что вы почему-то использовали документацию от AMD? У неискушённого читателя может сложиться впечатление, что это Microsoft изобрела интернет… Ой, в смысле, это Intel изобрела x86-64 ;)
Лучше на те же деньги купить бинокль, а то и телескоп (за 10 т.р. можно взять телескоп практически без пластмассы).
Так что надо пробовать, смотреть, какой код генерируют эти компиляторы и можно ли указать функции, которые конвертировать не надо (или, может быть, компилятор не конвертирует функции, про которые ничего не знает, но в этом случае тоже будут проблемы).
Если я правильно помню, в новый стандарт ECMAscript продолжения не вошли из-за давления Microsoft, т.к. их нельзя эффективно реализовать на .NET (я имею в виду Jscript .NET). Опять виновата Microsoft :) хотя, возможно, и другие вендоры были не очень рады.
Но не всё потеряно — есть несколько Source-to-Source компиляторов Javascript. Не знаю, удастся ли их использовать вместе с node.js, всё собираюсь попробовать:
www.neilmix.com/narrativejs/doc/
chumsley.org/jwacs/
en.wikipedia.org/wiki/Continuation#Programming_language_support
Хорошо, попробую совсем разжевать. С помощью продолжений, встроенных в реализацию, можно написать:
var a = stream.readline();
var b = stream.readline();
var c = a + b;
…
при этом оба вызова будут асинхронными, но второй readln будет вызван строго после того, как выполнится первый.
При этом в языке без поддержки продолжений придётся выписать их явно:
stream.readline(function (a) {
stream.readline(function (b) {
var c = a + b;
…
};
});
Почувствуйте разницу.
(Тег pre я указал, но парсер его съел, поэтому код не форматирован).
Однако на уровне языке продолжений как объектов первого класса нет, их приходится делать самому, вставляя в нужных местах function и скобочки. А вот в Scheme — есть. См. call-with-current-continuation. en.wikipedia.org/wiki/Call-with-current-continuation
Точно так же в C нет поддержки замыканий. Их, конечно, можно сделать с помощью указателей на функции, передавая им enironment в виде структуры, и можно даже говорить, что это «скорее вопрос стиля программирования»… Но это не значит, что там замыкания есть.
V8 compiles Javascript source code directly into machine code when it is first executed. There are no intermediate byte codes, no interpreter.
code.google.com/intl/ru/apis/v8/design.html
Переписать node.js на Scheme, что ли :)
В IE6/7/8 НЕ РАБОТАЕТ!!!11
Боюсь, для столь сложного приложения excanvas не поможет.
Кстати, написан он на Лиспе, а не PHP ;)
ИМХО, лучше взять GNU clisp и запустить на нём лисповый веб-сервер Hunchentoot. Или использовать fastcgi-модуль, который идёт в комплекте clisp.
«Мир Лиспа» там, перевод Practical Common Lisp (ищется в гугле), если хорошо знаете английский и интересно написание собственных реализаций — Lisp in Small Pieces и Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp (ищится в пираццких интернет-библиотеках).
А интерпретатор на списках — это, извините, баловство. Лисп надо компилировать ;)