24 lines
622 B
Clojure
24 lines
622 B
Clojure
(defrecord Node [prev next data])
|
|
|
|
(defn new-node [prev next data]
|
|
(Node. (ref prev) (ref next) data))
|
|
|
|
(defn new-list [head tail]
|
|
(List. (ref head) (ref tail)))
|
|
|
|
(defn insert-between [node1 node2 new-node]
|
|
(dosync
|
|
(ref-set (:next node1) new-node)
|
|
(ref-set (:prev new-node) node1)
|
|
(ref-set (:next new-node) node2)
|
|
(ref-set (:prev node2) new-node)))
|
|
|
|
(set! *print-level* 1)
|
|
|
|
;; warning: depending on the value of *print-level*
|
|
;; this could cause a stack overflow when printing
|
|
|
|
(let [h (new-node nil nil :A)
|
|
t (new-node nil nil :B)]
|
|
(insert-between h t (new-node nil nil :C))
|
|
(new-list h t))
|