Подтвердить что ты не робот

Clojure: возврат вектора из анонимной функции

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

Вот функция (input - имя столбца):

(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))

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Для этого вам необходимо использовать вектор:

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

P.S. существуют также функции для карт, множеств и т.д.

Ответ 3

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

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

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