What is Symbolic Computation?
The difference between adding symbols to a language with product types (i.e. consing) and simply having algebraic data types in your language is that symbols are untyped, and so you&#x27;re allowed to compare apples and oranges (they&#x27;re inequal).<p>This isn&#x27;t terribly useful, as it&#x27;s almost always a mistake to do it. If you <i>do</i> have a context in which you want to compare apples and oranges, algebraic datatypes force your hand to declare which types of things you&#x27;d like to compare across (e.g., specify that you&#x27;re comparing any fruits, and that apples and oranges are fruits). This clarity helps form a clear mental model of how your software works and avoid bugs.<p>Lisp is the &quot;hold my beer, I know what I&#x27;m doing&quot; of functional programming languages. It, like other languages that take this stance, should be laid to rest. Time has demonstrated that programmers do not know what we&#x27;re doing, and need all the machine-provided help we can get.