diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-18 16:18:13 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-19 12:49:19 +0900 |
commit | cf0cd68ef4d2b8268ade22418c17e0079e9c85e1 (patch) | |
tree | 2901ced625193a66e3f993ba981f92a7375cf6e5 /func.cc | |
parent | 0ec7dacff3bd7b106ad68deb29013405da1409bf (diff) | |
download | kati-cf0cd68ef4d2b8268ade22418c17e0079e9c85e1.tar.gz |
[C++] Implement foreach
Diffstat (limited to 'func.cc')
-rw-r--r-- | func.cc | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -7,6 +7,7 @@ #include <algorithm> #include <iterator> +#include <memory> #include <unordered_map> #include "ast.h" @@ -14,6 +15,7 @@ #include "log.h" #include "parser.h" #include "strutil.h" +#include "var.h" namespace { @@ -389,8 +391,17 @@ void CallFunc(const vector<Value*>&, Evaluator*, string*) { printf("TODO(call)"); } -void ForeachFunc(const vector<Value*>&, Evaluator*, string*) { - printf("TODO(foreach)"); +void ForeachFunc(const vector<Value*>& args, Evaluator* ev, string* s) { + shared_ptr<string> varname = args[0]->Eval(ev); + shared_ptr<string> list = args[1]->Eval(ev); + WordWriter ww(s); + for (StringPiece tok : WordScanner(*list)) { + unique_ptr<SimpleVar> v(new SimpleVar( + make_shared<string>(tok.data(), tok.size()), "automatic")); + ScopedVar sv(ev->mutable_vars(), *varname, v.get()); + ww.MaybeAddWhitespace(); + args[2]->Eval(ev, s); + } } void OriginFunc(const vector<Value*>&, Evaluator*, string*) { |