我有一个来自我正在阅读的文件的传入惰性流线,tail-seq(对contrib - now!),我想要一个接一个地处理这些行,带有几个“监听函数”行动取决于行中的重新seq-hit(或其他事物)。一个参数,许多函数
我试过如下:
(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)
有咬我肯定lazyiness或第一类函数,但我在哪里放应用?
我也对这个问题采取了截然不同的方法,但这似乎是一个相当理智的方式。现在,宏/多方法似乎是过度/错误的。
这是非常优雅的,也给了我更深入的见解Clojure(就像上面的答案)。谢谢你,亚历克斯! – claj
@claj你很善良。如果您想进一步提高抽象级别,请进行一些小改动,并将第二个参数设置为监听器本身是一个用logstr调用的函数。这使基于输入匹配的不同动作成为可能。那时我们基本上已经改造了一种多方法。作为第一类实体的函数可以实现非常强大的抽象! –