|
|
|
|
|
by aphyr
85 days ago
|
|
You're right, that is longer! I get why though; `filter` is a clojure.core function name people don't necessarily feel comfortable shadowing, and the Clojure and Spark versions make it clear what's a symbol in local scope versus a field in the dataset. I don't think it'd be hard to make a little wrapper for this sort of thing though! Here's an example which turns any symbols not in local scope into field lookups on an implicit row variable. (require '[clojure.walk :refer [postwalk]])
(defmacro filter
[ds & anaphoric-pred]
(let [row-name (gensym 'row)
pred (postwalk (fn [form]
(if (and (symbol? form) (nil? (resolve form)))
`(get ~row-name ~(str form))
form))
anaphoric-pred)]
`(tc/select-rows ds (fn [~row-name] ~@pred))))
Now you can write (filter ds (> year 2008))
And it'll expand to the ts form: (pprint (macroexpand '(filter ds (> year 2008))))
=> (tc/select-rows ds (fn [row2411] (> (get row2411 "year") 2008)))
|
|