Re[6]: C++ расширение языка
От: jazzer Россия Skype: enerjazzer
Дата: 02.07.10 05:02
Оценка: +1
Здравствуйте, jamesq, Вы писали:

J>Недостатки описанных подходов:

J>В первых двух вариантах, память для вынесенного по указателю поля объекта оказывается в стороне от участка
J>памяти с самим объектом, что при обращении к полю создает проблемы с кэшированием. Дополнительно, появляются
J>проблемы с фрагментацией памяти. Понятно, что лучше один большой учаток памяти на объект и поле в нем, чем два
J>отдельных.

J>Во всех вариантах, которые мне приходят в голову, есть еще один недостаток — весь доступ к вынесенному полю

J>идет через указатель.

Boost.Optional спасет отца русской демократии. У него нет ни одной из описанных проблем.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[15]: C++ расширение языка
От: Klapaucius  
Дата: 02.07.10 07:32
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

>>Я, собственно, потому и удивился, что он как-то невнятно изъясняется.

BZ>в смысле?

Вот это: "compile-time dynamic typing". Было бы еще понятно, если бы "compile-time duck typing" написали. А вообще это называется structural typing.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[6]: C++ расширение языка
От: Klapaucius  
Дата: 02.07.10 08:04
Оценка:
Здравствуйте, dilettante, Вы писали:

D>Ну так выход — не использовать локальные объекты, подлежащие уничтожению, в таких блоках.


Ну конечно. Крайне полезное нововведение для C++ получается.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re: C++ расширение языка
От: Ligen Украина http://zone-of-ambiguity.blogspot.com/
Дата: 02.07.10 08:35
Оценка: +1
Здравствуйте, Caracrist, Вы писали:

C>Скажу чего мне нехватает

C>Покритикуйте или расскажите чего нехватает вам. Ссылки на языки в которых подобная проблема решена будут интересны, но хотелось бы не сильно далеко уходить от мира c++

Сразу скажу что мне не хватает странного
Точнее не то чтобы не хватает, но я бы использовал в паре мест такую фичу: было бы круто делать switch на enum, который выдавал бы ошибку компиляции, если case'ами покрыты не все значения enum. Какой нибудь strict_switch.

typedef enum {One, Two, Three} MyEnum_type;
MyEnum_type value;
strict_switch(value)
{
case One:
     //.... 
     break;
case Two:
     //....
}  // <-------- error, case Three not handled
Viva el Junta Militar! Viva el Presidente!
Re[2]: C++ расширение языка
От: FR  
Дата: 02.07.10 10:09
Оценка: 2 (1)
Здравствуйте, Ligen, Вы писали:

L>Сразу скажу что мне не хватает странного

L>Точнее не то чтобы не хватает, но я бы использовал в паре мест такую фичу: было бы круто делать switch на enum, который выдавал бы ошибку компиляции, если case'ами покрыты не все значения enum. Какой нибудь strict_switch.

Я наверно уже всех подзадолбал но в D есть:

enum MyEnum_type { One, Two, Three };

void main()
{
    
    MyEnum_type value;
    
    final switch(value)
    {
    case MyEnum_type.One:
         //.... 
         break;
    
    case MyEnum_type.Two:
         //....
    } 
}


Не скомпилируется с такой ошибкой:

fghhghj.d(8): Error: enum member Three not represented in final switch
Re[7]: C++ расширение языка
От: dilettante  
Дата: 02.07.10 10:12
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Ну конечно. Крайне полезное нововведение для C++ получается.


Да. Позволяющее написать например библиотеку легковесных потоков, а-ля Эрланг, распределяющиеся между несколькими реальными тредами.
Re[8]: C++ расширение языка
От: Klapaucius  
Дата: 02.07.10 10:27
Оценка:
Здравствуйте, dilettante, Вы писали:

D>Да. Позволяющее написать например библиотеку легковесных потоков, а-ля Эрланг, распределяющиеся между несколькими реальными тредами.


Библиотеку потрясающе полезных легковестных потоков, внутри которых нельзя использовать RAII. Отличная идея.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[8]: C++ расширение языка
От: Klapaucius  
Дата: 02.07.10 10:28
Оценка:
Здравствуйте, dilettante, Вы писали:

