- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
#include <iostream>
namespace dynamic {
template <class T> class scope;
template <class T> class variable {
public:
variable() : initial(0), current(&initial) {}
variable(const T &val) : initial(val, 0), current(&initial) {}
operator T() { return current->val; }
const T & operator = (const T & new_val) {
return current->val = new_val;
}
private:
struct node {
node(node *prev) : val(), prev(prev) {}
node(const T &val, node *prev) : val(val), prev(prev) {}
T val;
node *prev;
};
node initial;
node *current;
friend class scope<T>;
};
template <class T> class scope {
public:
scope(variable<T> &var) : var(var), node(var.current) {
var.current = &node;
}
scope(variable<T> &var, const T &val) : var(var), node(val, var.current) {
var.current = &node;
}
~scope() {
var.current = node.prev;
}
private:
variable<T> &var;
typename variable<T>::node node;
};
}
dynamic::variable<int> x(100500);
void foo() {
std::cout << x << std::endl;
}
void bar() {
dynamic::scope<int> x_(x, 42);
foo();
x = 265;
foo();
}
int main() {
foo();
bar();
foo();
return 0;
}
someone 14.05.2013 07:38 # +5
bormand 14.05.2013 07:56 # +4
guest 14.05.2013 10:59 # +2
roman-kashitsyn 14.05.2013 08:34 # +2
dynamically_scoped::var
dynamically_scoped::let
bormand 14.05.2013 09:02 # +1
А так придется let делать макросом для удобства...
LispGovno 14.05.2013 19:13 # +1
crastinus 14.05.2013 10:04 # 0
bormand 14.05.2013 10:21 # 0
absolut 14.05.2013 13:53 # +5
bormand 14.05.2013 15:28 # +2
Но фишка тут в динамической области видимости - изменения переменной в функции bar видно в вызываемой из нее функции foo, но не видно после возврата из bar.
3.14159265 14.05.2013 19:18 # +6