Skip to content
JavaScript Erlang Other
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
erl_src Add more modules from stdlib, move to src, handle includes
examples Show partial pi results more often
from_otp Initial import
js_src Tweak scheduler default settings.
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
TESTING Commit everything accumulated in last years
TODO Update README and TODO, to make it more cohherent


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.