Skip to content


Subversion checkout URL

You can clone with
Download ZIP
JavaScript Erlang Other
Latest commit ec9e434 @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/
erl_lib_core Update lists.erl patch, to new erl_lib_core directory structure
erl_src Add more modules from stdlib, move to src, handle includes
erljs_code To make git not deletate directory. It would be good to have it empty
erljs_html More demo page updates
examples Show partial pi results more often
from_otp Initial import
js_lib Add XHTML fix to prototype.js
js_src Tweak scheduler default settings.
praca Move libs.txt to praca/ directory.
reveng Add copyright info to almost all files
tests Add few small tests with spaces in lists.
tools Add tests_arithmetic which tests arithmetic
.gitignore Update .gitignore patch, to new erl_lib_core directory structure
BUGS Commit everything accumulated in last years
COPYING Add copyright info to almost all files
HISTORY Some history in quite chronological order
OTHERS Add information about alternative Erlang Interpreter (directly from .…
PLATFORMS Commit everything accumulated in last years
README Implement erlang:now/0 BIF
STATUS Cleanup continues - renames, updates
TESTING Commit everything accumulated in last years
TODO Update README and TODO, to make it more cohherent
WAYS Added possible ways to implement erlang in browser, and what I'm doing Automatically create links and clone repos


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.

Something went wrong with that request. Please try again.