Building a tree with indentation is easy. You
would need some method to distinguish between a one element list and a value, and some method of specifying an empty list (though you could just write nil). One option that leaves everything completely uniform is to use something that says "this starts a list", and then have the (zero or more) elements indented including the list head if present. If we use (), this would read like:
()
prin1
()
*
()
+
3
4
7
Exceedingly vertical, obviously, if you don't allow inline parens at all.
If you were, you could compress any run of lines by simply moving everything with no children into the parent parens. Applying that only to the deepest bit of the above, we'd get:
()
prin1
()
*
(+ 3 4)
7
Of course, the original could be transformed into actual lisp by simply moving end-parens:
(
prin1
(
*
(
+
3
4
)
7
)
)