R6RS distinguishes between different requirement levels, both for the programmer and for the implementation. Specifically, the distinction between “should” and “must” is important: For example, “should” is used for restrictions on argument types that are undecidable or potentially too expensive to enforce. The use of “should” allows implementations to perform quite extensive checking of restrictions on arguments (see section 4.1), but also to eschew more expensive checks.
While it is reasonable to require the programmer to adhere to restrictions on arguments, some of these restrictions are either undecidable or too expensive to always enforce (see section 4.1). Therefore, some entries have additional paragraphs labelled “Implementation responsibilities” that distinguishes the responsibilities of the implementation from those of the implementation.