【发布时间】:2018-09-30 17:52:46
【问题描述】:
我有一个替换函数,它将接受诸如(or false x y) 之类的表达式和诸如'{x false, y true} 之类的绑定映射,并将返回带有适当替换的列表。结果在l 中并显示出来。我如何将l 传递给另一个函数以进行其他处理?我要传递给的函数的定义如下所示:
(defn f [expression]
)
我尝试在调用f 时将l 作为参数传递,但出现以下错误:
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Symbol clojure.lang.RT.seqFrom (RT.java:550)
这是我的替代函数:
(defn deep-substitute [m l]
(map (fn [i]
(if (seq? i)
(deep-substitute m i)
(m i i)))
l
(f 'l)))
我的新函数在使用未评估列表调用它时完全按照我期望的方式工作,但当我将它传递给未评估列表时则不然。
【问题讨论】:
-
您可能想澄清“未评估列表,但当我将其传递给未评估列表时”的含义。我认为其中之一应该说“已评估”。此外,如果您想处理未评估的代码,您将需要使用宏,或显式引用代码以便将其视为列表。
-
那你为什么同时传递
mapl和(f 'l),但是只有映射函数有i参数? -
FWIW 你也可以使用
(clojure.walk/postwalk-replace '{x false y true} '(or false x y))来做到这一点。 -
你怎么称呼它?
(deep-substitute '{x false, y true} '(or false x y))?