2010-09-21 2 views
-1

ниже представляет собой программу, в статически-Scoped языке:Не могли бы вы объяснить, как эта программа выполняется?

program main 
    int x, y; 
    void p1(value int y, void q(reference int)) { 
     void p2(reference int x) { 
      x := y + 2; 
      print(x); 
      q(y); 
      } 
     if x = y then q(y) else p1(y+1, p2) 
     } 
    void p2(reference int x) { 
     x := y + 2; 
     print(x); 
     } 
    x := 2; 
    y := x; 
    p1(0, p2); 
end main 

от «значение» это означает, что параметр передается по значению, «ссылка» в качестве ссылки.

Будет ли вызов функции «q (y)» в p2 вызвать бесконечный цикл?

+0

Является ли язык Ада? – YWE

+0

должен быть Ада-подобным. но я предполагаю, что это псевдокод. фактический вопрос заключается в построении контурной диаграммы, показывающей структуру вложения контуров. – pippoflow

+0

Откуда у вас этот код или псевдокод? Какая школа? Я никогда раньше не видел такого кода. – YWE

ответ

2

Поскольку это статически Scoped, вы можете изменить имена переменных внутри функции, чтобы избежать путаницы, задуманного вопрос. Я заменяю y в p1 на p1y, p2 в p1 с p1p2, x в p1p2 с p1p2x и x в p2 с p2x (теперь он выглядит еще более уродливым). Я также немного изменил форматирование.

program main 
    int x, y; 
    void p1(value int p1y, void q(reference int)) { 
    void p1p2(reference int p1p2x) { 
     p1p2x := p1y + 2; 
     print(p1p2x); 
     q(p1y); 
    } 

    if x = p1y then { 
     q(p1y); 
    } else { 
     p1(p1y+1, p1p2); 
    } 
    } 

    void p2(reference int p2x) { 
    p2x := y + 2; 
    print(p2x); 
    } 

    x := 2; 
    y := x; 
    p1(0, p2); 
end main 

Поскольку это домашнее задание, вы должны быть в состоянии взять его отсюда легко, используя любые методы, которые они учили вас (следовать линии исполнения по линии, рисовать стек, и т.д.). Но окончательный ответ «да», он будет контур бесконечно, печать 468 и так далее.

1

Он печатает 4. В Java:

import java.util.concurrent.atomic.AtomicInteger; 

public class Test { 

    public static void main(String... a) { 
     new Test().run(); 
    } 

    AtomicInteger x = new AtomicInteger(0); 
    AtomicInteger y = new AtomicInteger(0); 

    void run() { 
     x.set(2); 
     y.set(x.get()); 
     new P1().p1(new AtomicInteger(0), new P2()); 
    } 

    interface Q { 
     void q(AtomicInteger x); 
    } 

    class P2 implements Q { 
     public void q(AtomicInteger x) { 
      x.set(y.get() + 2); 
      System.out.println(x.get()); 
     } 
    } 

    class P1 implements Q { 
     public void q(AtomicInteger x) { 
      x.set(y.get() + 2); 
      System.out.println(x.get()); 
     } 
     void p1(AtomicInteger y, Q q) { 
      if (x.get() == y.get()) { 
       q.q(y); 
      } else { 
       p1(new AtomicInteger(y.get()+1), this); 
      } 
     } 
    } 

} 
+1

Строка 'x.set (y.get() + 2);' использует переменную экземпляра 'y', но в вопросе OP она использует' y', объявленную в 'p1'. – imgx64

+0

Да. Вероятно, есть некоторые ошибки. Однако я не буду пытаться их исправить, так что, по крайней мере, это многое остается для ученика :-) –

Смежные вопросы