condp
имеет встроенную функциональность для поддержки такого рода вещей:
(condp #(if (= %1 %2) %1) condition
"plet" :>> #(make-adj 2 "ète" %)
"iet" :>> #(make-adj 2 "ète" %)
"nin" :>> #(make-adj 1 "gne" %))
#(if (= %1 %2) %1)
- это двоичная функция, которая проверяет, равны ли ее аргументы, и возвращает первый аргумент, если они есть, или nil
в противном случае.
:>>
делает так, чтобы результат оценки предиката составлял condition
и, например, "plet"
передается в функцию #(make-adj ...)
. С указанным выше предикатом это означает, что если (= "plet" condition)
равно true
, то "plet"
передается #(make-adj ...)
. См. (doc condp)
для получения дополнительной информации.
Если вам все еще кажется, что вы слишком много печатаете, вы можете создать вспомогательную функцию:
(defn make-adj* [n s]
(fn [c] (make-adj n s c))
Тогда используйте это так:
(condp #(if (= %1 %2) %1) condition
"plet" :>> (make-adj* 2 "ète")
...)