I'm not really well versed in the language, but from what I've seen it takes the whole 'everything is an object' concept seriously, which I think is kinda fun.
For example, booleans are an object that can have two values: True and False. There's also two methods on the boolean object, ifTrue: and ifFalse:, and they both take a code block/anonymous function as the only argument. Both True and False override these functions. True's version of ifTrue: calls the code it's passed, and False's version does nothing (and vice-versa for ifFalse:).
For example:
a < b
ifTrue: [^'a is less than b']
ifFalse: [^'a is greater than or equal to b']
They're implemented more or less as a standard library package rather than a language construct. You could potentially extend the boolean class with different implementations of ifTrue and ifFalse, maybe reversing the logic or logging the branch taken or whatever. The functionality can be changed dynamically.
I think it's neat when a language eats itself like that.
Yeah. Smalltalk is pretty much that. Even moreso than Lisp. And now for the mandatory quote from "A Brief, Incomplete, and Mostly Wrong History of Programming Languages":
1980 - Alan Kay creates Smalltalk and invents the term "object oriented."
When asked what that means he replies, "Smalltalk programs are just objects."
When asked what objects are made of he replies, "objects." When asked again he says
"look, it's all objects all the way down. Until you reach turtles."