Если вас интересуют парадигмы, на них наносится бумага Programming Paradigms for Dummies: What Every Programmer Should Know.
В функциональном программировании состояние неявное - программа выполняет вызовы функций, которые вызывают другие функции. В императивном программировании и объектно-ориентированном программировании состояние явное - вы изменяете значение переменной или поля объекта.
В некотором смысле функциональные и императивные системы можно рассматривать как двойники - то, что фиксировано в одном, является динамическим значением в другом.
Замыкания, которые задерживают некоторое явное изменчивое состояние в объекте, который может быть вызван как функция, находятся где-то между ними, не являясь ни функциональным, ни функциональным программированием, но не вполне полноценными объектами; они больше похожи на анонимные объекты, чем на функции.
«Динамические языки» является расплывчатым термином, как правило, это означает одно из следующих действий:
динамически типизированных языков - языков, которые задерживают определение типа во время выполнения программы, но набор типов фиксирована. Примерами являются Smalltalk, Lisps, текущие версии Fortress. Некоторые иначе статически типизированные языки также допускают некоторые проверки динамического типа - Java, C#, C++ и Ada. (это был неудачный динамический тип, отлитый от float до int в Ada, который разбился Ariane 5)
Языки с динамическими типами - языки, где во время выполнения могут быть созданы новые типы. Самым популярным является JavaScript.Поскольку вам нужно запустить программу для определения типов, сложнее создать для них IDE с автозавершением типа.
Языки, которые динамически скомпилированы - языки, где новые скрипты могут быть скомпилированы во время выполнения. Это справедливо для bash, JSP, PHP и ASP в масштабе страницы, а для более тонких - для лисп и JavaScript, которые поддерживают функцию eval, которая компилирует и запускает выражение.
Функциональные языки, которые сильно типизированных часто выполняют большое количество умозаключений типа, так что общие для их программы, чтобы иметь менее явный ввод чем плохо реализован статический типизированных языков. Это может смутить людей, которые видели только отсутствие явной типизации в динамически типизированных языках, полагая, что вывод типа такой же, как и динамическая типизация.
ответил (а) Комментарий. - найдите бесплатную версию Practical Common Lisp в Интернете и посмотрите пример, когда автор создает базу данных треков MP3, используя «только функции». Небольшой пример, но неплохо передает возможности. – Gishu