Clojure 单链表(插入[list elt])函数

Clojure 单链表(插入[list elt])函数,clojure,insert,singly-linked-list,Clojure,Insert,Singly Linked List,如果我找不到这个虫子,我就要发疯了。我实现了一个单链接列表的版本: (ns clojure_fun.core) (defprotocol MConsP (elt [this] "returns elt") (cdr [this] "returns cdr") (set-elt! [this val] "set elt") (set-cdr! [this val] "set cdr") ) (deftype MCons [^{:unsynchronized-mutable t

如果我找不到这个虫子,我就要发疯了。我实现了一个单链接列表的版本:

(ns clojure_fun.core)
(defprotocol MConsP
  (elt [this] "returns elt")
  (cdr [this] "returns cdr")
  (set-elt! [this val] "set elt")
  (set-cdr! [this val] "set cdr")
  )

(deftype MCons [^{:unsynchronized-mutable true} elt
                ^{:unsynchronized-mutable true} cdr]
  MConsP
  (elt [this] elt)
  (cdr [this] cdr)
  (set-elt! [this val] (set! elt val))
  (set-cdr! [this val] (set! cdr val))
  )

(defn mcons [a b] (MCons. a b))
(defn mlist [& xx]
  (if (empty? xx) nil
      (mcons (first xx) (apply mlist (rest xx))))
  )

(defn insert [xx elt]
  (cond (nil? xx) (mcons elt nil)
        (< elt (-> xx cdr elt))
              (set-cdr! xx (mcons elt (cdr xx)))
        :else (insert (cdr xx) elt))
  )

(def x (mlist 1 3 4 5 6))
(insert x 2)
我已经很久没有被难倒了。可能是因为我只是在学Clojure


提前谢谢

问题在于:

(< elt (-> xx cdr elt))
xx-cdr-elt))
在您的本地作用域中,
elt
是一个很长的函数,您正在尝试将
elt
函数(现在被本地隐藏)应用于
(cdr xx)
。只需将
elt
参数重命名为其他参数即可

(< elt (-> xx cdr elt))