Re[36]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 22:34
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.


VD>Еще как стаовится. Исчезает целый класс применения.


Да ну? И какой же это класс?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[37]: Работа - с чего начать: С++ или С#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.05.09 22:38
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, VladD2, Вы писали:


ГВ>>>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.


VD>>Еще как стаовится. Исчезает целый класс применения.


ГВ>Да ну? И какой же это класс?

http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
Re[36]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 22:40
Оценка:
Здравствуйте, samius, Вы писали:

S>И тут нет замыкания


Согласен. Но ты лучше посмотри статью по ссылке.

S>Т.е. если захотелось передать лямбду с замыканием наружу — то как надо поступить?


Я думаю, замкнуть контекст надо по значению. Ну, или через shared_ptr — всё как обычно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[38]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 22:44
Оценка:
Здравствуйте, samius, Вы писали:

VD>>>Еще как стаовится. Исчезает целый класс применения.


ГВ>>Да ну? И какой же это класс?

S>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions

Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[35]: Правильная ссылка
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.05.09 22:46
Оценка: +1 -1
Здравствуйте, Хвост, Вы писали:

VD>>Собственно, что и ожидалось. Недолямбды в недоязыке.

VD>>

VD>>Of course, if a lambda function object outlives local variables that it has captured by reference, you get crashtrocity.

Х>во-первых, ето полноценные лямбды и полноценные замыкания,

Ага. Для тех кто настоящие не видел.

Х>во-вторых, тебе как к очередному фанату управляемой памяти вопрос,


Фанат это тот кто хвалит даже полное дерьмо лиш на том основании, что он фанат этого дерьма. Я же оцениваю вещи по их качествам.

Х>где написано что замыкания обязаны захватывать контекст по ссылке и никак иначе?


Захват должен быть максимально прозрачным и не нагружать сознание. Детали вроде "по ссылке" или "по значению" засоряют главное достоинство лябды — простоту использования. Программист просто должен создать лямбду и передать ее куда-то или возвратить откуда-то. Если при этом ему прийдется слудить за временем жизни захватываемых значений, то простота использования будет потеряна, а значит и весь кайф лямбды. Если захватываемые значения просто копируются, то многие сценарии использования будут недоступны, да и производительность может пострадать. Плюс копирование может само по себе привести к ошибке.

Реализация предлагаемая в C++0x — это недо-лямбда. Что в полне вписывается в концепции недоязыка — плевать на безопасность и удобсво ради производительности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: Работа - с чего начать: С++ или С#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.05.09 22:48
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, samius, Вы писали:


VD>>>>Еще как стаовится. Исчезает целый класс применения.


ГВ>>>Да ну? И какой же это класс?

S>>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions

ГВ>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.


Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++.
Конкретно, как вот это может быть записано с помощью лямбды на С++?
(define (best-selling-books threshold)
  (filter 
    (lambda (book) (>= (book-sales book) threshold))
    book-list))
Re[40]: Работа - с чего начать: С++ или С#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.05.09 22:53
Оценка:
Здравствуйте, samius, Вы писали:

S>Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++.

S>Конкретно, как вот это может быть записано с помощью лямбды на С++?
S>
S>(define (best-selling-books threshold)
S>  (filter 
S>    (lambda (book) (>= (book-sales book) threshold))
S>    book-list))
S>


ненене, не оно. Промахнулся с примером. Хотел пример с возвратом функции
Re[41]: Работа - с чего начать: С++ или С#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.05.09 22:57
Оценка:
Здравствуйте, samius, Вы писали:

S>ненене, не оно. Промахнулся с примером. Хотел пример с возвратом функции


; Return a function that approximates the derivative of f
; using an interval of dx, which should be appropriately small.
(define (derivative f dx)
  (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))


Этот
Re[40]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 23:19
Оценка:
Здравствуйте, samius, Вы писали:

S>Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++.

S>Конкретно, как вот это может быть записано с помощью лямбды на С++?
S>
S>(define (best-selling-books threshold)
S>  (filter 
S>    (lambda (book) (>= (book-sales book) threshold))
S>    book-list))
S>


Мммм... Если я тебя правильно понял, то имеется в виду такое использование:

(setq best-books (best-selling-books 500))


Тогда аналог приблизительно такой:

ListPtr book_list; // Значение определяется где-то...

typedef ListPtr(*ListFunc)();

ListFunc best_selling_books(long threshold) {
  return filter(book_list, [] (ListItem x) -> bool { return x->book_sales >= threshold; })
}
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[37]: Работа - с чего начать: С++ или С#?
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.05.09 23:26
Оценка: +1 -1
Здравствуйте, Хвост, Вы писали:

VD>>Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов.

Х>ой ли, ты часто передаёшь лямбды после выхода из scope?

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

Х> как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность...


Смешно тебя слушать. Передача контекста по ссылке без автоматического управления памятью обеспечивает исключительно UB, а стало быть проходы по памяти и бессонные ночи в отладчике.

А экстремальную производительность обеспечиваеют исключительно применение качественных алгоритмов и библиотек. Отсутствие GC затрудняет создание как первого, так и второго.

Х> (нет боксинга для стековых объектов как в дотнете, ага).


Ого какие слова ты знаешь!
Дело за малым, осталось понять что за ними скрывается и когда он происходит.

