477 lines
32 KiB
HTML
477 lines
32 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> beowulf/cons_cell.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns beowulf.cons-cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 "The fundamental cons cell on which all Lisp structures are built.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 Lisp 1.5 lists do not necessarily have a sequence as their CDR, so
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 cannot be implemented on top of Clojure lists.")
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
005
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
006 (def NIL
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 "The canonical empty list symbol."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
008 (symbol "NIL"))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
009
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
010 (def T
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 "The canonical true value."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
012 (symbol "T")) ;; true.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
013
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
014 (def F
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 "The canonical false value - different from `NIL`, which is not canonically
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 false in Lisp 1.5."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
017 (symbol "F")) ;; false as distinct from nil
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
018
|
|
</span><br/>
|
|
<span class="partial" title="5 out of 8 forms covered">
|
|
019 (deftype ConsCell [CAR CDR]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 clojure.lang.ISeq
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 (cons [this x] (ConsCell. x this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 (first [this] (.CAR this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 ;; next and more must return ISeq:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 ;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/ISeq.java
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
025 (more [this] (if
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
026 (seq? (.CDR this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 (.CDR this)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
028 clojure.lang.PersistentList/EMPTY))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 (next [this] (if
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 (seq? (.CDR this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 (.CDR this)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 nil ;; next returns nil when empty
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 ))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
034
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
035 clojure.lang.Seqable
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
036 (seq [this] this)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
037
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
038 ;; for some reason this marker protocol is needed otherwise compiler complains
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 ;; that `nth not supported on ConsCell`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 clojure.lang.Sequential
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
041
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
042 clojure.lang.IPersistentCollection
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 (count [this] (if
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
044 (coll? (.CDR this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
045 (inc (.count (.CDR this)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
046 1))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
047 (empty [this] false) ;; a cons cell is by definition not empty.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
048 (equiv [this other] (if
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 (seq? other)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
050 (and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 (if
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 (and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
053 (seq? (first this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
054 (seq? (first other)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 (.equiv (first this) (first other))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 (= (first this) (first other)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
057 (if
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
058 (and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
059 (seq? (rest this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
060 (seq? (rest other)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
061 (.equiv (rest this) (rest other))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 (= (rest this) (rest other))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
063 false)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
064
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
065 (defn- to-string
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066 "Printing ConsCells gave me a *lot* of trouble. This is an internal function
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 used by the print-method override (below) in order that the standard Clojure
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
068 `print` and `str` functions will print ConsCells correctly. The argument
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069 `cell` must, obviously, be an instance of `ConsCell`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 [cell]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
071 (loop [c cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
072 n 0
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
073 s "("]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
074 (if
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
075 (instance? beowulf.cons_cell.ConsCell c)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
076 (let [car (.CAR c)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
077 cdr (.CDR c)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
078 cons? (instance? beowulf.cons_cell.ConsCell cdr)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
079 ss (str
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
080 s
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
081 (to-string car)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
082 (cond
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
083 cons?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
084 " "
|
|
</span><br/>
|
|
<span class="partial" title="10 out of 11 forms covered">
|
|
085 (or (nil? cdr) (= cdr 'NIL))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 ")"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
087 :else
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
088 (str " . " (to-string cdr) ")")))]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
089 (if
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
090 cons?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
091 (recur cdr (inc n) ss)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
092 ss))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
093 (str c))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
094
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
095 (defn pretty-print
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
096 "This isn't the world's best pretty printer but it sort of works."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
097 ([^beowulf.cons_cell.ConsCell cell]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
098 (println (pretty-print cell 80 0)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
099 ([^beowulf.cons_cell.ConsCell cell width level]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
100 (loop [c cell
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
101 n (inc level)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
102 s "("]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
103 (if
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
104 (instance? beowulf.cons_cell.ConsCell c)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
105 (let [car (.CAR c)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
106 cdr (.CDR c)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
107 cons? (instance? beowulf.cons_cell.ConsCell cdr)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
108 print-width (count (print-str c))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
109 indent (apply str (repeat n " "))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
110 ss (str
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
111 s
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
112 (pretty-print car width n)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
113 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
114 cons?
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
115 (if
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
116 (< (+ (count indent) print-width) width)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
117 " "
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
118 (str "\n" indent))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
119 (or (nil? cdr) (= cdr 'NIL))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
120 ")"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
121 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
122 (str " . " (pretty-print cdr width n) ")")))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
123 (if
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
124 cons?
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
125 (recur cdr n ss)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
126 ss))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
127 (str c)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
128
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
129
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
130
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
131 (defmethod clojure.core/print-method
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
132 ;;; I have not worked out how to document defmethod without blowing up the world.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
133 beowulf.cons_cell.ConsCell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
134 [this writer]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
135 (.write writer (to-string this)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
136
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
137
|
|
</span><br/>
|
|
<span class="covered" title="17 out of 17 forms covered">
|
|
138 (defmacro make-cons-cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
139 "Construct a new instance of cons cell with this `car` and `cdr`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
140 [car cdr]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
141 `(ConsCell. ~car ~cdr))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
142
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
143 (defn make-beowulf-list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
144 "Construct a linked list of cons cells with the same content as the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 sequence `x`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
146 [x]
|
|
</span><br/>
|
|
<span class="partial" title="2 out of 3 forms covered">
|
|
147 (cond
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
148 (empty? x) NIL
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
149 (coll? x) (ConsCell.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
150 (if
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
151 (seq? (first x))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
152 (make-beowulf-list (first x))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
153 (first x))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
154 (make-beowulf-list (rest x)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
155 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
156 NIL))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|