packages feed

EtaMOO-0.3.0.0: DIFFERENCES.md

Differences between EtaMOO and LambdaMOO
========================================

Besides the most notable differences described in the README, other minor
differences include:

  * EtaMOO fixes a long-standing bug in LambdaMOO that prevents commands using
    the "off of" preposition from being parsed correctly. To accomplish this,
    the "off/off of" preposition has been changed to "off of/off".

  * Assignment expressions behave somewhat differently in EtaMOO than they do
    in LambdaMOO.

    Assuming `x = {1, 2}` and `y = "foo"`:

| Expression        | LambdaMOO        | EtaMOO           |
| ----------------- | ---------------- | ---------------- |
| `x[1] = x[2] = 3` | `x` => `{3, 2}`  | `x` => `{3, 3}`  |
| `x[1] = (x = 0)`  | `x` => `{0, 2}`  | (error) `E_TYPE` |
| `y[$][1] = "b"`   | (error) `E_TYPE` | `y` => `"fob"`   |

  * EtaMOO provides a visual indication of the point at which MOO code
    compilation failed as part of the list of strings returned by
    `set_verb_code()` and `eval()`.

  * To mirror and complement the native support for string-key association
    list indexing, EtaMOO also extends the `listset()` and `listdelete()`
    functions to accept string-key indices for manipulating well-formed
    association lists.

  * Versions of LambdaMOO up to 1.8.3 only restrict to wizards the *reading*
    of built-in properties protected by `$server_options.protect_`*`prop`*.
    EtaMOO, as well as more recent versions of LambdaMOO, also restrict
    *writing* to such protected properties.

  * EtaMOO doesn't currently check the validity of built-in function names
    when compiling verb code; instead, calling an unknown function raises an
    error at runtime. (This is subject to change.)

  * In some cases the semantics of a language construct or built-in function
    differ slightly from that of LambdaMOO. Because MOO tasks run inside of an
    atomic transaction in EtaMOO, it is sometimes necessary to commit the
    transaction prematurely in order to perform some I/O or schedule another
    task. In these cases, the effect is the same as if `suspend(0)` had been
    called. These cases include:

        `fork`
        `listen()`
        `open_network_connection()`
        `memory_usage()`

  * In both EtaMOO and LambdaMOO, the `crypt()` built-in is a thin wrapper
    around the host system's `crypt()` library function. LambdaMOO doesn't
    check the return value from this function to see if it failed; it ends up
    returning an empty string in this case. EtaMOO raises `E_INVARG` instead.
    Note that `crypt()` can fail if an unsupported salt parameter is used.

  * The `value_hash()`, `string_hash()`, and `binary_hash()` built-in
    functions in EtaMOO accept two optional arguments in addition to the value
    or string to be hashed. The second argument is a string which selects the
    particular hash algorithm to use, and defaults to `"MD5"`. The following
    algorithms are supported:

        MD2           SHA-256        SHA3-256         Skein-512-256
        MD4           SHA-384        SHA3-384         Skein-512-384
        MD5           SHA-512        SHA3-512         Skein-512-512
        RIPEMD-160    SHA-512/224    Skein-256-224    Tiger
        SHA-1         SHA-512/256    Skein-256-256    Whirlpool
        SHA-224       SHA3-224       Skein-512-224

    The third argument, if provided and true, causes the digest value to be
    returned as a binary string instead of a string of hexadecimal digits.

  * In LambdaMOO, the strings returned from the `value_hash()`,
    `string_hash()`, `binary_hash()`, and `encode_binary()` built-in functions
    use uppercase hexadecimal digits. In EtaMOO, these strings use lowercase
    digits.

  * EtaMOO expects only printable ASCII characters to be present within MOO
    binary strings; in particular, ASCII HT (horizontal tab) is forbidden, and
    should be encoded instead as `"~09"`.

  * In LambdaMOO, the `buffered_output_length()` built-in returns the number
    of *bytes* currently buffered for output to a connection. In EtaMOO, this
    built-in currently returns the number of *items* buffered, where an item
    essentially represents all the data from a single call to `notify()`.
    (This is subject to change.)

  * EtaMOO accepts an optional argument to the `db_disk_size()` built-in that,
    if provided and true, causes the function to return an association list
    with various statistics from the persistence layer.

  * The result of the `disassemble()` built-in is very different in EtaMOO
    than in LambdaMOO, and currently shows the internal abstract syntax tree
    associated with a verb. (This is subject to change.)

  * The effective range of object values in EtaMOO is system-dependent, and
    not necessarily the same as the range of integer values.

  * Due to the way regular expression matching is implemented in EtaMOO, the
    `match()` built-in function is generally going to be more efficient than
    `rmatch()` and may also be able to handle a greater range of patterns
    before encountering resource limitations.

  * The numbers returned by the `value_bytes()` and `object_bytes()` built-in
    functions, as well as the last number in each list returned by
    `queued_tasks()`, are really vague estimates and probably not very
    accurate or meaningful due to the nature of the Haskell run time
    environment.