Chicken » Deviations from the standard

## Confirmed deviations from R7RS

Identifiers are by default case-sensitive (see Using the compiler).

### Number of arguments to procedures and macros

The maximal number of arguments that may be passed to a compiled procedure or macro is limited to around 1000. Likewise, the maximum number of values that can be passed to continuations captured using `call-with-current-continuation` is 1000. This is an implementation restriction that is unlikely to be lifted.

### Numeric string-conversion considerations

In some cases the runtime system uses the numerical string-conversion routines of the underlying C library. Consequently, the procedures `string->number`, `read`, `write`, and `display` do not obey read/write invariance for inexact numbers.

### Environments and non-standard syntax

In addition to the standard bindings, `scheme-report-environment` and `null-environment` contain additional non-standard bindings for the following syntactic forms: `import`, `require-extension`, `require-library`, `begin-for-syntax`, `export`, `module`, `cond-expand`, `syntax`, `reexport`, `import-for-syntax`.

### Assignment to unbound variables

`set!` may assign values to unbound variables; this creates a new top-level binding for the variable, as if `define` had been used instead. This extension must be used with care, as typos might cause unexpected results:

    > (let ((frob 5))
        (set! frov (+ frob 1))  ; oops!
        frob)
    > 5
    > frov
    > 6

## Unconfirmed deviations

### `char-ready?`

The procedure `char-ready?` always returns `#t` for terminal ports.

## Doubtful deviations

## Non-deviations that might surprise you

### `let-syntax` and `letrec-syntax`

`let-syntax` and `letrec-syntax` introduce a new scope.

### `equal?` compares all structured data recursively

`equal?` compares all structured data with the exception of procedures recursively, while R7RS specifies that `eqv?` is used for data other than pairs, strings and vectors. However, R7RS does not dictate the treatment of data types that are not specified by R7RS

Previous: Using the compiler

Next: Extensions to the standard