Один аргумент, много функций

У меня есть входящий ленивый поток строк из файла, который я читаю с 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-

Есть ли способ получить значение String для объекта, если EntityUtils.toString () возвращает исключение? Я продолжаю сталкиваться с этой ситуацией, когда я получаю плохой отклик HTTP (например, 400), но не могу посмотреть на этот объект в этом ответе Когда я переступаю с отладчиком, я вижу...

Я продолжаю сталкиваться с этой ситуацией, когда я получаю неверный отклик 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();
    }
}

Видите, куда я бросаю исключение? То, что я хотел бы сделать, это высосать содержимое, и поместить его в исключение.

17
задан skaffman 18 May 2012 в 18:49
поделиться