Для багатьох найчистішою формою абстрагування коду в сучасну епоху бінарного програмування є "функція вищого порядку". В основному, сама функція розглядається як дані, а функції функцій визначаються так, як ви б їх бачили в математичних рівняннях з операторами, що визначають результат їх операндів і заздалегідь визначений порядок операцій, що визначають "вкладення" цих операцій. Математика має дуже мало «імперативних команд» у своїй структурі; два приклади, які я можу придумати, - це "нехай x має деяке значення або будь-яке значення, яке відповідає деякому обмеженню", і "кусочно функції", в яких вхід визначає вираз, необхідний для отримання результату. Ці конструкції легко представити як власні функції; "функція" x завжди повертає 1, а "перевантажує" функції визначаються з точки зору того, що передається їм (що на відміну від об'єктно-орієнтованих перевантажень можна визначити на основі введення значень), що дозволяє "частково" оцінювати названу групу функцій, навіть з точки зору самих себе. Таким чином, програма усуває поняття імперативів на низькому рівні, а натомість фокусується на "оцінці себе" за даними вхідних даних.
Ці функції вищого порядку формують основу "функціональних мов"; те, що робить програма, визначається в термінах "чистих функцій" (один або більше входів, один або більше виходів, відсутність побічних ефектів або "прихований стан"), які вкладаються одна в одну і оцінюються за необхідності. У таких випадках більшість "імперативних логік" абстрагується; час виконання обробляє фактичне виклик функцій та будь-які умови, при яких може знадобитися викликати ту чи іншу перевантаження функції. У такій програмі код не вважається як "щось" робити, він вважається як "бути" чимось, і що саме воно визначається, коли програма працює за заданим початковим вкладом.
Функції вищого порядку тепер є частиною багатьох імперативних мов; Ламбда-оператори .NET в основному дають можливість "анонімного" функціонального введення в іншу "функцію" (реалізована в обов'язковому порядку, але теоретично цього не повинно бути), завдяки чому можна досягти високонастроюваного "ланцюжка" дуже загальних "функцій" для досягнення бажаний результат.
Інша абстракція, яка зазвичай зустрічається в останньому раунді мов програмування, - це динамічне введення змінних, що базується на концепції "набору качок"; якщо вона схожа на качку, плаває, як качка, летить як качка і чхає, як качка, можна назвати її качкою. Не має значення, чи це насправді крижанка чи полотно. Це може питання , якщо це на самому справі гусака або лебедя, але знову ж це може не має значення , якщо все , що ви дбаєте про те , що він плаває і літає, і свого роду виглядає як качка. Це вважається кінцевим у спадковому об'єкті; вам байдуже, що це таке , окрім того, як давати ім’я; що важливіше, що це робить. У таких мовах є в основному лише два типи; "атом", єдиний елемент інформації (одне "значення"; число, символ, функція, що б там не було) та "кортеж", що складається з атома і "вказівника" на все інше в кортежі. Як саме ці типи впроваджені у двійковій системі під час виконання, не має значення; використовуючи їх, ви можете досягти функціональності практично кожного типу, про який ви можете придумати, від простих типів значень до рядків до колекцій (що, оскільки значення можуть бути різними "типами", дозволяє "складні типи", також "об'єкти").