[1] Allowing quotation in a language wreaks havoc with the ability to reason about the language in simple terms, because it destroys the notion that equals can be substituted for equals. For example, three is one plus two, but the word three is not the phrase one plus two. Quotation is powerful because it gives us a way to build expressions that manipulate other expressions (as we will see when we write an interpreter in chapter 4). But allowing statements in a language that talk about other statements in that language makes it very difficult to maintain any coherent principle of what equals can be substituted for equals should mean. For example, if we know that the evening star is the morning star, then from the statement the evening star is Venus we can deduce the morning star is Venus. However, given that John knows that the evening star is Venus we cannot infer that John knows that the morning star is Venus.
[2] We can consider two strings to be the same if they consist of the same characters in the same order. Such a definition skirts a deep issue that we are not yet ready to address: the meaning of sameness in a programming language. We will return to this in chapter 3 (section 3.1.3).
[3] In practice, programmers use is_equal to compare lists that contain numbers as well as stringss. Numbers are not considered to be strings. A better definition of is_equal would also stipulate that if a and b are both numbers, then a and b are equal with respect to is_equal if they are equal with respect to ===.
2.3.1 Strings