#include<iostream>
using namespace std;

void dynamic();
int main() {
  int x = 1;
  auto f = [&x](int y) { return x+y; };
  auto g = [&f]() {
    int x = 2;
    return f(0);
  };
  cout << g() << endl;   // prints 1, static scoping
  dynamic();
  return 0;
}

// simulated dynamic scoping

void dynamic() {
  int x = 1;
  auto f = [&x](int y) { return x+y; };
  auto g = [&f,&x]() {
    int savex = x;
    x = 2;
    auto answer = f(0);
    x = savex;
    return answer;
  };
  cout << g() << endl;  // prints 2, simulates dynamic scoping
}
