无法将列表作为参数传递给函数

时间:2018-09-30 17:52:47

标签: list clojure arguments

我有一个替代函数,它将接受一个表达式,例如(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)))

我的新函数完全按照我期望的方式工作,用未评估的列表调用它,但是当我传递未评估的列表时却无法实现。

2 个答案:

答案 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,直到通过组成许多简单的操作获得最终结果为止:

->>