Next: , Previous: , Up: overview   [Index]


1.6 Implementation restrictions

Here is a list of implementation constraints which may be non–compliant with R6RS.

  1. Scheme strings can hold at most (greatest-fixnum) characters; the length of a string and all the valid indexes into strings are representable as fixnums.
  2. Scheme bytevectors can hold at most (greatest-fixnum) bytes; the length of a bytevector and all the valid indexes into bytevectors are representable as fixnums.
  3. The last argument to apply can be a list of at most 8192 values. This is an artificially set limit to avoid problems with huge values (it could be greater than this). As comparison: LispWorks for Unix sets this value to 300, LispWorks for Windows and LispWorks for Linux set this value to 255 (last verified from its online documenattion in November, 2011).
  4. R6RS mandates that illegal references to bindings established by letrec and letrec* are detected at run time and cause an assertion violation to be raised. Vicare detects them at compile–time, so some fully R6RS–compliant code will not work under Vicare.

    For example, the following program will run under a R6RS–compliant implementation:

    (import (rnrs))
    (letrec ((x (if (eq? (cons 1 2)
                         (cons 1 2))
                    x
                  1)))
      x)
    

    because the form x in reference position in the right-hand side of the binding is never evaluated; under Vicare this code will rather raise a syntax violation at compile time.

  5. The following functions accept only non–negative fixnums as offset argument:
    bitwise-arithmetic-shift-left
    bitwise-arithmetic-shift-right
    
  6. The function bitwise-arithmetic-shift accepts only fixnums as offset argument.