Х> Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста,


Ага. Причем юмор начинается со слов "лямбды в с++" ибо на сегодня в С++ нет даже тех недолямбд которые описаны в С++ох (читать как си-плюс-плюс ох). И когда этот стандарт появится, и каким он будет пока не ясно, потому как комитет это шесть или более ног и полное отсутствие мозга (с) Хайнлайн.

Х>причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.


Да. Ты полностью прав. Такий лямбд нет ни в одном языке. Такое не пришло в голову даже изобретателям весьма экстравогантного Лиспа. Надо было писать стандарт 12 лет, чтобы тупо забить на безопасность и допускать UB в банальном коде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[39]: Работа - с чего начать: С++ или С#?
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.05.09 23:31
Оценка: -1
Здравствуйте, Геннадий Васильев, Вы писали:

VD>>>>Еще как стаовится. Исчезает целый класс применения.


ГВ>>>Да ну? И какой же это класс?

S>>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions

ГВ>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.


Редкосная демагогия. Просто противно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[42]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 23:32
Оценка: 1 (1)
Здравствуйте, samius, Вы писали:

S>>ненене, не оно. Промахнулся с примером. Хотел пример с возвратом функции


А... Я тоже малость удивился.

S>
S>; Return a function that approximates the derivative of f
S>; using an interval of dx, which should be appropriately small.
S>(define (derivative f dx)
S>  (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
S>


S>Этот


Понял. Судя по всему, тоже можно.

typedef double (*Func)(double);

Func derivative(Func f, double dx) {
  return [=](double x) -> double {
    return (f(x + dx) - f(x)) / dx;
  }
}

//...
double val = derivative(func, some_dx)(some_x);


Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[40]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 23:33
Оценка: +1
Здравствуйте, VladD2, Вы писали:

ГВ>>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.

VD>Редкосная демагогия. Просто противно.

Последи лучше за собой. O'K?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[37]: Работа - с чего начать: С++ или С#?
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.05.09 23:38
Оценка: -1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Я думаю, замкнуть контекст надо по значению. Ну, или через shared_ptr — всё как обычно.


Именно! Как обычно — закат солнца вручную...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[43]: Работа - с чего начать: С++ или С#?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.05.09 23:40
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Понял. Судя по всему, тоже можно.


ГВ>
ГВ>typedef double (*Func)(double);

ГВ>Func derivative(Func f, double dx) {
ГВ>  return [=](double x) -> double {
ГВ>    return (f(x + dx) - f(x)) / dx;
ГВ>  }
ГВ>}

ГВ>//...
ГВ>double val = derivative(func, some_dx)(some_x);
ГВ>


ГВ>Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.


Может как раз тот случай, когда это вешается на разработчика?

Этот код — это чисто предположение, или компилящийся и выполняющийся?
Re[34]: Правильная ссылка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 23:47
Оценка:
Здравствуйте, VladD2, Вы писали:

ГВ>>Я имел в виду Part 1.

VD>Собственно, что и ожидалось. Недолямбды в недоязыке.

А где же "замшелые стереотипы" и "косность мышления" "Страуструпа, впавшего в маразм"?

Влад, ну я тебя прям не узнаю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[35]: Правильная ссылка
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.05.09 23:51
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>>Я имел в виду Part 1.

VD>>Собственно, что и ожидалось. Недолямбды в недоязыке.

ГВ>А где же "замшелые стереотипы" и "косность мышления" "Страуструпа, впавшего в маразм"?


ГВ>Влад, ну я тебя прям не узнаю.


В Лиспе замыкания (причем полноценные) появились где-то в пятидесятых годах прошлого века. В С++ даже недозамыканий нет по сей день. Со времени публикации последнего стандарта прошло 11 лет. Так что вопрос риторический. Конечно на месте. Когда на добавление всем известной фичи тратят 12 лет и получают хреновый результат, то ни о чем кроме замшелости говорить не приходится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[44]: Работа - с чего начать: С++ или С#?
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 05.05.09 23:56
Оценка:
Здравствуйте, samius, Вы писали:

S>Может как раз тот случай, когда это вешается на разработчика?


А смысл тогда в лямбдах? Те же объекты.

S>Этот код — это чисто предположение, или компилящийся и выполняющийся?


Пока только предположение. Постараюсь поставить CTP на днях, тогда скажу точнее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[36]: Правильная ссылка
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 06.05.09 00:06
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В Лиспе замыкания (причем полноценные) появились где-то в пятидесятых годах прошлого века. В С++ даже недозамыканий нет по сей день. Со времени публикации последнего стандарта прошло 11 лет. Так что вопрос риторический. Конечно на месте. Когда на добавление всем известной фичи тратят 12 лет и получают хреновый результат, то ни о чем кроме замшелости говорить не приходится.


А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[37]: Правильная ссылка
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.05.09 00:35
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?


А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков. Языки вроде Явы и Шарпа обзавелись большей частью фич которые только обсуждались в С++ох. Скажем методы расширения шарпа были тупо стянуты из одного из реквестов еще в 2002.

12 лет — это строк за который человек вырастает. А они не смогли принять какой-то там стандарт.

За это время обсуждение проблем С++ плавно переросла в обсуждение его реальной необходимости и в итоге просто исчезло так как те кто задавались вопросами просто пересели на другие языки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.