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 5.1), but also to eschew more expensive checks.