2014 dxdy logo

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

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




 
 Паскаль. Оператор присоединения
Сообщение26.01.2010, 15:26 
Код:
with a,b,c do M;

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

 
 
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 17:44 
Аватара пользователя
Конструкция
Код:
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 
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 
В общем, у нас в группе такие же споры. Слова преподавателя: "Куракин, это же очевидно! Справа налево, и все! И В-С-Е!"

 
 
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 18:27 
Аватара пользователя
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 
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 
Лично мне легче не стало... Все очевидно, одним словом :D

 
 
 
 Re: Паскаль. Оператор присоединения
Сообщение26.01.2010, 20:17 
Да, по эксперименту важно наличие/отсутствие только переменной, но и содеожащей ее записи. Результаты при этом разные. А далее я запутался.

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
По моему, должно напечатать 4.

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group