小编Nie*_*lsK的帖子

标准版本或惯用法(fn [f&args](apply f args))

我经常发现自己想要在几个参数集合上应用函数集合.使用地图和非常简单的功能很容易.

(map
  (fn invoke [f & args] (apply f args))
  [- + *]
  [1 2 3]
  [1 2 3]
  [1 2 3])

 (-1 6 27)
Run Code Online (Sandbox Code Playgroud)

搜索网络会出现很多定义类似功能的库,通常称为funcall或invoke.由于Clojure对可变函数的偏爱,我不禁想到应该已经有了这个函数的默认版本.

有没有,还是有其他惯用的方法来解决这样的情况?

编辑:

另一种形式可能是

(map
  (comp eval list)
  [- + *]
  [1 2 3]
  [1 2 3]
  [1 2 3])

 (-1 6 27)
Run Code Online (Sandbox Code Playgroud)

由于评估,这让我感到害怕.

clojure

12
推荐指数
3
解决办法
363
查看次数

在Clojure中实现Java通用接口

我正在尝试使用webdriver的webdriver-clj包装器在selenium2/webdriver项目中获取clojure .

但是,由于Web界面是大量编写脚本的,我需要有一个选项来等待脚本创建某些元素,而不是页面加载.

所以我试图在clojure中创建一个wait-for函数,使用WebDriverWait类来测试元素属性,最好使用webdriver/by-functions中的clojure语法.

然而,服务员类直到方法采用通用接口(com.google.common.base.Function)作为参数,并且由于我的Java知识几乎不存在,这对于我刚刚起步的clojure技能来说太过分了.

任何有clojure-java互操作技能的人,以及如何在clojure中实现以下java代码以便它与webdriver/by-syntax结合的想法?

Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
return new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(locator);
}
};}

// ...
driver.get("http://www.google.com");
WebDriverWait wait = new WebDriverWait(driver, /*seconds=*/3);
WebElement element =
wait.until(presenceOfElementLocated(By.name("q"))
Run Code Online (Sandbox Code Playgroud)

结果应该使这样的事情成为可能

(defn test []
  (let [driver (webdriver/new-driver :firefox)]
    (webdriver/get driver "http://127.0.0.1/")
    (webdriver/wait-for (webdriver/by-name "button"))
    ))
Run Code Online (Sandbox Code Playgroud)

java generics interface webdriver clojure

11
推荐指数
1
解决办法
3605
查看次数

Clojure方法缺失

有谁知道如何在Clojure中实现method_missing(àlaRuby)?例如

(defn method_missing [name & args]
     (foo name args))
Run Code Online (Sandbox Code Playgroud)

如果正确使用,它对DSL非常有用.

提前致谢!

ruby lisp java clojure

7
推荐指数
2
解决办法
571
查看次数

3
推荐指数
1
解决办法
452
查看次数