Модераторы: Се ля ви

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> лямбда функции, не знаю что такое! 
V
    Опции темы
maxim1000
Дата 5.6.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



пришла в голову мысль: анонимные функции в C++ вполне можно организовать через for
примеры мы пишем постоянно: когда перебираем элементы контейнера с помощью итератора и т.д.
но можно пойти и дальше:
делаем объект алгоритм, который соответствует последовательности действий, в которой нужно вызывать пользовательскую функцию
у него должно быть три части:
1. инициализация
2. критерий окончания
3. шаг до следующего вычисления внешней функции
в качестве параметров и возвращаемых значений можно использовать поля/методы этого объекта
например, попробуем сделать сортировку (по-моему, называется сортировка выбором):
Код

class CSorter
{
public:
  CSorter(std::vector<int> &array):array_(array),sortedpart_(0),current_(1),argmin_(0) {}
  bool completed() const {return sortedpart_==array_.size()-1;}
  void step()
  {
    std::cout<<"sordetpart:"<<sortedpart_<<",current:"<<current_<<"\n";
    if(FirstIsBigger)
      argmin_=current_;
    ++current_;
    if(current_==array_.size())
    {
      int temp=array_[sortedpart_];
      array_[sortedpart_]=array_[argmin_];
      array_[argmin_]=temp;
      ++sortedpart_;
      argmin_=sortedpart_;
      current_=sortedpart_+1;
    }
    if(!completed())
    {
      ToCompare1=array_[argmin_];
      ToCompare2=array_[current_];
    }
  }
  int ToCompare1;
  int ToCompare2;
  bool FirstIsBigger;
protected:
  std::vector<int> &array_;
  unsigned int sortedpart_;
  unsigned int current_;
  unsigned int argmin_;
};

тогда сортировка по возрастанию младшей цифры будет выглядеть так:
Код

  for(CSorter s(v);!s.completed();s.step())
    s.FirstIsBigger=(s.ToCompare1%10)>(s.ToCompare2%10);

преимущества - "полное погружение" в текущий контекст - можно использовать всё, что сейчас доступно, и не надо передавать это в качестве параметров в класс (например, основание системы счисления могло бы задаваться параметром функции, в которой происходит сортировка)
недостатки - нужно представлять алгоритм в автоматном виде, что не всегда удобно
Цитата(maxim1000 @  16.5.2006,  17:04 Найти цитируемый пост)
не хочет использовать локальный тип при специализации шаблона
компилятор из VC++ 2003 Toolkit

выбросил его, поставил 2005 smile 


--------------------
qqq
PM WWW   Вверх
Любитель
Дата 23.12.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



А почему бы (для плюсов) просто не посмотреть в сторону boost::bind и boost::lambda? Вещи очень развитые. C++ никогда не будет функциональным языком как таковым, но ФП с помощью библиотек давно реализовано.


--------------------
PM MAIL ICQ Skype   Вверх
Delphist
  Дата 4.9.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Void @  15.5.2006,  22:51 Найти цитируемый пост)
Шаг один с половиной. Анонимных функций нет, замыкания есть, но толку от них… Паскаль.

Код

type IntList = { какая структура };

type Predicate = function(x: Integer): Boolean;

function Find(list: IntList; f: Predicate): Integer;
begin
    { реализация }
end;

procedure Test;
    var t: IntList;
    var n: Integer;

    function GreaterN(x: Integer): Boolean;
    begin
        GreaterN := x >= n
    end;
begin
    ...
    x := Find(t, GreaterN); { Опа, что это у нас тут? }
end;



Ошибка компиляции. Объявленные таким образом функции нельзя передавать в другие функции. Внутри области видимости используйте сколько угодно, они будут иметь доступ ко внешним переменным. А передать — ни-ни. Ну и зачем они такие нужны? А решение проблемы в итоге такое же, как в Си.


