Skip to content

Instantly share code, notes, and snippets.

@fredyr
Last active December 21, 2015 17:38
Show Gist options
  • Save fredyr/6341286 to your computer and use it in GitHub Desktop.
Save fredyr/6341286 to your computer and use it in GitHub Desktop.
Scheme's mcons in Clojure. (Feels kind of dirty to build a mutable data structure, but fun nonetheless)
;; http://docs.racket-lang.org/reference/mpairs.html
(defprotocol IMCons
(mcar [p])
(mcdr [p])
(set-mcar! [p val])
(set-mcdr! [p val]))
(deftype MCons [^{:volatile-mutable true} car ^{:volatile-mutable true} cdr]
IMCons
(mcar [this] car)
(mcdr [this] cdr)
(set-mcar! [this val]
(set! car val))
(set-mcdr! [this val]
(set! cdr val)))
(defn mcons [a b]
(MCons. a b))
(defn mcar [p] (.mcar p))
(defn mcdr [p] (.mcdr p))
(defn set-mcar! [p v] (.set-mcar! p v))
(defn set-mcdr! [p v] (.set-mcdr! p v))
;; Example
(def *m* (mcons 1 2))
(set-mcar! *m* 4)
(mcar *m*) ;; => 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment