In making an analogy between smart quotes and programming languages, it occurred to me that distinct characters for opening and closing delimiters might not be necessary, but simply a choice in readability.
For example, arguments in Ruby’s anonymous functions use identical pipes to open and close. Haskell uses white space with extreme prejudice.
I am not asking if different types of delimiters are necessary — brackets for indexers, braces for blocks — but whether distinct open and close braces (e.g. ( and )) are syntactically necessary in most languages, or simply a preference of the designers.