Void, посмотри пожалуйста вот это новшество http://8vmr.livejournal.com/6114.html в Delphi2009 появилась такая возможность, как лямбда-функции, в связи с чем хотелось поинтересоваться возможно ли теперь решить постовленную задачу:
Цитата(Void @  15.5.2006,  22:51 Найти цитируемый пост)
Допустим, у нас есть задача: найти в списке элемент, удовлетворяющий заданному условию (предикату). Представим себе, что у нас уже есть структура данных «список» и функция поиска, принимающая предикат, который также является функцией, возвращающей значений булевского типа.

возможно ли теперь упростить работу



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Void
Дата 4.9.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 9
Всего: 173



Delphist, да, похоже в этом вопросе Delphi теперь практически повторяет C# 2.0.

Обалдеть, люди ссылаются на мой пост двухлетней давности.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Delphist
Дата 5.9.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Void @  4.9.2008,  14:55 Найти цитируемый пост)
Delphist, да, похоже в этом вопросе Delphi теперь практически повторяет C# 2.0.

Это не важно. Кодом не мог бы показать решение задачи


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
minyor
  Дата 22.10.2009, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.10.2009

Репутация: нет
Всего: нет



Я тут про С++ нашел тему:
http://blogs.msdn.com/vorobiev/archive/200...30/9853791.aspx
Сам правда еще попробовать не успел, но выглядит вроде прикольно   smile 
PM MAIL   Вверх
k0rvin
Дата 12.3.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Цитата(Void @ 16.5.2006,  16:51)
Lamer George, спасибо smile

to all: Буду очень благодарен за любые дельные замечания к посту. Думаю, после некоторой обработки это можно разместить в Вики.

более интересным применением функций как объектов первого класса является создание таблиц функций, объединённых по какому-либо качеству (или нескольким качествам) и построение собственной системы диспетчеризации по этим качествам, что весьма полезно при реализации DSL/eDSL.

например обобщенные методы можно реализовать таким образом:
функция-метод обращается к хеш-таблице генериков для взятия своего генерика, из которого затем берётся функция-специализация, типа того:

Код

(defparameter *generics* (make-hash-table))

(defclass generic ()
  ((name :accessor generic-name :initarg :name)
   (spec :accessor generic-spec :initform (make-hash-table :test #'equal))))

(defmacro define-generic (name lambda-list &body body)
  `(progn
     (setf (gethash ',name *generics*)
           (make-instance 'generic
                          :name        ',name
                          :lambda-list ',lambda-list))
     (defun ,name ,lambda-list
       (call-generic-method ',name ,(clean-ll lambda-list)))))

(defun call-generic-method (name lambda-list)
  (let* ((generic (gethash name *generics*))
         (method  (gethash (types lambda-list) (spec generic))))
    (if method
        (apply method (arguments lambda-list))
        (error "No applicable method ~a for arguments ~a." name (types lambda-list)))))

...


или пример компилирования бинарных деревьев в "On Lisp", но для этого нужны еще и замыкания =)


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
k0rvin
Дата 13.3.2010, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Цитата(Void @ 4.9.2008,  13:55)
Delphist, да, похоже в этом вопросе Delphi теперь практически повторяет C# 2.0.

Обалдеть, люди ссылаются на мой пост двухлетней давности.

не знаком с С#, поэтому мне больше напомнило С++, хотя лямбды и замыкания выглядят не так костыльно как в плюсах, но думается мне, что внутри это всё реализовано не очень-то красиво и паскаль/делфи рискует разделить судьбу С++ -- превратиться в монстра.

думаю следующим шагом в развити паскаля/делфи должна быть замена системы типов, ибо существующая ну уж очень устарела


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила раздела "Философия программирования":
Се ля ви

Форум "Философия программирования" предназначен для обсуждения вопросов, так или иначе связанных с философскими аспектами разработки ПО:

• вопросы перспективного развития методов написания ПО;

• изменяющиеся языки и методологии программирования;


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Философия программирования | Следующая тема »


 




[ Время генерации скрипта: 0.0758 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.