diff options
author | John Wiegley <johnw@newartisans.com> | 2012-03-03 01:17:21 -0600 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2012-03-05 05:03:51 -0600 |
commit | c8c2a17e282c2cbf3c0edb1b756e16be58328331 (patch) | |
tree | decf0c8d24db423a5415668727da26a6897800be /src/scope.h | |
parent | 35ace8816adb76e80e99afb947d66777b31ba43f (diff) | |
download | fork-ledger-c8c2a17e282c2cbf3c0edb1b756e16be58328331.tar.gz fork-ledger-c8c2a17e282c2cbf3c0edb1b756e16be58328331.tar.bz2 fork-ledger-c8c2a17e282c2cbf3c0edb1b756e16be58328331.zip |
Fixed invocation of lambda expressions
foo = x, y, z -> print(x, y, z)
foo(1, 2, 3)
However, this still does not work:
(x, y, z -> print(x, y, z))(1, 2, 3)
Diffstat (limited to 'src/scope.h')
-rw-r--r-- | src/scope.h | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/scope.h b/src/scope.h index 90f9c37a..785ce284 100644 --- a/src/scope.h +++ b/src/scope.h @@ -227,15 +227,17 @@ private: }; template <typename T> -T * search_scope(scope_t * ptr) +T * search_scope(scope_t * ptr, bool prefer_direct_parents = false) { if (T * sought = dynamic_cast<T *>(ptr)) return sought; if (bind_scope_t * scope = dynamic_cast<bind_scope_t *>(ptr)) { - if (T * sought = search_scope<T>(&scope->grandchild)) + if (T * sought = search_scope<T>(prefer_direct_parents ? + scope->parent : &scope->grandchild)) return sought; - return search_scope<T>(scope->parent); + return search_scope<T>(prefer_direct_parents ? + &scope->grandchild : scope->parent); } else if (child_scope_t * child_scope = dynamic_cast<child_scope_t *>(ptr)) { return search_scope<T>(child_scope->parent); @@ -244,9 +246,21 @@ T * search_scope(scope_t * ptr) } template <typename T> -inline T& find_scope(child_scope_t& scope, bool skip_this = true) +inline T& find_scope(child_scope_t& scope, bool skip_this = true, + bool prefer_direct_parents = false) { - if (T * sought = search_scope<T>(skip_this ? scope.parent : &scope)) + if (T * sought = search_scope<T>(skip_this ? scope.parent : &scope, + prefer_direct_parents)) + return *sought; + + throw_(std::runtime_error, _("Could not find scope")); + return reinterpret_cast<T&>(scope); // never executed +} + +template <typename T> +inline T& find_scope(scope_t& scope, bool prefer_direct_parents = false) +{ + if (T * sought = search_scope<T>(&scope, prefer_direct_parents)) return *sought; throw_(std::runtime_error, _("Could not find scope")); |