Clojure: возвращение вектора из анонимной функции - PullRequest
21 голосов
/ 07 февраля 2011

Я написал небольшую анонимную функцию, которая будет использоваться с вызовом map. Функция возвращает вектор, содержащий имя столбца и значение столбца из запроса набора результатов SQL.

Вот функция (вход является именем столбца):

(fn [name] [(keyword name) (.getObject resultset name)])

Это работает нормально, однако, когда я попытался использовать «упрощенную» версию анонимной функции, я получил ошибку:

#([(keyword %) (.getObject resultset %)])

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector

Вот map звонок:

(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names))

Можно ли использовать упрощенный синтаксис для этой функции? Если да, то как?

Спасибо.

Ответы [ 3 ]

24 голосов
/ 07 февраля 2011

Ваша проблема в том, что простой синтаксис пытается оценить вектор как вызов функции.

Вы можете вставить функцию «identity», чтобы она работала, так как это простая функция, которая будет возвращать вектор без изменений:

#(identity [(keyword %) (.getObject resultset %)])
23 голосов
/ 07 февраля 2011

Для этого нужно использовать функцию vector :

#(vector (keyword %) (.getObject resultset %))

PS Есть также функции для карт, наборов и т. Д.

4 голосов
/ 07 февраля 2011

Да, Clojure должен действительно поддерживать конструкцию # [...], только для этого случая.

Я бы порекомендовал следующее как лучшую альтернативу:

#(vector (keyword %) (.getObject resultset %))
...