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 : -->