Since if-statements are built out of blocks and message sending, you can easily do some cool things. One of them is building up an abstract syntax tree (AST) of an expression without parsing that expression.
E.g. suppose you want to build up an AST of the statement
(x < 0) ifTrue:[-x] ifFalse:[x]
Instead of starting with an x of type Number, you would start with an object of type ASTVariable, that responds to the message < by creating and returning an object ASTLessThan instead of the Boolean True or False. When that object is sent the ifTrue:ifFalse: message it evaluates both branches to create the ASTs for both branches and then creates an ASTIfStatement.As an sexp:
(ASTIfStatement
:condition (ASTLessThan #1=(ASTVariable :name x) (ASTConstant :value 0))
:consequent (ASTUnaryMinus #1#)
:alternative #1#)
I've seen it used in a number of embedded languages in Smalltalk, such as SQL.