D>написать библиотеку легковесных потоков.


Для этого, кстати, полноценные продолжения и не нужны.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[9]: C++ расширение языка
От: dilettante  
Дата: 02.07.10 11:57
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Библиотеку потрясающе полезных легковестных потоков, внутри которых нельзя использовать RAII. Отличная идея.


Разумеется, внутри потоков можно использовать RAII.
Re: Лучше уж именованные блоки
От: x-code  
Дата: 04.07.10 12:03
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>1. break [what]; continue [what];

C>возможность делать break(и continue) из любого скоупа, а не только цикла. Плюс параметризировать.
C>число говорит сколько скоупов оборвать, а назавание цыкла говорит какой первый встречающийся цикл оборвать. Через запятую перечисление последовательных обрывов.

Именованные блоки, вот такие:
if(x>0) IfPositiveX 
{
  while(i != 10) MainIndexLoop
  {
    for(k=0; k<100; k++) PrepareSpecialDataLoop 
    {
      // ...
      // вот так
      if(condition1) break MainIndexLoop;
      // ...
      // или даже так
      if(condition2) break IfPositiveX;
    }
  }
}


Заодно код станет понятнее
Re: C++ расширение языка
От: minorlogic Украина  
Дата: 04.07.10 12:54
Оценка:
Может наоборот ? Что убрать из языка?

К огромному моему сожалению , убрать из языка намного сложнее (на порядки) чем добавить. И почти не реально убрать что то не теряя совместимость.
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[10]: C++ расширение языка
От: BulatZiganshin  
Дата: 04.07.10 21:17
Оценка:
Здравствуйте, dilettante, Вы писали:

K>>Библиотеку потрясающе полезных легковестных потоков, внутри которых нельзя использовать RAII. Отличная идея.


D>Разумеется, внутри потоков можно использовать RAII.


в continuations использовать RAII нельзя. а потоки — это только частный случай их применения, поэтому там RAII использовать тоже нельзя, если только вы нне собираетесь делать отдельный анализатор того, как используется библиотека
Люди, я люблю вас! Будьте бдительны!!!
Re[7]: C++ расширение языка
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 05.07.10 06:06
Оценка: 8 (1)
BulatZiganshin,

МС>>Там, ЕМНИП, не простой текстовый препроцессор, а полноценная компайл-тайм логика. в D есть отголосок — компайл-тайм функции.


BZ>новое — это хорошо разрекламированное старое синтаксические макросы хорошо известны с 60-х, как и их недостатки


BZ>для того, чтобы у тебя в шаблонах/макросах не появлялось многоэтажных сообщений об ошибках, нужна типизация. те самые концепты. без них что угодно можно подставить куда попало


Правильно. Но можно без концептов — просто нормальную систему типов, которая бы охватывала не только программы, но и метапрограммы. Например, MetaOcaml хорош тем, что если генератор прошёл проверку типов (well typed), то и сгенерированный код тоже будет проходить проверку типов (тоже будет well typed).

Если речь идёт об отладке сгенерированного кода, то нужен аналог macroexpand-1 (которого кстати нет в C++ и не придвидится). А ходить по шагам в макросе в общем случае (мне кажется) не получится, поскольку самих шагов нет: ведь макрос может строить не только тела функций, а например типы, сами функции вместе с сигнатурами, и вещи типа infixl/infixr. То есть декларативный код, который сгенерирован макросом, вряд ли может быть проверен пошагово, даже если это супер-пупер дебаггер.

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

Однако в последнее время здесь (то есть в исследовании свойств метапрограмм с побочными эффектами) наметился прогресс:
Shifting the Stage: Staging with Delimited Control, работа 2009 года. (Олег Киселёв форева).

Тем не менее, несмотря на все сложности с макросами, я не считаю их "слишком большой пушкой"(тм) и лично мне они бы пригодились в ряде мест.
... << RSDN@Home 1.2.0 alpha 4 rev. 1423>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: C++ расширение языка
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 05.07.10 07:25
Оценка:
BulatZiganshin,

