Because the syntax for IF (<- HyperSpec link) is defined as:
if test-form then-form [else-form] => result*
There are no begin or end markers. There is a THEN-FORM and not THEN-FORM*.
PROGN is a mechanism to define a sequence of forms, where the forms are executed from left to right and the values of the last form are returned.
It could have been defined like this:
my-if test-form (then-form*) [(else-form*)] => result*
(defmacro my-if (test then &optional else)
(assert (and (listp then) (listp else)) (then else))
`(if ,test (progn ,@then) (progn ,@else)))
(my-if (> (random 10) 5)
((print "high")
:high)
((print "low")
:low))
Well, there is already a construct that supports multiple forms: COND.
(cond ((> (random 10) 5)
(print "high")
:high)
(t
(print "low")
:low))
The typical style is to use COND when multiple alternatives have to be tried and when there are multiple then/else-forms. IF is used when there is only one test and both a then and an else form. For other cases there is WHEN and UNLESS. WHEN and UNLESS support only one or THEN forms (no else form(s)).
I guess it is good to have at least one conditional form (IF in this case) that comes without added layers of parentheses. Writing
(if (> (random 10) 5)
(progn
(print "high")
:high)
(progn
(print "low")
:low))
is then a small price to pay. Either write the additional PROGNs or switch to the COND variant.
If your code would really benefit from IF with multiple then and else forms, then just write that macro (see above). Lisp has it, so that you can be your own language designer. It is important though to think about introducing a macro: is my macro correct? does it check errors? is it worth it? is it readable (for others?)?