Even though matched square brackets are synonymous with parentheses in the syntax, many programmers use square brackets only in a few select places. In particular, programmers should restrict use of square brackets to places in syntactic forms where two consecutive open parentheses would otherwise be common. These are the applicable forms specified in the report and the library report:
For cond forms (see report section on “Derived conditionals”), a <cond clause> may take one of the follow forms:
[<test> <expression1> ...]
For case forms (see report section on “Derived conditionals”), a <case clause> may take one of the follow forms:
[(<datum1> ...) <expression1> <expression2> ...]
For let, let*, letrec, letrec* forms (see report section on “Binding constructs”), <bindings> may take the following form:
([<variable1> <init1>] ...)
For let-values and let-values* forms (see report section on “Binding constructs”), <mv-bindings> may take the following form:
([<formals1> <init1>] ...)
For syntax-rules forms (see report section on “Macro transformers”), a <syntax rule> may take the following form:
[<srpattern> <template>]
For identifier-syntax forms (see report section on “Macro transformers”), the two clauses may take the following form:
[<id1> <template1>]
For do forms (see library section on “Control structures”), the variable bindings may take the following form:
([<variable1> <init1> <step1>] ...)
For case-lambda forms (see library section on “Control structures”), a <case-lambda clause> may take the following form:
[<formals> <body>]
For raise forms (see library section on “Exceptions”), a <cond clause> may take one of the follow forms:
[<test> <expression1> ...]
For syntax-case forms (see library chapter on “syntax-case”), a <syntax-case rule> may take one of the following forms:
[<pattern> <output expression>]