Dmitry Astapov wrote:
AS> Эти операторы (for, while, switch...) я не учитывал. Я говорил о ++, AS> --, AS> +, -, +=, *=, new, ... Да, for тоже оператор, я это забыл. Т.е. все операторы равны, но некоторые "равнее". Что я и хотел показать. В функциональных языках все функции равны в правах, и могут быть свободно переданы как параметры, возвращены в качестве результата, могут участвовать в качестве аргументов в выражениях.AS> Знаете, тут применима, в принципе, та же идея, что и в споре об AS> определении, что такое программа (помните? :-).[skip] И как же тут применима эта идея?
Была применима... :-) Изначально, насколько я понял, "играли" двумя терминами: "структурные" и функциональные языки программирования.
Их истинного (подразумеваемого) значения в данном контексте я не понял, поэтому, считая, что "языки структурны, потому что оперируют структурами данных" и что языки функциональны, когда описывают четкие функции программы (я подменил это понятие понятием процедурного метода программирования), я и использовал эту идею, которая подходила под то, как я понял тему. :-)
Вопрос - является ли, с вашей точки зрения, наличие first-class functions характерной чертой функциональных языков программирования? А то, сдается, нету единства в толковании терминов.AS> Может быть. :-) Я неясно выразился. И не до конца понял вопрос... :-) Если в языке функции "равны в правах" с данными - т.е. их можно свободно перевать, возвращать, создавать и т.п., то они являются first-class citizens. Это устоявшийся оборот такой :)
Если считать С, например, функциональным языком, то тогда на вопрос отвечу положительно. Там можно использовать функции во всех конструкциях, где допустимо использование переменных. То есть функции равны в правах с переменными (данными).
Стуктурные (более верно, имхо, говорить все же "императивные") языки называются так не потому, что позволяют описывать структуры данных.
Кстати, я имел в виду все же не совсем то. :-) Не так банально. По Страуструпу, например, это называется программированием "абстракции данных", то есть, грубо говоря, программированием с объединением данных одного класса (понятие "классы" здесь не то, что в С++ - более общее). Вот это я и имел в виду.
AS> functional programming AS> This style of programming proceeds by computing new values from AS> existing values without changing any of the existing values. AS> imperative programming AS> This style of programming proceeds by altering values stored in variables. AS> Т.е. функциональное программирование - это вычисление новых значений AS> без изменения существующих переменных, императивное - посредством Я бы сказал, что у чисто функциональных языков остуствует понятие "переменной" вообще. Это было бы точнее.
А есть такие чисто функциональные языки?Кстати, не свзяано ли это с понятием "чисто функции" (pure function)? (Чтобы тут потом тоже не придумывать несуществующие связи)
AS> "более структурный". Хотя, с другой стороны, мне кажется довольно AS> очевидным, что, например, C является более ориентированным (читай: AS> припособленным) на функциональное программирование, чем, скажем, C++ AS> или Python. И как на C правильно реализуется map и fold? А так, чтобы было type-safe? А рекурсивные функции? А с tail-recursive оптимизацией?
AS> Тут должно быть понятно, что я подменил значения терминов. Я имел в AS> виду процедурное, структурное и объектно-ориентированное AS> программирование (методы разработки программ). Совершенно разные вещи. Т.е. в вышеприведено абзаце следует читать "C является более ориентированным на процедурное программирование"? Я правильно понял?
Да, в противовес С++ и Java, которые созданы для объектно-ориентированного программирования.
-- Andrei Sosnin http://zzx.ath.cx <!-- : it all depends on your vision : -->