Re[11]: Вопрос к Vlad2: Nemerle & R#
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.03.06 22:21
Оценка: 43 (5) +3
Здравствуйте, bigger longer and uncut, Вы писали:

BLA>Вот именно это и забило окончательный гвоздь в мое терпение. Как можно беседовать с человеком, когда он говорит агитками?


Хм. Но я же с тобой бесудую? Ты в своей агитке
Автор: bigger longer and uncut
Дата: 23.03.06
не потрудился аргументировать ни одного своего утверждения. На что я старался отвечать аргументировано.

BLA>Разве можно апеллировать к агитке? По-моему, нельзя.


Тогда с тобй вообще нельзя разговаривать.

BLA>Ну здесь как — вообще термин "функциональный язык" достаточно условная вещь, конечно,


+1

BLA> но одно видимо можно сказать — это языки, которые в основе своей имеют лямбда-исчисление.


Необязательно лямбда. Просто ориентированы на работу с выражениями, а не предложениями. Хотя конечно любой язык поддерживающий функциональный стиль обычно позволяет создавать анаонимные функции а-ка лямбды.

BLA>То есть лямбда-функции являются основным и единственным строительным блоком и все конструкции в языке(ну как минимум все функции) состоят из лямбд. лямбда — это анонимная функция, которая так же является замыканием — то есть помнит родительский контекст.


В общих чертах можно согласиться. Хотя мнение несколько натянутое на мой взгляд.

BLA>Смысл в том, чтобы получить язык с формальной семантикой — чтобы программы были предсказуемыми, доказуемыми и как можно проще.


Это цель любого современного ЯП.

BLA>Это конечно все очень упрощенно, но примерно так.


Я бы даже скзал очень расплывчато и натянуто.

Классическое определение функционального программирования звучит как-то так:

Функциональное программирование — это парадигма программирования трактующая вычисления как вычисление математических функций, т.е. отсуствие побочных эффектов/изменения переменных.


BLA>Так вот — Nemerle никакого отношения к этому описанию не имеет. В нем даже лямбд нет — то, что там называется таковой, на самом деле макрос, который генерирует делегат.


Ошибаешся. Лямбда в Немерле описывается так:
fun(список параметров){ тело }

С макросами это никак не связано.
Есть макрос позволяющий записывать лябды с одним параметром таким образом:
lambda x -> тело

но он преобразуется во все ту же конструкцию fun.

Что до делегатов, то функция никак не может являеться делегатом, просто потму, что делегат — это ссылка на функцию.

Иногда компилятор может порождат теявное использование делегатов, но это уже особенности реализации. К вопросу о том есть лябды в языке или нет — это отношения не имеет.

BLA>Причем макросы в немерле — это вообще говоря антифункциональная вещь.


Во как? Прэлесно!

BLA> То есть они не first-class values,


Ну, и что? Кому-то это мешает? Мне — нет.

BLA> их нельзя передавать куда-то или возвращать, хотя со стороны они выглядят как функции. Удачи маленьким любителям функциональных языков.


Действительно удачи любителям функциональных языков. А лично мне это все на фиг не упало. Внутри макроса я без проблем могу использовать любой стиль. Сами макросы я опять же могу использовать из любого стиля. Обернуть макрос в фнкцию проблемы не составляет.

В общем, мне не нужна фунциональщина любой ценой. Как приятный бонус я ей рад. Но как единственно-верное учение — увольте.

BLA>То есть немерль не более функциональный, чем, скажем, С++. Javascript к слову гораздо более функциональный, если на то пошло.


Логика откровенно никудышная. Нэмерле и без макросов позволяет писать в функциональном стиле (использовать функциональную парадигму, если угодно). Более того фунциональный стиль в нем является основным. Как раз императивный стиль там на макросах в основном реализаван. Даже циклы макросами переписываются в рекурсивные функции/замыкания.

Учитывая, что непосредственно во функциональных языках макросы встретить можно не часто, вообще не ясно о чем речь.

BLA>Если же мы идем дальше и пытаемся сравнить с Хаскелем и Окамлом, то все еще хуже.

BLA>То есть достаточно было бы упомянуть отсутствие карринга в немерле, чтобы выкинуть гигантский кусок выразительной мощи из окамла с хаскелем,

Хм. С каких это пор карринг стал неотемлемой частью ФЯ? А как же тогда Схема, Лисп и т.п.? И чем же это его отсуствие так сильно угнетает выразительность?

Карринг конфликтует с перегрузкой. Естественно, что в языке претендующем на С-подобный синтаксис выбрали перегрузку, а не карринг.

Собственно на практике и без каринга получается жить очень неплохо. Например:
def list1 = [1, 3, 5, 9];
def Add(a, b) { a + b } // функция с двумя аргументами
def list2 = list1.Map(Add(_, 1)); // Применяем ее как функцию с одни аргументом

Ну, и естественно никто не мешает комбирировать фунции явно с помощью создания лябд или локальных функций (как в Лиспах).

Выбор в пользу перегрузки совершенно очевиден. Дотнетные библиотеки напичканы перегруженными методами. Если бы язык не поддерживал пергрузку, то были бы нехилые проблемы в совместимости с дотнетом.

BLA>но еще ведь есть типы.

BLA> Которые в немерле — это просто дотнетовские классы на самом деле, со всеми их проблемами.

И достоинствами. Про них тоже забывать не стоит.

BLA>То есть кроме всего прочего понятно, что они еще динамические и т.п.


В смысле динамически создаются в динамически выделяемой памяти? Да, и что? Это совершенно нормально для любого языка претендующего на звание ОО. И уж просто обязательно для любой компонентной системы.

BLA>Ну и как вишенка на тортике — Null_pointer_exception.


Ужас какой! И как люди с этим живут?

BLA>Конечно после этого пытаться искать в немерле следы функторов, полиморфных вариантов, классов типов, экзистенциальных типов, функциональных зависимостей и полиморфизм второго ранга — не стоит.


И тем неменее все это в нем есть.

Например, те же варианты:
variant Tree [T]
{ | Node { left : Tree[T]; mid : T; right : Tree[T]; }
  | Leaf

  public override ToString () : string
  {
    match (this)
    { | Node (l, m, r) => $"($l $m $r)"
      | Leaf           => "."
    }
  }
} 

def tree = Tree.Node(Tree.Node(Tree.Leaf(), 1, Tree.Leaf()), 2, Tree.Leaf());
System.Console.WriteLine(tree.ToString());

выводит:
((. 1 .) 2 .)


BLA>Вот такие у нас нынче пошли типобезопасные функциональные языки.


Ага. Только не функциональные, а скорее поддерживающие функциональный стиль. Впрочем это определение полностью подходит и ОКамлу.

А ты просто неверно трактушь понятие "типобезопасный".
http://en.wikipedia.org/wiki/Typesafe

BLA>Еще принято считать, что ленивые языки как минимум в два раза выразительнее, чем энергичные (небезосновательно).


Видимо по этой причине ты тут все время пиаришь ОКамл.

Рельно линивые по умолчанию языки порождают медленный код и иногда приводят к не очень очевидному коду. В Немерле, как и в ОКамле можно выборочно помечать части кода как линивые. А можно использовать подход из C# 2.0 и использовать итераторы.

BLA>Вот теперь вы можете отличать функциональные языки.


Ну, раз теперь вы это можете делать, то попробуйте найти серьезные отличия между тем же ОКамлом и Немерле в поддержке функционального стиля.

E>>Переход же на личностные разборки просто убивает интерес к первоначальной теме.


BLA>Да.


Ну, так держи себя в руках. А то ведь долго тебя терпеть никто не будет.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.