В дополнение к комментарию Майкла о функциональных языках, посмотрите на замыкания и блоки (как это сделано в Objective-C). Они позволяют вам рассматривать функции или фрагменты кода как первоклассные объекты, которые вы можете передавать и вызывать по требованию. С этим можно сделать кое-что интересное, и оно также станет парадигмой программирования массовых многоядерных систем.
Вы также можете изучить каррирование, что означает привязку некоторых параметров функции, чтобы вы могли использовать ее для меньшего количества аргументов. Таким образом, вы можете создать функцию логарифма base-b, которую вы можете использовать для создания функций логарифма base-2, base-10 и т. Д.
И что-то менее функциональное (как в языке): если посмотреть на то, как Руби рассматривает все как объект (даже числа), с этим можно немало поработать. Как объектно-ориентированная среда выполнения с самоанализом, интерпретатор «бесплатно» и т. Д. Реализация ООП проще, чем вы думаете.
За последние 30 с лишним лет было сделано много всего, не ограничивайтесь программированием в стиле 70-х! ;) Если вы ищете вдохновение, ознакомьтесь с Ruby, Python, Scala, Objective-C, JavaScript (читайте Дуглас Крокфорд JavaScript: The Good Parts ) и т. Д.