Clojure:整数不能转换为IFn

jay*_*100 6 clojure

我得到可怕的*不能用这里简单的数学函数转换为IFn错误:

(defn calc [sc1 m1 alpha beta gamma ta1 tb1 min_m1 min_tca tca_ratio x32]
        (* 
           (max(0,
                (+
                 (* alpha log(sc1)) 
                 (* beta log(m1)) 
                 (* gamma (/ ta1 tb1)) 
                 (- log(ta1) log(tb1)))))  

           (max(x32,(/ m1 min_m1)))

           (max(x32,(/ tca_ratio min_tca)))))
Run Code Online (Sandbox Code Playgroud)

;;;;;;;;;;;;

args只是一堆数字:

(calc 1 2 3 4 5 1 2 3 4 5 1)
Run Code Online (Sandbox Code Playgroud)

我的想法/我的问题

通常,当我收到此错误时,我发现它是由于

1)一个额外的括号(即当我不小心在我的代码中添加一个额外的闭包)或

2)错误的论点(显然 - 一个演员例外).

我的问题很简单......如何解决这个片段,以及可选 - 我怎么能一劳永逸地打败这个常见的异常?它似乎经常在我的Clojure编码探险中出现,我想也许我还没有得到正确的开发风格.

-------------------------------------------------- -----

更新:

我用不规则的语法填充了我的代码.错误发生在内部函数中,它使用java/c样式函数调用:例如max/log ...

Joo*_*aat 14

在我看来,有问题的表达式是(x32,(/ m1 min_m1))和(x32,(/ tca_ratio min_tca))以及log(..)的表达式.

Clojure遵循标准的lisp约定,即将不带引号列表的第一个元素作为调用函数.换句话说,你想要(log ...)而不是log(...)和(max ...)而不是(max(...))

在您的特定样式中捕获这些错误非常简单:匹配"XXX"的所有内容,其中XXX是任意数量的非空格,非括号字符是错误.


Bri*_*ley 6

它看起来像你有log(sc1)等问题的电话.

应该看(假设log定义在某处)类似于:

(defn calc [sc1 m1 alpha beta gamma ta1 tb1 min_m1 min_tca tca_ratio x32]
    (* 
     (max 0
          (+
           (* alpha (log sc1)) 
           (* beta (log m1)) 
           (* gamma (/ ta1 tb1)) 
           (- (log ta1) (log tb1))))  

     (max x32 (/ m1 min_m1))
     (max x32 (/ tca_ratio min_tca))))
Run Code Online (Sandbox Code Playgroud)

如果您只想使用Java日志,请将其替换logMath/logjava.lang.Math中的静态日志函数