【问题标题】:in clojure why isn't x identified if defined as [x] argument and then referenced as x? in code block?在clojure中,如果定义为[x]参数然后引用为x,为什么不识别x?在代码块中?
【发布时间】:2014-11-04 14:30:23
【问题描述】:
(defn boolean [x]
  (if (x? nil or false)
    (false)
    (true)))

我明白了

无法解析符号:x?在这种情况下

x 是函数的参数,我只是引用它,我错过了什么?

【问题讨论】:

  • 为什么你认为xx??而(x? nil or false) 语法无效
  • 请注意,falsenil 在 Clojure 中都被视为 false。其他所有内容都被视为true 值。您无需将其转换为布尔值,因此您的函数可能是多余的。例如。 (or nil false 12) ; => 12 (a true value)

标签: clojure lisp


【解决方案1】:

因为 x 和 x?是两个不同的名字。你的函数可以简单地写成

(defn boolean [x]
  (if x true false))

【讨论】:

    【解决方案2】:

    在 clojure 中 x? 是符号的名称,而不是符号 x 和运算符 ?。编译器告诉您您没有定义任何名为 x? 的变量或绑定。

    此外,(false)(true) 将布尔值作为函数调用。这将引发运行时错误。请改用falsetrue

    【讨论】:

      【解决方案3】:

      我不确定您的问题是什么(您从未定义过x?),但您可以像这样在 Clojure 中实现它

      (defn boolean [x]
        (not
          (or 
            (nil? x) 
            (false? x))))
      
      (boolean 1)
      #=> true
      (boolean nil)
      #=> false
      (boolean false)
      #=> false
      (boolean [])
      #=> true
      

      或者更隐式的解决方案

      (defn boolean [x]
        (if x
          true
          false))
      

      或者你的方法:

      (defn boolean [x]
        (if (or (nil? x) (false? x))
          false
          true))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-06
        • 2015-05-07
        • 2012-10-19
        • 2021-05-03
        • 2020-06-26
        • 2019-05-03
        • 2011-01-18
        • 1970-01-01
        相关资源
        最近更新 更多