2012-01-01 37 views
2

调用以下什么是?元素以及如何测试它?

(def seq-counter (atom 0)) 


(defn tokenize-data [data] 
    (reduce 
     (fn [out-data-map token] 
      (if (seq? token) 
       (conj out-data-map {(keyword (str "DIRECTIVE_" (reset! seq-counter (inc @seq-counter))))token}) 
       (if-not (= token (first '(EQU))) 
        (conj out-data-map {(keyword (str "DATA_1")) token}) 
        (conj out-data-map {:START '(EQU)})))) 
     {} 
     data)) 

的输出调用

'(EQU (COLOR TABLE) ?) 

扭转产生

([:START (EQU)] [:DIRECTIVE_13 (COLOR TABLE)] [:DATA_1 ?]) 

我的问题是:什么是?作为一个价值,我如何比较它(除了下面的内容)?

我似乎无法测试,看看是否?有没有使用\ ?.

我所能做的就是比较它,并得到我想要的结果。

(= (last (nth (reverse (tokenize-data '(EQU (COLOR TABLE) ?))) 2)) (first '(?))) 

回答

3

您可以防止Clojure的通过只是把报价'在表达式中的前评估任何表情。所以'(?)引用一个列表?作为它的第一个元素,没有Clojure试图调用?函数,并且(first '(?))访问该列表中的?

要在?符号直接得到的,根本就'?,这将让你访问符号本身没有的Clojure试图返回的值(如果有的话)分配给?

user=> (= '? (first '(?))) 
true 
+0

感谢。我忘了'适用于列表元素以及列表本身。 – octopusgrabbus 2012-01-02 14:15:03

相关问题