At least one demonstrable difference I can see between your recollection and this feature is that the column name being part of the DDL pushes the logic down into the DDL, versus every client having to carry that magic expression around with them. I think it's likely the age-old application-logic-client-side versus stored-proc camps
db=# select id, cast(length(name) AS text)||'0' as silly from my_table
as compared to <<select id, silly from my_table>> for the consumer