Listed herein are language incompatibilites between 3.3 and 3.5,
that you should pay attention to when updating.

- LPC features
  + structs are always supported.
    __LPC_STRUCTS__ is always defined.
  + inline closures are always supported.
    __LPC_INLINE_CLOSURES__ is always defined.
  + call-other on arrays is always supported.
    __LPC_ARRAY_CALLS__ is always defined.
  + alists are no longer supported.
    __ALISTS__ was removed.

- sefun prefix:
  The 3.5 driver allows to explicitly call simul-efuns using a 'sefun::'
  prefix, e.g. sefun::fun(). If a program has inherited another
  program with the name "sefun" and explicitly called inherited
  lfuns with that syntax, this won't work anymore, because the
  driver now tries to find a simul-efun with that name.
  This also applies to symbol_function and closure literals (#'sefun::fun).

- ptmalloc keywords for debug_info():
  DID_MEM_MMAP, DID_MEM_MMAP_SIZE, DID_MEM_FREE_CHUNKS, DID_MEM_FFREE,
  DID_MEM_FFREE_SIZE, DID_MEM_MAX_ALLOCATED and DID_MEM_KEEP_COST were
  removed.

- Removed efuns:
  + The deprecated efuns cat() and tail() were removed. They can be
    easily and more flexibly replaced by sefuns, which are supplied with
    the driver in /mudlib/deprecated/. (#637, #228)
  + The efun set_light() was removed. This includes the internal light
    state managment in the driver. The mudlib does a better and more
    flexible job at managing light in/from objects. (#775)
  + The supporting efuns for alists were removed: insert_alist, order_alist,
    intersect_alist, assoc.
  + strlen() was removed. sizeof() can be used as a drop-in replacement, which
    does exactly the same thing.
  + The following efuns were removed in favor of new efuns.
    There are sefun replacements in /mudlib/deprecated/. (#596)

        set_heart_beat()         -> configure_object(ob, OC_HEART_BEAT, flag)
        enable_commands()        -> configure_object(ob, OC_COMMANDS_ENABLED, 1)
        disable_commands()       -> configure_object(ob, OC_COMMANDS_ENABLED, 0)
        seteuid()                -> configure_object(ob, OC_EUID, euid)
        query_once_interactive() -> object_info(ob, OI_ONCE_INTERACTIVE)
        query_shadowing()        -> object_info(ob, OI_SHADOW_PREV)
        set_connection_charset() -> configure_object(ob, IC_CONNECTION_CHARSET_AS_STRING, val)
                                    configure_object(ob, IC_CONNECTION_CHARSET_AS_ARRAY, val)
                                    configure_object(ob, IC_QUOTE_IAC, 1 resp. 0)
        get_connection_charset() -> object_info(ob, IC_CONNECTION_CHARSET_AS_STRING)
                                    object_info(ob, IC_CONNECTION_CHARSET_AS_STRING)
                                    object_info(ob, IC_QUOTE_IAC)
        set_combine_charset()    -> configure_object(ob, IC_COMBINE_CHARSET_AS_STRING, val)
                                    configure_object(ob, IC_COMBINE_CHARSET_AS_ARRAY, val)
        get_combine_charset()    -> object_info(ob, IC_COMBINE_CHARSET_AS_STRING)
                                    object_info(ob, IC_COMBINE_CHARSET_AS_STRING)
        set_buffer_size()        -> configure_interactive(ob, IC_SOCKET_BUFFER_SIZE, size)
        enable_telnet()          -> configure_interactive(ob, IC_TELNET_ENABLED, state)
        start_mccp_compress()    -> configure_interactive(ob, IC_MCCP, state)
        end_mccp_compress()      -> configure_interactive(ob, IC_MCCP, 0)
        query_mccp()             -> interactive_info(ob, IC_MCCP)
        query_mccp_stats()       -> interactive_info(ob, II_MCCP_STATS)
        set_prompt()             -> configure_interactive(ob, IC_PROMPT, prompt)
        set_max_commands()       -> configure_interactive(ob, IC_MAX_COMMANDS, num)
        get_max_commands()       -> interactive_info(ob, IC_MAX_COMMANDS)
        set_modify_command()     -> configure_interactive(ob, IC_MODIFY_COMMAND, ob)
        query_ip_name()          -> interactive_info(ob, II_IP_NAME)
                                    interactive_info(ob, II_IP_ADDRESS)
        query_ip_number()        -> interactive_info(ob, II_IP_NUMBER)
                                    interactive_info(ob, II_IP_ADDRESS)
        query_editing()          -> interactive_info(ob, II_EDITING)
        query_idle()             -> interactive_info(ob, II_IDLE)
        query_input_pending()    -> interactive_info(ob, II_INPUT_PENDING)
        debug_info()             -> driver_info(...)
                                    dump_driver_info(...)
                                    objects(...)
        query_limits()           -> driver_info(DC_DEFAULT_RUNTIME_LIMITS)
                                    driver_info(DI_CURRENT_RUNTIME_LIMITS)
        set_limits()             -> configure_driver(DC_DEFAULT_RUNTIME_LIMITS)
        set_extra_wizinfo_size() -> configure_driver(DC_EXTRA_WIZINFO_SIZE)
        query_load_average()     -> driver_info(DI_LOAD_AVERAGE_COMMANDS)
                                    driver_info(DI_LOAD_AVERAGE_LINES)
        query_mud_port()         -> driver_info(DI_MUD_PORTS)
                                    interactive_info(ob, II_MUD_PORT)
        query_udp_port()         -> driver_info(DI_UDP_PORT)
        query_snoop()            -> interactive_info(ob, II_SNOOP_NEXT)

  + The efun set_is_wizard() was removed. It can be implemented with
    normal actions. Example implementations are provided in
    /mudlib/deprecated. (#596)
  + The efun export_uid() was removed. The object's UID is now constant
    and can't be changed. Instead the EUID can be exported with
    configure_object(ob, OC_EUID, geteuid()). (#828)

- New efuns:
  + json_parse() parses strings encoding a JSON object into an
    appropriate LPC value. (optional efun)
  + json_serialize() converts a LPC value into an JSON object and
    serializes it as LPC string. (optional efun)
  + configure_object() sets options for given objects. (#596)
  + interactive_info() and driver_info() return information about
    interactive objects resp. the driver and the LPC runtime. (#596)
  + dump_driver_info() dumps information to a file. (#596)
  + objects() returns an excerpt from the object list. (#596)

- Changed efuns:
  + call_other() and call_direct() now always accept an array of objects or
    strings (object names) as argument and call the function in all of these
    objects.
  + object_info() was redesigned to just return a single information including
    configuration options from configure_object(). (#596)
  + The functionality of shadow(ob, 0) was removed in favor of
    object_info(ob, OI_SHADOW_NEXT). There is a sefun implementation with
    the old signature in /mudlib/deprecated/. (#596)
  + net_connect() had the current udp port as an undocumented default value
    for its second argument. Now both parameters are mandatory.
  + sort_array() and reverse() also work with array range references.
  + apply() now expands an lvalue reference to an array or an array range
    as lvalue references to the array elements.

- Pragmas
  + The behaviour of the pragma combine_strings is mandatory, that means
    string literals concatenated by '+' will always be combined at
    compile-time. This pragmas and no_combine_strings are ignored. (#702)
  + The behaviour of the pragma local_scopes is mandatory, that means
    that variables defined in a block always cease to exist after the end of
    the block. This pragma and no_local_scopes are ignored  (#702)
  + The behaviour of the pragma verbose_errors is mandatory, the compiler will
    always give information about the context of an error.
    This pragma is ignored  (#702)
  + The pragma warn_deprecated is now enabled by default. (#702)
  + The new pragma warn_rtt_checks shows runtime type errors
    as warnings (#763)

- 'deprecated' modifier
  The deprecated modifier can be used for lfuns (and sefuns) and global
  variables. Upon creating and closure to them or using/calling them the
  compiler will issue a warning. The same occurs in symbol_function(),
  symbol_variable() and call_other/call_direct/call_resolved().

- LPC types
  + the 'float' type on 64 bit platforms (specifically LP64) has a higher
    precision and larger value ranges, because the driver uses the native
    'double' types of the host system to store them. On most host systems they
    conform to the IEEE 754 double precision floating point format.
    WARNING: If you want to save them losslessly with save_object/save_value(),
             you MUST use savefile format version 2 or higher!

- Visibility modifiers
  + Visibility modifiers are not combinable anymore. (#771)
  + Added a new modifier: visible (which is the default visibility).

