Функциональное программирование похоже на самоизменяющийся код?

Кажется, что иногда код в функциональных программах принимает другой код (функции) в качестве аргументов, модифицирует его и возвращает для выполнения. Это похоже на самоизменяющийся код. Означает ли это, что компактность функциональных программ является следствием той же причины, которая допускает чрезвычайно компактные самоизменяющиеся программы?

1 ответ

Решение

Эрнест Фридман-Хилл, возможно, прав, что этот вопрос здесь не относится, но вот ответ:

Я бы сказал: нет.

Существует несколько способов, которыми язык может разрешить самоизменяющийся код. Наиболее гибким способом было бы иметь возможность перебрасывать произвольные биты в произвольных местах в памяти. (Вот классическая история: История Мел.) Но самоизменяющиеся методы не должны демонстрировать такую ​​опасную свободу. В Common Lisp легко написать код, который создает код Lisp и оценивает его, но все это остается в рамках ограничений Lisp и не обязательно является более компактным. В Java вы можете выполнять определенные виды "самомодификации" с помощью рефлексии, но это часто более многословно, чем обычное использование Java.

Кроме того, имейте в виду, что на самом деле существует тонкая грань между некоторыми видами объектно-ориентированных методов и методами функционального программирования. Оба позволяют собирать исполняемые файлы и данные вместе. ОО делает это, прикрепляя методы к объектам, в то время как функциональные языки делают это, используя замыкания для захвата данных. Таким образом, если функциональные языки самоизменяются, то и Java тоже. Но Java обычно не рассматривается как самоизменяющийся язык (за исключением рефлексии), а код Java часто многословен. (Кстати, Гай Стил, один из разработчиков Java, также был одним из тех, кто разработал схему диалекта Lisp - более чисто функциональный язык, чем Common Lisp), чтобы экспериментировать с объектно-ориентированным программированием! I считаю, что идея заключалась в создании различных объектно-ориентированных языковых конструкций с использованием замыканий.)

Предостережение: я давно не занимался программированием на Java, и, вероятно, есть языковые функции, относящиеся к этой проблеме, о которых я не знаю.

Другие вопросы по тегам