Здравствуйте, VladD2, Вы писали:
ГВ>>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
VD>Еще как стаовится. Исчезает целый класс применения.
Да ну? И какой же это класс?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, VladD2, Вы писали:
ГВ>>>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
VD>>Еще как стаовится. Исчезает целый класс применения.
ГВ>Да ну? И какой же это класс? http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
Здравствуйте, samius, Вы писали:
S>И тут нет замыкания
Согласен. Но ты лучше посмотри статью по ссылке.
S>Т.е. если захотелось передать лямбду с замыканием наружу — то как надо поступить?
Я думаю, замкнуть контекст надо по значению. Ну, или через shared_ptr — всё как обычно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
VD>>Собственно, что и ожидалось. Недолямбды в недоязыке. VD>>
VD>>Of course, if a lambda function object outlives local variables that it has captured by reference, you get crashtrocity.
Х>во-первых, ето полноценные лямбды и полноценные замыкания,
Ага. Для тех кто настоящие не видел.
Х>во-вторых, тебе как к очередному фанату управляемой памяти вопрос,
Фанат это тот кто хвалит даже полное дерьмо лиш на том основании, что он фанат этого дерьма. Я же оцениваю вещи по их качествам.
Х>где написано что замыкания обязаны захватывать контекст по ссылке и никак иначе?
Захват должен быть максимально прозрачным и не нагружать сознание. Детали вроде "по ссылке" или "по значению" засоряют главное достоинство лябды — простоту использования. Программист просто должен создать лямбду и передать ее куда-то или возвратить откуда-то. Если при этом ему прийдется слудить за временем жизни захватываемых значений, то простота использования будет потеряна, а значит и весь кайф лямбды. Если захватываемые значения просто копируются, то многие сценарии использования будут недоступны, да и производительность может пострадать. Плюс копирование может само по себе привести к ошибке.
Реализация предлагаемая в C++0x — это недо-лямбда. Что в полне вписывается в концепции недоязыка — плевать на безопасность и удобсво ради производительности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, samius, Вы писали:
VD>>>>Еще как стаовится. Исчезает целый класс применения.
ГВ>>>Да ну? И какой же это класс? S>>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
ГВ>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++.
Конкретно, как вот это может быть записано с помощью лямбды на С++?
Здравствуйте, samius, Вы писали:
S>Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++. S>Конкретно, как вот это может быть записано с помощью лямбды на С++? S>
Здравствуйте, 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)))
Здравствуйте, samius, Вы писали:
S>Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++. S>Конкретно, как вот это может быть записано с помощью лямбды на С++? S>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
VD>>Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов. Х>ой ли, ты часто передаёшь лямбды после выхода из scope?
Если ты хотел сказать возвращаешь лябды из функций, то таки — да. Например, весь linq реализован на идее отложенных вычислений и комбинирования лямбд.
Х> как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность...
Смешно тебя слушать. Передача контекста по ссылке без автоматического управления памятью обеспечивает исключительно UB, а стало быть проходы по памяти и бессонные ночи в отладчике.
А экстремальную производительность обеспечиваеют исключительно применение качественных алгоритмов и библиотек. Отсутствие GC затрудняет создание как первого, так и второго.
Х> (нет боксинга для стековых объектов как в дотнете, ага).
Ого какие слова ты знаешь!
Дело за малым, осталось понять что за ними скрывается и когда он происходит.
Х> Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста,
Ага. Причем юмор начинается со слов "лямбды в с++" ибо на сегодня в С++ нет даже тех недолямбд которые описаны в С++ох (читать как си-плюс-плюс ох). И когда этот стандарт появится, и каким он будет пока не ясно, потому как комитет это шесть или более ног и полное отсутствие мозга (с) Хайнлайн.
Х>причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.
Да. Ты полностью прав. Такий лямбд нет ни в одном языке. Такое не пришло в голову даже изобретателям весьма экстравогантного Лиспа. Надо было писать стандарт 12 лет, чтобы тупо забить на безопасность и допускать UB в банальном коде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
VD>>>>Еще как стаовится. Исчезает целый класс применения.
ГВ>>>Да ну? И какой же это класс? S>>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
ГВ>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Редкосная демагогия. Просто противно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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>
Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
ГВ>>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю. VD>Редкосная демагогия. Просто противно.
Последи лучше за собой. O'K?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.
Может как раз тот случай, когда это вешается на разработчика?
Этот код — это чисто предположение, или компилящийся и выполняющийся?
Здравствуйте, VladD2, Вы писали:
ГВ>>Я имел в виду Part 1. VD>Собственно, что и ожидалось. Недолямбды в недоязыке.
А где же "замшелые стереотипы" и "косность мышления" "Страуструпа, впавшего в маразм"?
Влад, ну я тебя прям не узнаю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Я имел в виду Part 1. VD>>Собственно, что и ожидалось. Недолямбды в недоязыке.
ГВ>А где же "замшелые стереотипы" и "косность мышления" "Страуструпа, впавшего в маразм"?
ГВ>Влад, ну я тебя прям не узнаю.
В Лиспе замыкания (причем полноценные) появились где-то в пятидесятых годах прошлого века. В С++ даже недозамыканий нет по сей день. Со времени публикации последнего стандарта прошло 11 лет. Так что вопрос риторический. Конечно на месте. Когда на добавление всем известной фичи тратят 12 лет и получают хреновый результат, то ни о чем кроме замшелости говорить не приходится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, samius, Вы писали:
S>Может как раз тот случай, когда это вешается на разработчика?
А смысл тогда в лямбдах? Те же объекты.
S>Этот код — это чисто предположение, или компилящийся и выполняющийся?
Пока только предположение. Постараюсь поставить CTP на днях, тогда скажу точнее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>В Лиспе замыкания (причем полноценные) появились где-то в пятидесятых годах прошлого века. В С++ даже недозамыканий нет по сей день. Со времени публикации последнего стандарта прошло 11 лет. Так что вопрос риторический. Конечно на месте. Когда на добавление всем известной фичи тратят 12 лет и получают хреновый результат, то ни о чем кроме замшелости говорить не приходится.
А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?
А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков. Языки вроде Явы и Шарпа обзавелись большей частью фич которые только обсуждались в С++ох. Скажем методы расширения шарпа были тупо стянуты из одного из реквестов еще в 2002.
12 лет — это строк за который человек вырастает. А они не смогли принять какой-то там стандарт.
За это время обсуждение проблем С++ плавно переросла в обсуждение его реальной необходимости и в итоге просто исчезло так как те кто задавались вопросами просто пересели на другие языки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.