【问题标题】:Why are these Clojure lists different?为什么这些 Clojure 列表不同?
【发布时间】:2013-02-23 06:21:47
【问题描述】:

我遇到了一些4Clojure 问题,并在我的一些代码中遇到了一些奇怪的行为。经过进一步调查,罪魁祸首似乎是使用了报价宏与列表功能。为什么这在下面的代码中很重要,为什么会产生不正确的结果?

user=> (= (class '(/ 1 2)) (class (list / 1 2)))
true
user=> (def a '(/ 1 2))
#'user/a
user=> (def b (list / 1 2))
#'user/b
user=> (class a)
clojure.lang.PersistentList
user=> (class b)
clojure.lang.PersistentList
user=> (apply (first a) (rest a))
2
user=> (apply (first b) (rest b))
1/2
user=> (class (first a))
clojure.lang.Symbol
user=> (class (first b))
clojure.core$_SLASH_

【问题讨论】:

    标签: clojure


    【解决方案1】:
    '(/ 1 2)
    

    类似于:

    (list '/ 1 2)
    

    当你不引用/时,你会得到它的值,这是内置的除法函数,而不是符号。

    【讨论】:

      【解决方案2】:

      不幸的是,您在表达式(apply (first a) (rest a)) 中使用了符号对象作为函数。符号对象在 map 中查找自身的值作为键:

      ('/ {'+ :plus '/ :slash '- :minus} :not-found)
      => :slash
      
      ('/ {'+ :plus '$ :dollar '- :minus} :not-found)
      => :not-found
      
      ('/ 1 :not-found)
      => :not-found
      
      ('/ 1 2)
      => 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-19
        • 1970-01-01
        • 2011-11-04
        • 2012-02-21
        • 2019-11-16
        • 1970-01-01
        相关资源
        最近更新 更多