Is it possible to create circular references in Clojure?

前端 未结 2 862
你的背包
你的背包 2021-02-12 10:06

Ignoring native interop and transients, is it possible to create any data structures in Clojure that contain direct circular references ?

It would seem that immutable da

相关标签:
2条回答
  • 2021-02-12 10:50

    In Clojure most circular data structures will explicitely go through a ref type of some kind (eg atom).

    However you can create a circular sequence (it's somewhat an oxymoron):

    (let [a (atom nil)] (reset! a (lazy-seq (cons 1 @a))))
    

    And since Clojure 1.2 with deftype you can create other datatypes which can introduce circularity without using explicitely (from the usercode at least) any kind of ref type.

    0 讨论(0)
  • 2021-02-12 11:07

    You can create a circular reference very easily by putting some form of reference inside a data structure, then updating the reference to point back to the overall structure.

    A trivial example:

    (def a [(atom nil)])
    
    (reset! (first a) a)
    

    This will create a list with one element, which is an atom that points back at the list.

    0 讨论(0)
提交回复
热议问题