У меня есть входящий ленивый поток строк из файла, который я читаю с tail-seq (to contrib - now!) и я хочу обрабатывать эти строки один за другим с несколькими «listener-функциями», которые принимают действие в зависимости от повторных переходов (или других вещей) в строках.
Я попробовал следующее:
(defn info-listener [logstr]
(if (re-seq #"INFO" logstr) (println "Got an INFO-statement")))
(defn debug-listener [logstr]
(if (re-seq #"DEBUG" logstr) (println "Got a DEBUG-statement")))
(doseq [line (tail-seq "/var/log/any/java.log")]
(do (info-listener logstr)
(debug-listener logstr)))
и работает как положено. Однако в коде МНОГО дубликатов кода и других грехов, и обновлять код скучно.
Важным шагом, кажется, является применение многих функций к одному аргументу, т.е.
(listen-line line '(info-listener debug-listener))
и использование этого вместо скучного и подверженного ошибкам do-оператора.
Я попробовал следующий, казалось бы, умный подход:
(defn listen-line [logstr listener-collection]
(map #(% logstr) listener-collection))
но это только делает
(nil) (nil)
есть любознательность или функции первого класса кусают меня наверняка, но где я положу приложение?
Я также открыт для радикально другой подход к проблеме, но это, кажется, вполне разумный способ начать. Макросы/несколько методов на данный момент являются избыточными/неправильными.
-121--1229253-
Я продолжаю сталкиваться с этой ситуацией, когда я получаю неверный отклик HTTP (например, 400), но не могу посмотреть на StartEntity в объекте StartResponse. Когда я перехожу к отладчику, я вижу, что сущность имеет содержимое (длина > 0), и я даже могу посмотреть на содержимое, но все, что я вижу, это массив чисел (коды ASCII я предполагаю?), что не полезно. Я вызову EntityUtils.toString () для сущности, но я получу исключение - либо IOException, либо какое-то исключение «объект находится в недопустимом состоянии». Это очень расстраивает! Есть ли способ получить этот контент в удобочитаемой для человека форме?
Вот мой код:
protected JSONObject makeRequest(HttpRequestBase request) throws ClientProtocolException, IOException, JSONException, WebRequestBadStatusException {
HttpClient httpclient = new DefaultHttpClient();
try {
request.addHeader("Content-Type", "application/json");
request.addHeader("Authorization", "OAuth " + accessToken);
request.addHeader("X-PrettyPrint", "1");
HttpResponse response = httpclient.execute(request);
int statusCode = response.getStatusLine().getStatusCode();
if (statusCode < 200 || statusCode >= 300) {
throw new WebRequestBadStatusException(statusCode);
}
HttpEntity entity = response.getEntity();
if (entity != null) {
return new JSONObject(EntityUtils.toString(entity));
} else {
return null;
}
} finally {
httpclient.getConnectionManager().shutdown();
}
}
Видите, куда я бросаю исключение? То, что я хотел бы сделать, это высосать содержимое, и поместить его в исключение.