Mercurial > repos > icfp2013
view src/requests.tp @ 22:a4837071b73d
some attempts at parsing an eval response
author | William Morgan <bill@mrgn.org> |
---|---|
date | Sat, 10 Aug 2013 03:31:50 -0700 |
parents | a4ac42c69285 |
children | fcd7ae66a9ee |
line wrap: on
line source
#{ strJoin <- :str arr { acc <- "" arr foreach: :i el { if: i = 0 { acc <- (string: el) } else: { acc <- acc . ", " . (string: el) } } acc //arr fold: "" with: :acc el {acc . el} } quote <- :str { "\"" . str . "\"" } evalRequest <- :id args { #{ string <- { idStr <- (quote: "id") . ":" . (quote: id) argsStr <- (quote: "arguments") . ":" . (quote: (strJoin: "," args)) "{" . idStr . "," . argsStr . "}" } } } guessRequest <- :id :prog { #{ string <- { idStr <- "\"id\":\"" . id . "\"" progStr <- "\"program\":\"" . prog . "\"" "{" . idStr . "," . progStr . "}" } } } expect:in <- :target input { input find: target else: { print: "expected " . target . "!\n" -1 //exit, it's all fucked now } } quotedVal <- :str { str find: "\"" else: { "expected } } jsonVal:in <- :target input { idx <- expect: target in: input nextQuoteIdx <- idx + quotedVal: idx } evalResponse <- :str { str find: "status" else: {print: missing} statIdx <- expect: "status" in: str status <- requireK #{ status <- outputs <- parseArray(input) message <- } } println: str { print: str . "\n" } readObject <- :str { expect "{" readObjectContents: expect "}" } readObject <- :str { innerStr <- readEnclosed: "{" "}" elems <- split: "," } evalResponse <- :str { status <- readValForKey: "status" str if status = "error" { } else { if status = "ok" { #{ readEvalOutputs: } } } } expect:in:else <- :target src doElse { src find: target else: { print: "parse error: expected " . target . "!\n" doElse: } } getStrForKey:from:else <- :key :src :doElse { idx <- expect: "\"" in: src else: doElse idx + (key length): } getEval:else <- :str :fail { statusRest <- getStrForKey: "status" from: str else: fail if (statusRest value) = 0 { outputsRest <- getOutputs: (statusRest rest) else: fail #{ value <- #{ status <- statusRest.value outputs <- outputsRest.value } rest <- outputsRest.rest } } else { print: "Status was error, message: " . message #{ message <- getStrForKey: "message" from: (statusRest rest) else: fail value <- #{ status <- statusRest.value message <- outputsRest.value } rest <- outputsRest.rest } } } main <- { print: ((evalRequest: "someId" #[1 2i64 3i64]) string) . "\n" print: ((guessRequest: "someId" "someProg") string) . "\n" exampleEvalResponse <- "{\"status\":\"ok\",\"outputs\":[\"0x0000000000000002\",\"0x01DFFFFFFFFFFFFE\"]}" resp <- getEval: exampleEvalResponse else: { println: "failed to parse response." } println: ((resp value) status) } }