Erlang in the web browser
JavaScript Erlang Other
Latest commit ec9e434 Dec 26, 2011 @baryluk Add XHTML fix to prototype.js
Gecko-based browsers, doesn't like using innerHTML with incorrect XML
fragments like "<link>". Change it to "<link></link>".

Found in IceApe 2.0.6, but also present in SeaMonkey 2.6.1 and Iceweasel 9.0.1

Upstream ticket
Failed to load latest commit information.
erl_lib Move ct_expand to erl_lib/ Dec 1, 2011
erl_lib_core Update lists.erl patch, to new erl_lib_core directory structure Dec 19, 2011
erl_src Add more modules from stdlib, move to src, handle includes Dec 19, 2011
erljs_code To make git not deletate directory. It would be good to have it empty Apr 16, 2010
erljs_html More demo page updates Dec 25, 2011
examples Show partial pi results more often Dec 26, 2011
from_otp Initial import Apr 12, 2010
js_lib Add XHTML fix to prototype.js Dec 26, 2011
js_src Tweak scheduler default settings. Dec 26, 2011
praca Move libs.txt to praca/ directory. May 8, 2011
reveng Add copyright info to almost all files Dec 4, 2011
tests Add few small tests with spaces in lists. Dec 25, 2011
tools Add tests_arithmetic which tests arithmetic Dec 19, 2011
.gitignore Update .gitignore patch, to new erl_lib_core directory structure Dec 19, 2011
BUGS Commit everything accumulated in last years Nov 27, 2011
COPYING Add copyright info to almost all files Dec 4, 2011
HISTORY Some history in quite chronological order Apr 14, 2010
OTHERS Add information about alternative Erlang Interpreter (directly from .… Jul 18, 2010
PLATFORMS Commit everything accumulated in last years Nov 27, 2011
README Implement erlang:now/0 BIF Dec 25, 2011
STATUS Cleanup continues - renames, updates Dec 1, 2011
TESTING Commit everything accumulated in last years Nov 27, 2011
TODO Update README and TODO, to make it more cohherent Dec 1, 2011
WAYS Added possible ways to implement erlang in browser, and what I'm doing Apr 16, 2010 Automatically create links and clone repos Dec 15, 2011


erljs - Run Erlang in JavaScript

This projects allows you to run Erlang code directly
in the webbrowser!

If you do not know what Erlang is, please read: - Erlang programming language home page

In short, it is functional language designed for fault-tolerant
and concurrant systems. Because of its design it also fits
nicely as language of choice for modern dynamic web pages.

You will find examples in examples/ directory.

Some motivation can be find in STATUS


Currently we have pretty good implementation of some
basic stuffs. Some modules seems to be fully functional.

What is working:

- data types: atom, integer, float, tuple, list.
  - to do: funs make_fun2
- arithmetic
- pattern matching and tests
- tuple operations
- list operations
- calling functions, from the same and other modules, with and without fqn,
- funs
- lists comprehension (without bitstring generators),
- tail recursion
- spawning processes, and message passing, scheduler,
- exceptions, stack trace for exceptions (not yet fully correct).

 - messages are passed using references
 - scheduler is designed for small number of processes, so do not run more than 200 processes
 - integer arithmetic is limited to 2^53
   - i have simple biginteger.js library, but i would want to make overhead for small integers small,
   - i also want to remove from it some unneded parts for us.
   - after overflow
 - operations on floats and intergers can be intermixed.
   - for example one can `F rem 10`, even when F is float.
 - float exceptions aren't checked and thrown
   - JS have floating point exceptions disabled, but Erlang have them enabled, emulation will be slow.
   - so it is possible to have NaN, +-Inf, or underfloat in variables.
   - possible solution: add erljs:check_nan(X) test a variable.
 - erlang:now/0 have 1ms real resolution, in some cases about 15ms (Windows XP).
   (erljs will use 1us resolution timer in Chrome started with --enable-benchmkaring,
    it is however only accurate for measuring relative times)

Both Erlang and JS are dynamically typed languages. Unfortunettelly JS is weakly typed,
but Erlang is strongly typed. This means that we need to perform some additional
checks in JS to be sure that types are correct. There is also problem
with boxing/unboxing on JS side, but this should work automatically.
Most important problem is that JavaScript doesn't have arbitrar sized integers,
and the fact that JS doesn't have separate integer and float types.

Currently bignums and integers are really floats! On some
operations we know will result in floats but we want integer
we perform rounding/truncation, but this can be buggy for
sufficientyl big numbers.

 - bit strings,
 - tracing,
 - phash,
 - cleanup,
 - dynamic module loading.
 - lots of other small things, see TODO file

Tested mainly in Opera 10.52 on Linux. Some tests in Chrome and Epiphany also.

Should also work in Rhino (Mozilla's JS engine written in Java). Usefull
for unittesting, etc.