[D] вложенные классы
От: x-code  
Дата: 13.01.08 20:21
Оценка:
Сравнивал замыкания в D, Scala и Nemerle, и решил проверить как они работают с вложенными классами. Наткнулся на проблему в Ди, которая к замываниям в общем не имеет отношения.
Итак, почему такой вот код на Ди компилируется без ошибок?
int delegate() func(int x)
{
    int local = x;  // local variable
    class Inner
    {
        int foo()
        {
            return local;
        }
    }
    return &Inner.foo;  //  return inner non-static function
}

int main(char[][] args)
{
  int delegate() df;
  df = func(100);
  int res = df();
  return 0;
}

Программа естественно вылетает, и понятно почему — возвращаемая функция не имеет объекта класса (который не создавался). Но почему тогда компилятор позволяет возвратить нестатическую функцию без объекта?

В Scala подобный код не проходит (в то же время, если я создам объект и верну функцию от объекта, то все работает правильно как в D так и в Scala), в Nemerle не знаю т.к. на домашнем компе нет рабочей версии компилятора.
Re: [D] вложенные классы
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 14.01.08 08:26
Оценка: +1
Здравствуйте, x-code, Вы писали:

XC>Сравнивал замыкания в D, Scala и Nemerle, и решил проверить как они работают с вложенными классами. Наткнулся на проблему в Ди, которая к замываниям в общем не имеет отношения.

XC>Итак, почему такой вот код на Ди компилируется без ошибок?

Вероятно, это баг. Коих в D все еще полно.

PS. При описании проблем компилятора лучше все-таки указывать точную версию компилятора.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: [D] вложенные классы
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.01.08 12:56
Оценка:
Здравствуйте, x-code, Вы писали:

XC>В Scala подобный код не проходит (в то же время, если я создам объект и верну функцию от объекта, то все работает правильно как в D так и в Scala), в Nemerle не знаю т.к. на домашнем компе нет рабочей версии компилятора.


Так же как и в Скале. В прочем это так в любом языке сносно поддерживающем ФП. Даже в C# и Васике это так.

Просто автор Ди пока что учится. И так как учиться на чужом опыте он явно не привык, он наступает на все грабли которе лежат на пути. Думаю, что Ди 3 или 4 будет очень похож на Скалу и Немерле. Вот только я не позавидую тем кто будет вынужден переходить с версии на версии. Ломающих изменений будте не мало. Как, в прочем, и не мало будет "выброшенных" концепций.

В прочем, это тоже нужный опыт, так как Ди будет на практике доказывать верность или не верность тех идей которые уже десятки лет есть в ФЯ.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [D] вложенные классы
От: c-smile Канада http://terrainformatica.com
Дата: 14.01.08 17:42
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Просто автор Ди пока что учится. И так как учиться на чужом опыте он явно не привык, он наступает на все грабли которе лежат на пути. Думаю, что Ди 3 или 4 будет очень похож на Скалу и Немерле. Вот только я не позавидую тем кто будет вынужден переходить с версии на версии. Ломающих изменений будте не мало. Как, в прочем, и не мало будет "выброшенных" концепций.


Читать матчасть перед тем как энтропию воздуха портить.

<q>While a non-static nested class can access the stack variables of its enclosing function, that access becomes invalid once the enclosing function exits.</q>

http://www.digitalmars.com/d/class.html
Re[3]: [D] вложенные классы
От: x-code  
Дата: 15.01.08 09:03
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Читать матчасть перед тем как энтропию воздуха портить.


CS><q>While a non-static nested class can access the stack variables of its enclosing function, that access becomes invalid once the enclosing function exits.</q>


CS>http://www.digitalmars.com/d/class.html


Мой пример именно оттуда и взят (с незначительными переделками)
И тут на самом деле два вопроса:
1. Правильно ли идеологически, что вложенная функция, ссылающаяся на локальную переменную объемлющей, образует замыкание, а метод вложенного в функцию класса — нет? Хотя в Ди вложенные классы максимально приближены к методам функций, в частности, методы вложенного в другой класс класса могут ссылаться на поля объемлющего класса, и создать вложенный класс невозможно без указания объекта объемлющего? (в С++ объемлющие классы для вложенных были всего-лишь namespace'ами)
2. Почему позволяется возвращать нестатический метод класса как статический? (это скорее всего баг, но вдруг тут есть какой-то глубокий смысл а я о нем не знаю )
Re[3]: [D] вложенные классы
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.01.08 14:15
Оценка:
Здравствуйте, c-smile, Вы писали:

CS><q>While a non-static nested class can access the stack variables of its enclosing function, that access becomes invalid once the enclosing function exits.</q>


Не понял какое отношение это имеет к данной проблеме, но по любому читать нужно было автору языка. А то столько лет, а он только-только подобрался к фунциональности которая в ФЯ была еще десятки лет назад.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.