defrecord and deftype are most similar. They both define new types (concrete classes) that hold state and can have methods. The difference is how you should use them. defrecord is used for building out domain types. If you’re building accounting software, you might use defrecord to represent a transaction. When you use defrecord, you get a definition of equals built in that works like hash maps.
deftype, on the other hand, is for building low-level types—classes that are not part of the domain. For instance, if you wanted to make a tree data structure, you would use a deftype. It doesn’t really apply to the business domain but it is useful in the implementation. deftype gives you very little built in, which is great for giving you complete control.
defrecord and deftype are often confused. But really, for domain objects people tend to use hashmaps. Why make a new type?
drfmulti is a different animal. It’s for defining a function that has multiple implementations, dispatched by a value. Just like methods in Java-like OO dispatch based on the type of object, multimethods can dispatch. However, they dispatch based on any calculable value from any of the arguments. defmulti is closest to defining a new method in an interface.
Thanks again for the question. Keep them coming.