Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > замыкание


Автор: sergioK1 17.5.2012, 19:49
что это значит ?  на русском не учился 


Автор: Данкинг 17.5.2012, 19:54
И что, на какой перевести? Кстати, при чём здесь С++ ?

Автор: alexvs11 17.5.2012, 20:43
замыкания есть только в c++ - лямбда функции с внешней переменной
Код

[x](int y) { return x * y; }

Автор: sergioK1 17.5.2012, 22:07
Цитата(Данкинг @ 17.5.2012,  18:54)
И что, на какой перевести? Кстати, при чём здесь С++ ?

На любой ЯП не на язык  демагогии  smile 
перевод closure , всю жизнь считал что это аспект , а тут явно что-то другое 



alexvs11
это новый стандард , реальных проектов на нем пока почти никто не пишет,  
что это выражениие  значит ?
кто замыкает и  кого  ? 
у меня в задачах где  нужен  лямба - не нужен С++  smile 

чем  это отличаеться от  обычного доступа к переменной out of the scope ? 

Автор: k0rvin 22.5.2012, 07:42
Цитата(alexvs11 @ 17.5.2012,  20:43)
замыкания есть только в c++

лолшто?

Добавлено через 12 минут и 48 секунд
Цитата(sergioK1 @ 17.5.2012,  22:07)
На любой ЯП не на язык  демагогии  smile 

Пример 1:
Код

(define (add x)
  (lambda (y)
    (+ x y)))