K>>>А как совмещать продолжения и RAII?


VD>>GC


BZ>gc не заменяет raii, поскольку не гарантирует вызов деструктора в детерминированный момент времени


RAII не нужен:
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket acquire release action = 
  do handle <- acquire
     result <- action handle
     release handle
     return result

и не нужны никакие гарантии никаких мусорщиков. Только FCO
... << RSDN@Home 1.2.0 alpha 4 rev. 1423>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: C++ расширение языка
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 05.07.10 07:43
Оценка:
Klapaucius,

VD>>GC


K>Ну ладно, отказались мы от детерминированного освобождения памяти. Тут я не против. Ну а как быть с детерминированным освобождением остальных ресурсов? Продолжения делают любое детерминированное освобождение невозможным — т.е. любой аналог using тоже работать не будет.


Кстати, а флаг isDisposed перед release не поможет? (для bracket, using и аналогов)
... << RSDN@Home 1.2.0 alpha 4 rev. 1423>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: C++ расширение языка
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 05.07.10 07:59
Оценка:
Lazy Cjow Rhrr,

LCR>Кстати, а флаг isDisposed перед release не поможет? (для bracket, using и аналогов)


Поможет, но при условии, что этот флаг не будет захватываться в продолжение. Мда.
... << RSDN@Home 1.2.0 alpha 4 rev. 1423>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[6]: C++ расширение языка
От: BulatZiganshin  
Дата: 05.07.10 09:41
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>RAII не нужен:

LCR>
LCR>bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
LCR>bracket acquire release action = 
LCR>  do handle <- acquire
LCR>     result <- action handle
LCR>     release handle
LCR>     return result
LCR>

LCR>и не нужны никакие гарантии никаких мусорщиков. Только FCO

во-первых, это и есть в моём понимании RAII для Haskell. во-вторых, посмотри на стандартный bracket — он защищён от исключений

ну и главное — мы говорим о continuations, где это как раз нельзя использовать. почитай про монаду Cont
Люди, я люблю вас! Будьте бдительны!!!
Re[11]: C++ расширение языка
От: dilettante  
Дата: 05.07.10 09:54
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>в continuations использовать RAII нельзя. а потоки — это только частный случай их применения, поэтому там RAII использовать тоже нельзя, если только вы нне собираетесь делать отдельный анализатор того, как используется библиотека :)


Т.е. например в системных тредах нельзя использовать RAII? А если можно — почему нельзя использовать в пользовательских потоках, сделанных на продолжениях и обладающей такой же семантикой?
Re[12]: C++ расширение языка
От: BulatZiganshin  
Дата: 05.07.10 11:54
Оценка:
Здравствуйте, dilettante, Вы писали:

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


BZ>>в continuations использовать RAII нельзя. а потоки — это только частный случай их применения, поэтому там RAII использовать тоже нельзя, если только вы нне собираетесь делать отдельный анализатор того, как используется библиотека


D>Т.е. например в системных тредах нельзя использовать RAII? А если можно — почему нельзя использовать в пользовательских потоках, сделанных на продолжениях и обладающей такой же семантикой?


можно поинтересоваться — как вы различаете системные и пользовательские треды? и знакомы ли вообще с тем, как реализуются потоки черех continuations? и хъотя бы даже с тем что такое вообще continuations?

вообще весь этот тред вызван как я понимаю тем, что люди игнорируют непонятное им слово и рассуждают об обычных потоках. вот уже до системных потоков дошли
Люди, я люблю вас! Будьте бдительны!!!
Re[12]: C++ расширение языка
От: BulatZiganshin  
Дата: 05.07.10 12:03
Оценка:
Здравствуйте, dilettante, Вы писали:

>Т.е. например в системных тредах нельзя использовать RAII? А если можно — почему нельзя использовать в пользовательских потоках, сделанных на продолжениях и обладающей такой же семантикой?


а, я понял, вы под системными тредами понимаете сделанные без continuations? тошда ответ такой — семантика другая. разберитесь наконец в существе вопроса вместо теоретических рассуждений о неизвестном вам предмете
Люди, я люблю вас! Будьте бдительны!!!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.