830 lines
55 KiB
HTML
830 lines
55 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, and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 must have both CAR and CDR mutable, so cannot be implemented on top
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 of Clojure lists."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 (:require [beowulf.oblist :refer [NIL]]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
007
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 ;;; Copyright (C) 2022-2023 Simon Brooke
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 ;;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 ;;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 ;;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 ;;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 ;;; This program is distributed in the hope that it will be useful,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 ;;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 ;;; You should have received a copy of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 ;;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 ;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
025 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
026 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
027
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
028 (declare cons-cell?)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
029
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
030 (def T
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 "The canonical true value."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
032 (symbol "T")) ;; true.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
033
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
034 (def F
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
035 "The canonical false value - different from `NIL`, which is not canonically
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
036 false in Lisp 1.5."
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
037 (symbol "F")) ;; false as distinct from nil
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
038
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 ;;;; The actual cons-cell ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
040
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
041 (defprotocol MutableSequence
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
042 "Like a sequence, but mutable."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 (rplaca
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
044 [this value]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
045 "replace the first element of this sequence with this value")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
046 (rplacd
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
047 [this value]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
048 "replace the rest (but-first; cdr) of this sequence with this value")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 (getCar
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
050 [this]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
051 "Return the first element of this sequence.")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 (getCdr
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
053 [this]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
054 "like `more`, q.v., but returns List `NIL` not Clojure `nil` when empty.")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 (getUid
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 [this]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
057 "Returns a unique identifier for this object"))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
058
|
|
</span><br/>
|
|
<span class="partial" title="5 out of 9 forms covered">
|
|
059 (deftype ConsCell [^:unsynchronized-mutable CAR ^:unsynchronized-mutable CDR uid]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
060 ;; Note that, because the CAR and CDR fields are unsynchronised mutable - i.e.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
061 ;; plain old Java instance variables which can be written as well as read -
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 ;; ConsCells are NOT thread safe. This does not matter, since Lisp 1.5 is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
063 ;; single threaded.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
064 MutableSequence
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
065
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066 (rplaca [this value]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
067 (if
|
|
</span><br/>
|
|
<span class="partial" title="10 out of 13 forms covered">
|
|
068 (or
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
069 (satisfies? MutableSequence value) ;; can't reference
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 ;; beowulf.cons_cell.ConsCell,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
071 ;; because it is not yet
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
072 ;; defined
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
073 (cons-cell? value)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
074 (number? value)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
075 (symbol? value))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
076 (do
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
077 (set! (. this CAR) value)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
078 this)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
079 (throw (ex-info
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
080 (str "Uncynlic miercels in RPLACA: `" value "` (" (type value) ")")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
081 {:cause :bad-value
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
082 :detail :rplaca}))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
083
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
084 (rplacd [this value]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
085 (if
|
|
</span><br/>
|
|
<span class="partial" title="10 out of 13 forms covered">
|
|
086 (or
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
087 (satisfies? MutableSequence value)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
088 (cons-cell? value)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
089 (number? value)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
090 (symbol? value))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
091 (do
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
092 (set! (. this CDR) value)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
093 this)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
094 (throw (ex-info
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
095 (str "Uncynlic miercels in RPLACD: `" value "` (" (type value) ")")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
096 {:cause :bad-value
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
097 :detail :rplaca}))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
098
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
099 (getCar [this]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
100 (. this CAR))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
101 (getCdr [this]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
102 (. this CDR))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
103 (getUid [this]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
104 (. this uid))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
105
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
106 clojure.lang.ISeq
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
107 (cons [this x] (ConsCell. x this (gensym "c")))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
108 (first [this] (.CAR this))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 ;; next and more must return ISeq:
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
110 ;; https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/ISeq.java
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
111 (more [this] (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
112 (seq? (.getCdr this))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
113 (.getCdr this)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
114 clojure.lang.PersistentList/EMPTY))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
115 (next [this] (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
116 (seq? (.getCdr this))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
117 (.getCdr this)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
118 nil ;; next returns nil when empty
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
119 ))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
120
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
121 clojure.lang.Seqable
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
122 (seq [this] this)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
123
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
124 ;; for some reason this marker protocol is needed otherwise compiler complains
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
125 ;; that `nth not supported on ConsCell`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
126 clojure.lang.Sequential
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
127
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
128 clojure.lang.IPersistentCollection
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
129 (empty [this] (= this NIL)) ;; a cons cell is by definition not empty.
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
130 (equiv [this other] (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
131 (seq? other)
|
|
</span><br/>
|
|
<span class="partial" title="4 out of 5 forms covered">
|
|
132 (and
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
133 (if
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
134 (and
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
135 (seq? (first this))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
136 (seq? (first other)))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
137 (.equiv (first this) (first other))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
138 (= (first this) (first other)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
139 (if
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
140 (and
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
141 (seq? (.getCdr this))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
142 (seq? (.getCdr other)))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
143 (.equiv (.getCdr this) (.getCdr other))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
144 (= (.getCdr this) (.getCdr other))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 false))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
146
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
147 clojure.lang.Counted
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
148 (count [this] (loop [cell this
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
149 result 1]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
150 (if
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 11 forms covered">
|
|
151 (and (coll? (.getCdr cell)) (not= NIL (.getCdr cell)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
152 (recur (.getCdr cell) (inc result))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
153 result)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
154
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
155 java.lang.Object
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
156 (toString [this]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
157 (str "("
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
158 (. this CAR)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
159 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 12 forms covered">
|
|
160 (instance? ConsCell (. this CDR)) (str " " (subs (.toString (. this CDR)) 1))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
161 (= NIL (. this CDR)) ")"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
162 :else (str " . " (. this CDR) ")")))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
163
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
164 ;;;; Printing. Here be dragons! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
165
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
166 (defn- to-string
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
167 "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">
|
|
168 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">
|
|
169 `print` and `str` functions will print ConsCells correctly. The argument
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
170 `cell` must, obviously, be an instance of `ConsCell`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
171 ;; TODO: I am deeply suspicious both of this and the defmethod which depends
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
172 ;; on it. I *think* they are implicated in the `COPY` bug. If the `toString`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
173 ;; override in `ConsCell` was right, neither of these would be necessary.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
174 ;; see https://github.com/simon-brooke/beowulf/issues/5
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
175 [cell]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
176 (loop [c cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
177 n 0
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
178 s "("]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
179 (if
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
180 (instance? beowulf.cons_cell.ConsCell c)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
181 (let [car (.first c)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
182 cdr (.getCdr c)
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 9 forms covered">
|
|
183 cons? (and
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
184 (instance? beowulf.cons_cell.ConsCell cdr)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
185 (not (nil? cdr))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
186 (not= cdr NIL))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
187 ss (str
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
188 s
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
189 (to-string car)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
190 (cond
|
|
</span><br/>
|
|
<span class="partial" title="9 out of 10 forms covered">
|
|
191 (or (nil? cdr) (= cdr NIL)) ")"
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
192 cons? " "
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
193 :else (str " . " (to-string cdr) ")")))]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
194 (if
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
195 cons?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
196 (recur cdr (inc n) ss)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
197 ss))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
198 (str c))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
199
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
200 (defmethod clojure.core/print-method
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
201 ;;; 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">
|
|
202 beowulf.cons_cell.ConsCell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
203 [this writer]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
204 (.write writer (to-string this)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
205
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
206 (defn pretty-print
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
207 "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">
|
|
208 ([cell]
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
209 (println (pretty-print cell 80 0)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
210 ([cell width level]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
211 (loop [c cell
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
212 n (inc level)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
213 s "("]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
214 (if
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
215 (instance? beowulf.cons_cell.ConsCell c)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
216 (let [car (.first c)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
217 cdr (.getCdr c)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
218 tail? (instance? beowulf.cons_cell.ConsCell cdr)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
219 print-width (count (print-str c))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
220 indent (apply str (repeat n " "))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
221 ss (str
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
222 s
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
223 (pretty-print car width n)
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 4 forms covered">
|
|
224 (cond
|
|
</span><br/>
|
|
<span class="partial" title="9 out of 10 forms covered">
|
|
225 (or (nil? cdr) (= cdr NIL))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
226 ")"
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
227 tail?
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
228 (if
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
229 (< (+ (count indent) print-width) width)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
230 " "
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
231 (str "\n" indent))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
232 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
233 (str " . " (pretty-print cdr width n) ")")))]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
234 (if
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
235 tail?
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
236 (recur cdr n ss)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
237 ss))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
238 (str c)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
239
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
240 (defn cons-cell?
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
241 "Is this object `o` a beowulf cons-cell?"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
242 [o]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
243 (instance? beowulf.cons_cell.ConsCell o))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
244
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
245 (defn make-cons-cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
246 "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">
|
|
247 [car cdr]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
248 (try
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
249 (ConsCell. car cdr (gensym "c"))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
250 (catch Exception any
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
251 (throw (ex-info "Ne meahte cræfte cons cell" {:car car
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
252 :cdr cdr} any)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
253
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
254 (defn make-beowulf-list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
255 "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">
|
|
256 sequence `x`."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
257 [x]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
258 (try
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 4 forms covered">
|
|
259 (cond
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
260 (empty? x) NIL
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
261 (instance? ConsCell x) (make-cons-cell (.getCar x) (.getCdr x))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
262 (coll? x) (ConsCell.
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
263 (if
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
264 (coll? (first x))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
265 (make-beowulf-list (first x))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
266 (first x))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
267 (make-beowulf-list (rest x))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
268 (gensym "c"))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
269 :else
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
270 NIL)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
271 (catch Exception any
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
272 (throw (ex-info "Ne meahte cræfte Beowulf líste"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
273 {:content x}
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
274 any)))))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|