Функциональное программирование похоже на самоизменяющийся код?
Кажется, что иногда код в функциональных программах принимает другой код (функции) в качестве аргументов, модифицирует его и возвращает для выполнения. Это похоже на самоизменяющийся код. Означает ли это, что компактность функциональных программ является следствием той же причины, которая допускает чрезвычайно компактные самоизменяющиеся программы?
1 ответ
Эрнест Фридман-Хилл, возможно, прав, что этот вопрос здесь не относится, но вот ответ:
Я бы сказал: нет.
Существует несколько способов, которыми язык может разрешить самоизменяющийся код. Наиболее гибким способом было бы иметь возможность перебрасывать произвольные биты в произвольных местах в памяти. (Вот классическая история: История Мел.) Но самоизменяющиеся методы не должны демонстрировать такую опасную свободу. В Common Lisp легко написать код, который создает код Lisp и оценивает его, но все это остается в рамках ограничений Lisp и не обязательно является более компактным. В Java вы можете выполнять определенные виды "самомодификации" с помощью рефлексии, но это часто более многословно, чем обычное использование Java.
Кроме того, имейте в виду, что на самом деле существует тонкая грань между некоторыми видами объектно-ориентированных методов и методами функционального программирования. Оба позволяют собирать исполняемые файлы и данные вместе. ОО делает это, прикрепляя методы к объектам, в то время как функциональные языки делают это, используя замыкания для захвата данных. Таким образом, если функциональные языки самоизменяются, то и Java тоже. Но Java обычно не рассматривается как самоизменяющийся язык (за исключением рефлексии), а код Java часто многословен. (Кстати, Гай Стил, один из разработчиков Java, также был одним из тех, кто разработал схему диалекта Lisp - более чисто функциональный язык, чем Common Lisp), чтобы экспериментировать с объектно-ориентированным программированием! I считаю, что идея заключалась в создании различных объектно-ориентированных языковых конструкций с использованием замыканий.)
Предостережение: я давно не занимался программированием на Java, и, вероятно, есть языковые функции, относящиеся к этой проблеме, о которых я не знаю.