(map (add 3) '(1 2 3))
; => '(4 5 6)


Пример 2:
Код

(define (make-counter)
  (define count 0)
  (lambda ()
    (set! count (+ count 1))
    count))

(define count (make-counter))

(count) ; => 1
(count) ; => 2
(count) ; => 3


Пример 3:
Код

(define (pair x y)
  (lambda (m)
    (m x y)))

(define (first p)
  (p (lambda (x y) x)))

(define (second p)
  (p (lambda (x y) y)))

(define p (pair 1 2))

(first p)  ; => 1
(second p) ; => 2


Пример 4:
Код

(define (make-counter)
  (define count 0)
  (define (counter message)
    (case message
      ((get) count)
      ((inc) (set! count (+ count 1)))
      ((drop) (set! count 0))
      ( else (error 'counter "unknown message: ~a" message))))
  counter)

(define counter (make-counter))

(counter 'get) ;=> 0
(counter 'inc)
(counter 'inc)
(counter 'get) ; => 2
(counter 'drop)
(counter 'get) ; => 0

Автор: k0rvin 22.5.2012, 08:14
Цитата(sergioK1 @ 17.5.2012,  22:07)
кто замыкает и  кого?

Замыкание -- это захват лексического контекста.

Цитата(sergioK1 @ 17.5.2012,  22:07)
чем  это отличаеться от  обычного доступа к переменной out of the scope?

вот смотри, обычный доступ к переменной out of the scope:
Код

makeCounter() {
    x = 0;
    return fun() {
        return ++x;
    }
} // -- x уничтожается здесь, поэтому вызов
Function count = makeCounter();
count(); // -- приведет к ошибке


при замыкании x захватывается и "живет" между вызовами count()

Автор: mes 22.5.2012, 08:23
Цитата(k0rvin @  22.5.2012,  06:42 Найти цитируемый пост)
замыкания есть только в c++

лолшто?

k0rvin, там должно быть с++11 вместо с++ .. полагаю что опечатка..


Автор: borisbn 22.5.2012, 08:27
k0rvin, могу ошибаться, но думаю, что alexvs11 имел в виду, что их нет в Си, т.к. известно, что ТС не приемлет Си++ и пишет только на Си.
По теме: http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BC%D1%8B%D0%BA%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

хмммм... в последнее время русскую вики вполне себе можно читать. даже статьи по программированию.

Автор: mes 22.5.2012, 09:45
Цитата(borisbn @  22.5.2012,  07:27 Найти цитируемый пост)
хмммм... в последнее время русскую вики вполне себе можно читать. даже статьи по программированию. 

тем более интересно откуда ж тогда на форуме берутся такие вопросы ?!.. smile 


хм.. Данкинга и тут заминусили...

Автор: baldina 22.5.2012, 10:32
Цитата(sergioK1 @  17.5.2012,  22:07 Найти цитируемый пост)
перевод closure , всю жизнь считал что это аспект , а тут явно что-то другое 

то самое. в смысле - closure.

Автор: sergioK1 22.5.2012, 10:58
Цитата(mes @ 22.5.2012,  08:45)
Цитата
хмммм... в последнее время русскую вики вполне себе можно читать. даже статьи по программированию. 



Yгу ,   если  догадаться что scope означает  контекст ,



Код

   names::iterator i = std::find_if(n.begin(), n.end(), [&](const string& s) {
            return s != myname && s.size() > y;
        });


Вики пишет что  GCC 4.5, already support this notation.

у меня 4.5 ругает 
error: no matching function for call to 'find_if(std::vector<std::basic_string<char> >::iterator, std::vector
инклуды все есть 



Автор: baldina 22.5.2012, 13:04
http://liveworkspace.org/code/089f9a5e53ed69d30dc2f65bc1e912f0
правда тут 4.7
но у вас оно ругается не на синтаксис, а на прототип

Автор: sergioK1 22.5.2012, 14:11
Цитата(baldina @ 22.5.2012,  12:04)
http://liveworkspace.org/code/089f9a5e53ed69d30dc2f65bc1e912f0
правда тут 4.7
но у вас оно ругается не на синтаксис, а на прототип

IDE поменял  с непривычки  варнинг не увидел ,

надо было  -std=c++0x  , счас бежит 

чето Я не понимаю 

At least three C++ compilers, Visual C++ 2010, Clang 2.9 and GCC 4.5, already support this notation. As of 12 August 2011, the approved C++11 standard does support closures.

Т,е, Я понимаю  лямда уже есть и в ++0x, а другие компайлеры (кроме этих трех)   просто его поддерживают ,
так ? 

так они и С++11 не поддержат, тогда  кому такой стандард нужен ? 




Автор: mes 22.5.2012, 14:15
Цитата(sergioK1 @  22.5.2012,  13:11 Найти цитируемый пост)
так они и С++11 не поддержат, тогда  кому такой стандард нужен ? 

будущему поколению smile

Автор: sergioK1 22.5.2012, 14:25
Цитата(mes @ 22.5.2012,  13:15)
Цитата(sergioK1 @  22.5.2012,  13:11 Найти цитируемый пост)
так они и С++11 не поддержат, тогда  кому такой стандард нужен ? 

будущему поколению smile

Так чего тогда каждый второй пост рунета про это стандард , 
уже ж пожили ради будущего, мало ?  надо еще 70лет ?  smile 


Автор: mes 22.5.2012, 14:48
Цитата(sergioK1 @  22.5.2012,  13:25 Найти цитируемый пост)
Так чего тогда каждый второй пост рунета про это стандард , 
уже ж пожили ради будущего, мало ?  надо еще 70лет ?  

будущее начинается еще вчера )

Автор: baldina 22.5.2012, 17:12
Intel 12 поддерживает лямбды

Автор: sergioK1 22.5.2012, 17:18
Цитата(mes @ 22.5.2012,  13:48)
Цитата(sergioK1 @  22.5.2012,  13:25 Найти цитируемый пост)
Так чего тогда каждый второй пост рунета про это стандард , 
уже ж пожили ради будущего, мало ?  надо еще 70лет ?  

будущее начинается еще вчера )


ну раз вчера  дык давайте про уже  С++ 12  smile 

Автор: borisbn 22.5.2012, 17:22
Цитата(sergioK1 @  22.5.2012,  17:18 Найти цитируемый пост)
 давайте про уже  С++ 12

http://forum.vingrad.ru/forum/topic-346991.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)