Нет.Одна форма может быть только одной формой: она не может волшебным образом быть двумя из них.Если бы это было возможно, все вещи сломались бы.
В вашем конкретном примере простой ответ:
(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, компилятор должен проанализировать хеш-литерал, прежде чем он сможет понять, что делать с объектами внутри - он не может знать, что вы каким-то образом «хотите» их расширить в выражение карты.