From 1f39d4148e588a5476e96550591131ae65ad0fe2 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Sat, 21 Feb 2009 18:49:43 -0400 Subject: Create a new interactive_t helper class The purpose of this class is much like Emacs' (interactive) form: it allows a value expression function to declare exactly how many arguments, and of what type, it intends to receive. It then offers type-safe access to theese arguments in a consistent manner. An example value expression function definition in C++: value_t fn_foo(call_scope_t& scope) { // We expect a string, an integer, and an optional date interactive_t args(scope, "sl&d"); std::cout << "String = " << args.get(0) << "Integer = " << args.get(1) << std::endl; if (args.has(2)) // was a date provided? std::cout << "Date = " << args.get(2) << std::endl; return NULL_VALUE; } There is also an in_context_t template, which finds the context type T in the current scope hierarchy. The in_context_t then also acts as a smart pointer to reference this context object, in addition to serving the same duty as interactive_t. This combination of intent is solely for the sake of brevity. value_t fn_bar(call_scope_t& scope) { in_context_t env(scope, "sl&d"); std::cout << "Account name = " << env->fullname() << "String arg = " << env.get(0) << std::endl; return NULL_VALUE; } As you can see here, 'env' acts as a smart pointer to the required context, and an object to extract the typed arguments. --- src/scope.cc | 17 ----------------- 1 file changed, 17 deletions(-) (limited to 'src/scope.cc') diff --git a/src/scope.cc b/src/scope.cc index 660f1af2..f4b2dfab 100644 --- a/src/scope.cc +++ b/src/scope.cc @@ -60,21 +60,4 @@ expr_t::ptr_op_t symbol_scope_t::lookup(const string& name) return child_scope_t::lookup(name); } -string join_args(call_scope_t& args) -{ - std::ostringstream buf; - bool first = true; - - for (std::size_t i = 0; i < args.size(); i++) { - if (first) { - buf << args[i]; - first = false; - } else { - buf << ' ' << args[i]; - } - } - - return buf.str(); -} - } // namespace ledger -- cgit v1.2.3