我有一个替代函数,它将接受一个表达式,例如(or false x y)
和一个绑定映射,例如'{x false, y true}
,并将返回带有适当替代的列表。结果在l
中并显示。如何将l
传递给另一个函数来执行其他处理?我要传递给的函数的定义如下:
(defn f [expression]
)
我尝试在调用l
时将f
作为参数传递,但是出现以下错误:
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)))
我的新函数完全按照我期望的方式工作,用未评估的列表调用它,但是当我传递未评估的列表时却无法实现。
答案 0 :(得分:1)
首先尝试使用传递列表的基本方法作为该函数的参数。您可以参考下面的示例
(defn passlist [a]
(println a))
(passlist '(1 2 3))
输出将:
#'user/passlist
(1 2 3)
答案 1 :(得分:1)
CreateArticlePage.article_related_content(driver).sendKeys("Google Kills Wave", Keys.DOWN);
CreateArticlePage.related_content_list(driver).click();
//CreateArticlePage.article_related_content(driver).sendKeys(Keys.ENTER);
WebDriverWait wait = new WebDriverWait(driver, 15);
的工作是填写模板表格并将其返回。如果您尝试使deep-substitute
也负责进行转换的下一步,则问题将变得更加棘手。也许让它返回值,然后在返回值之后将该值传递给另一个转换函数。
这是一个带注释的工作示例:
deep-substitute
然后在您的示例中对其进行测试:
user> (defn deep-substitute [m l]
(map (fn [i]
(if (seq? i) ;; if this is a sequence,
(deep-substitute m i) ;; finish the sequence and include the result here
(get m i i))) ;; otherwise get the new value from the map, if found
l)) ;; if it's not found, us the value unchanged.
#'user/deep-substitute
以及更多嵌套的示例:
user> (deep-substitute '{x false, y true} '(or false x y))
(or false false true)
下一步通常是将其包装在宏中,以便它可以在评估表单之前修改表单,然后评估新创建的表单以找出其值:
user> (deep-substitute '{x false, y true} '(or false (and x (or y x)) y))
(or false (and false (or true false)) true)
并测试
user> (defmacro dsub [m l]
(deep-substitute m l))
#'user/dsub
或通过嵌套将结果形式(未评估)传递给另一个函数:
user> (dsub {x false, y true} (or false (and x (or y x)) y))
true
user> (dsub {x false, y true} (or false x))
false
一种常见的模式是使用线程宏user> (defn f [expression]
(reverse expression))
#'user/f
user> (f (deep-substitute '{x false, y true} '(or false (and x (or y x)) y)))
(true (and false (or true false)) false or)
->
等将结果从transform传递到transform,直到通过组成许多简单的操作获得最终结果为止:
->>