Clojure - обрабатывать элементы списка как параметры функции - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь сделать что-то похожее на Python func(*lst), но с Clojure и без использования функции apply. Мой по общему признанию глупый случай использования:

{:k1 v1 (cond exp '(:k2 v2) :else '(:k3 v3))}

Так что, если exp был истинным, dict содержал бы {:k1 v1 :k2 v2}, иначе {:k1 v1 :k3 v3}. Я в основном хочу, чтобы Python-esque * применялся к возвращаемому значению cond. Я пытался поиграться с режимами данных / кода с помощью ', `и ~, но не нашел решения. Я могу повторить cond для отдельных параметров для базового hash-map, но этот тип побеждает точку.

Почему? Я просто думаю, что было бы здорово, если бы Clojure мог сделать это легко. :)

1 Ответ

8 голосов
/ 19 августа 2011

Нет.Одна форма может быть только одной формой: она не может волшебным образом быть двумя из них.Если бы это было возможно, все вещи сломались бы.

В вашем конкретном примере простой ответ:

(apply hash-map :k1 v1 
                (cond exp   '(:k2 v2)
                      :else '(:k3 v3))

Единственный способ сделать это - применить, что превращает один функциональный параметр в ноль или более функциональные параметры путем расширения их в виде списка.Он не может работать на уровне исходного кода для использования в таких вещах, как хеш-литерал.

Редактировать: Я не знаю много Python, но я почти уверен, что Python тоже не может этого сделать.Вы можете разделить вещи на вызовы функций, но не прямо на источник.Вы не можете написать

test_expr = ((x == 2), return x)
if *test_expr

или что-то подобное - это просто невозможно, потому что компилятор должен проанализировать if, прежде чем он сможет понять, что делать с test_expr.Аналогично в Clojure, компилятор должен проанализировать хеш-литерал, прежде чем он сможет понять, что делать с объектами внутри - он не может знать, что вы каким-то образом «хотите» их расширить в выражение карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...