## 5.2 Extensions to the standard

[2.1] Identifiers may contain special characters if delimited with `| ... |`.

[2.3] The brackets `[ ... ]` are provided as an alternative syntax for `( ... )`. A number of reader extensions is provided. See 5.3.

[4] Numerous non-standard macros are provided. See 5.4 for more information.

[4.2.2] It is allowed for initialization values of bindings in a `letrec` construct to refer to previous variables in the same set of bindings, so

    (letrec ([foo 123]
             [bar foo] )
      bar)

is allowed and returns `123`. This extension is not available when strict R5RS `letrec` semantics have been selected (by using the `-strict`, `-strict-srfi-0` or `-strict-letrec` option).

[4.2.3] `(begin)` is allowed in non-toplevel contexts and evaluates to an unspecified value.

[4.2.5] Delayed expressions may return multiple values.

[5.2.2] `define-values` may be used in internal definitions if the R5RS macro system is not used.

Chicken extends standard semantics by allowing internal definitions everywhere, and not only at the beginning of a body. A set of internal definitions is equivalent to a `letrec` form enclosing all following expressions in the body:

    (let ([foo 123])
      (bar)
      (define foo 456)
      (baz foo) )

expands into

    (let ([foo 123])
      (bar)
      (letrec ([foo 456])
        (baz foo) ) )

This extension to the standard semantics is not available in combination with the hygienic (`syntax-case`) macro system. Under the hygienic macro system an error will be signalled when internal definitions occur at a position that is not at the beginning of a body.

[6] Chicken provides numerous non-standard procedures. See the manual sections on library units for more information.

[6.3.4] User defined character names are supported. See `char-name`.

[6.3.5] Chicken supports special characters preceded with a backslash ``'' in quoted string constants. ``n'' denotes the newline-character, ``r'' carriage return, ``b'' backspace, ``t'' TAB and ``xXX'' a character with the code `XX` in hex.

[6.4] `force` called with an argument that is not a promise returns that object unchanged. Captured continuations can be safely invoked inside before- and after-thunks of a `dynamic-wind` form and execute in the outer dynamic context of the `dynamic-wind` form.

[6.5] The second argument to `eval` is optional and defaults to the value of `(interaction-environment)`. `scheme-report-environment` and `null-environment` accept an optional 2nd parameter: if not `#f` (which is the default), toplevel bindings to standard procedures are mutable and new toplevel bindings may be introduced.

[6.6.1] if the procedures `current-input-port` and `current-output-port` are called with an argument (which should be a port), then that argument is selected as the new current input- and output-port, respectively. The procedures `open-input-file`, `open-output-file`, `with-input-from-file`, `with-output-to-file`, `call-with-input-file` and `call-with-output-file` accept an optional second (or third) argument which should be one or more keywords, if supplied. These arguments specify the mode in which the file is opened. Possible values are the keywords `#:text`, `#:binary` or `#:append`.