aboutsummaryrefslogtreecommitdiff
path: root/func.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 16:18:13 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-19 12:49:19 +0900
commitcf0cd68ef4d2b8268ade22418c17e0079e9c85e1 (patch)
tree2901ced625193a66e3f993ba981f92a7375cf6e5 /func.cc
parent0ec7dacff3bd7b106ad68deb29013405da1409bf (diff)
downloadkati-cf0cd68ef4d2b8268ade22418c17e0079e9c85e1.tar.gz
[C++] Implement foreach
Diffstat (limited to 'func.cc')
-rw-r--r--func.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/func.cc b/func.cc
index 9d694b9..3118430 100644
--- a/func.cc
+++ b/func.cc
@@ -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*) {