我得到可怕的*不能用这里简单的数学函数转换为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是任意数量的非空格,非括号字符是错误.
它看起来像你有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日志,请将其替换log为Math/logjava.lang.Math中的静态日志函数
| 归档时间: |
|
| 查看次数: |
2343 次 |
| 最近记录: |