2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Паскаль. Оператор присоединения
Сообщение26.01.2010, 15:26 


08/11/09
156
Код:
with a,b,c do M;

Код на Паскале, M - некоторая переменная. В каком порядке проверяются переменные? c.M, b.M, a.M, а дальше? А порядок? Можно прямо полный список? Я никак понять не могу!

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 17:44 
Заслуженный участник
Аватара пользователя


01/08/06
3054
Уфа
Конструкция
Код:
with a,b,c do M;
эквивалентна
Код:
with a do
  with b do
    with c do M;
Значит, сначала будут проверяться всевозможные префиксы, оканчивающиеся на c, потом на b, потом на a: a.b.c.M, b.c.M, a.c.M, c.M, a.b.M, b.M, a.M, и, наконец, просто M.

-- Вт янв 26, 2010 21:47:46 --

Это я исходя из здравого смысла пишу, возможно, как-то хитрее это всё работает (можете провести эксперимент).

-- Вт янв 26, 2010 21:50:54 --

Но обратный порядок невозможен: c.b.M --- такое точно не будет проверено.

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 18:02 
Заслуженный участник


04/05/09
4582
worm2 в сообщении #283749 писал(а):
Конструкция
Код:
with a,b,c do M;
эквивалентна
Код:
with a do
  with b do
    with c do M;
Значит, сначала будут проверяться всевозможные префиксы, оканчивающиеся на c, потом на b, потом на a: a.b.c.M, b.c.M, a.c.M, c.M, a.b.M, b.M, a.M, и, наконец, просто M.
А по моему, либо a.b.c.M, либо b.c.M, в зависимости от того, есть ли a.b, но не обе.
Принцип такой:
Код:
with a do with b do
сразу определяет, что за b использовать, или независимую переменную, или a.b. В дальнейшем c ищется только в этой единственной b, и так далее.
T.e. М будет искаться только в четырёх местах: текущих c, b, a, и просто M.

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 18:05 


08/11/09
156
В общем, у нас в группе такие же споры. Слова преподавателя: "Куракин, это же очевидно! Справа налево, и все! И В-С-Е!"

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 18:27 
Заслуженный участник
Аватара пользователя


01/08/06
3054
Уфа
venco писал(а):
Принцип такой:
Код:
with a do with b do

сразу определяет, что за b использовать, или независимую переменную, или a.b. В дальнейшем c ищется только в этой единственной b, и так далее.
T.e. М будет искаться только в четырёх местах: текущих c, b, a, и просто M.

Практика показывает, что a.c.M тоже ищется (разумеется, если нет a.b.c.M).
Однако принцип, который Вы привели, действительно, верен (а мой список из 8-ми элементов --- нет). Если есть a.b, то b.<что угодно> будет недоступно и т.д.

Уточнённый список таков: a.b.c.M, a.b.M, b.c.M, a.c.M, c.M, b.M, a.M, M. Кажется, так :D

-- Вт янв 26, 2010 22:37:21 --

Нет, не так. Теперь и я запутался :lol:

-- Вт янв 26, 2010 22:41:20 --

Нет, одного списка составить нельзя. Нужно 3 списка:
1) Если есть a.b.c: a.b.c.M, a.b.M, a.M, M
2) Если нет a.b.c, но есть a.b: a.b.M, a.c.M, c.M, a.M, M
3) Если нет a.b: b.c.M, a.c.M, c.M, b.M, a.M, M

-- Вт янв 26, 2010 22:43:09 --

Осталось только поставить эксперимент, но лично я уже пойду делом займусь :)

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 19:05 
Заслуженный участник


04/05/09
4582
worm2 в сообщении #283764 писал(а):
Нет, одного списка составить нельзя. Нужно 3 списка:
1) Если есть a.b.c: a.b.c.M, a.b.M, a.M, M
2) Если нет a.b.c, но есть a.b: a.b.M, a.c.M, c.M, a.M, M
3) Если нет a.b: b.c.M, a.c.M, c.M, b.M, a.M, M
Принцип, что я привёл, надо применять после каждого with.
После "with a" все переменные ищутся в списке { a, верхний уровень}.
После этого в операторе "with b" сначала компилятор ищет b, и в зависимости от того, где его найдёт, дальнейший поиск будет в списке { (b или a.b), a, верхний уровень }.
Аналогично, в операторе "with c" сначала компилятор ищет c (в списке из предыдущей строчки), и, в зависимости от того, где найдётся c, дальнейший поиск будет в списке { (найденное c), (b или a.b), a, верхний уровень }.

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 19:08 


08/11/09
156
Лично мне легче не стало... Все очевидно, одним словом :D

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 20:17 


08/11/09
156
Да, по эксперименту важно наличие/отсутствие только переменной, но и содеожащей ее записи. Результаты при этом разные. А далее я запутался.

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
program t(output);
var M:integer; {1}
    A:record
            M:integer; {2}
            B:record
                    M:integer; {3}
                    C:record
                            M:integer {4}
                    end
            end
    end;
    B:record
            M:integer; {5}
            C:record
                    M:integer {6}
            end
    end;
    C:record
            M:integer {7}
    end;

begin
writeln; writeln;

M:=1;
A.M:=2; A.B.M:=3; A.B.C.M:=4;
B.M:=5; B.C.M:=6;
C.M:=7;

with A,B,C do write(M)
end.
 

 Профиль  
                  
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 20:32 
Заслуженный участник


04/05/09
4582
По моему, должно напечатать 4.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group