Автор Тема: Коровник такой коровник...  (Прочитано 32262 раз)

Valery

  • Full Member
  • ***
  • Сообщений: 101
    • Просмотр профиля
Re: Коровник такой коровник...
« Ответ #75 : Июнь 14, 2013, 04:44:15 am »
Полнота по Тьюрингу шаблонов вообще ни в одной программистской книжке не указана... :)
Даже в книжке "Порождающее программирование", где шаблоны рассмотрены очень хорошо.
И уж написано там метапрограмм - дофига... :)
Может быть, в книжке Гуртового об этом говорится?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Коровник такой коровник...
« Ответ #76 : Июнь 14, 2013, 09:48:44 am »
Вообще, возможно имеет смысл ориентироваться на GPCP - там хотя бы авторы проявляют активность и модель разработки открытая. Кстати, кто-то говорил что там Coco/R используется - я этого там в исходниках не обнаружил. Похоже что все ручками. Хотя может плохо смотрел.

Поискал еще внимательней. Нашел следы Coco/R в комментах. Задал вопрос про то, где же находится файл грамматики (CPascal.atg), и мне ответили: https://gpcp.codeplex.com/discussions/446991

Цитировать
Sorry valexey. There is no atg file.

The origins of the recursive descent parser are as follows. I wrote a CPascal.atg file for a subset of Component Pascal. I compiled this with the Modula-2 version of COCO/R. I then hand-translated the Modula-2 parser that COCO/R produced, rewriting it in Component Pascal. I then used that parser to bootstrap the JVM prototype of the compiler.

The JVM compiler for the CP subset was used to bootstrap the present version of GPCP, which was completed by July 2000 in time for the launch of the .NET system at the Microsoft PDC. The version of the parser used by July 2000 was created by manually editing the original source. The atg file has never been upgraded for the full language or for the current abstract syntax form that GPCP uses. So far as I know I do not even have a copy of the original atg file that I used back in 1998.

John.
Y = λf.(λx.f (x x)) (λx.f (x x))

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Коровник такой коровник...
« Ответ #77 : Июнь 14, 2013, 11:06:37 am »
у него в качестве отличительных особенностей C# обозначены индексаторы, и не сказано что ровно это же делается на С++ элементарной перегрузкой operator[].
Нет. Это - не "ровно это же".
Конечный результат то тот же самый. С точки зрения пользователя данного класса. Ну, иначе укажи на различия.

Синтаксический сахар под названием индексатор [] в C# возвращает копию переменной, а не саму переменную. Если переменная - структура, то есть шанс нарваться на чудеса.

Пусть есть struct Complex { public double x, y; }
и
Complex[] array; // массив этих структур с натуральным индексатором []
List<Complex> list; // список этих структур с сахарным индексатором []

Для натурального индексатора [] следующий код правильный:
array[j].x += 42;
array[j].y += 42;

А вот для сахарного индексатора [] следующий код не правильный
list[j].x += 42;
list[j].y += 42;

В случае сахарного индексатора [] сначала нужно получить копию всей переменной, а потом положить её обратно опять же целиком:
Complex tmp = list[j];
tmp.x += 42;
tmp.y += 42;
list[j] = tmp;

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Коровник такой коровник...
« Ответ #78 : Июнь 14, 2013, 11:14:34 am »
Компилятор ругнется, так что есть шанс не нарваться...

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Коровник такой коровник...
« Ответ #79 : Июнь 14, 2013, 11:32:19 am »
Полнота по Тьюрингу шаблонов вообще ни в одной программистской книжке не указана... :)
Даже в книжке "Порождающее программирование", где шаблоны рассмотрены очень хорошо.
И уж написано там метапрограмм - дофига... :)
Может быть, в книжке Гуртового об этом говорится?
Понимаешь, для прикладных программистов, понятие полноты по Тьюрингу действительно можно не вводить. Но в книжке то по языкам программирования и методам трансляции, как-то странно не упоминать об этом. Это же фундаментальная вещь.

А Тьюринг-полнота шаблонов в С++ формально рассмотрена например тут: http://ubietylab.net/ubigraph/content/Papers/pdf/CppTuring.pdf
Y = λf.(λx.f (x x)) (λx.f (x x))

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Коровник такой коровник...
« Ответ #80 : Июнь 14, 2013, 02:46:20 pm »
Компилятор ругнется, так что есть шанс не нарваться...
Да, конечно, в таком явном случае он ругнётся. Неприятности начинаются когда так:

struct Complex
{
  public double x, y;

  public void Increment ()
  {
    this.x++;
    this.y++;
  }
}

А теперь делаем:

list[j].Increment();

здесь из списка вытаскивается копия структуры, у неё вызывается процедура Increment() и всё. Оригинал структуры лежащий внутри списка не изменяется.

В тоже самое время для массива инструкция

array[j].Increment();

изменяет оригинал структуры лежащий в массиве.

Синтаксически list[j].Increment() и array[j].Increment() выглядят одинаково, но семантика совершенно разная.