522 lines
37 KiB
HTML
522 lines
37 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> beowulf/io.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns beowulf.io
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 "Non-standard extensions to Lisp 1.5 to read and write to the filesystem.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 Lisp 1.5 had only `READ`, which read one S-Expression at a time, and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 various forms of `PRIN*` functions, which printed to the line printer.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 There was also `PUNCH`, which wrote to a card punch. It does not seem
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 that there was any concept of an interactive terminal.
|
|
</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 See Appendix E, `OVERLORD - THE MONITOR`, and Appendix F, `LISP INPUT
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 AND OUTPUT`.
|
|
</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 For our purposes, to save the current state of the Lisp system it should
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 be sufficient to print the current contents of the oblist to file; and to
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 restore a previous state from file, to overwrite the contents of the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 oblist with data from that file.
|
|
</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 Hence functions SYSOUT and SYSIN, which do just that."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 (:require [beowulf.cons-cell :refer [make-beowulf-list make-cons-cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 pretty-print]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 [beowulf.host :refer [CADR CAR CDDR CDR]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 [beowulf.interop :refer [interpret-qualified-name
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 listify-qualified-name]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 [beowulf.oblist :refer [*options* NIL oblist]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 [beowulf.read :refer [READ]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
025 [clojure.java.io :refer [file resource]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
026 [clojure.string :refer [ends-with?]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 [java-time.api :refer [local-date local-date-time]]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
028
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 ;;; Copyright (C) 2022-2023 Simon Brooke
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 ;;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
034 ;;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
035 ;;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
036 ;;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
037 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
038 ;;; 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">
|
|
039 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
041 ;;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
042 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
043 ;;; 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">
|
|
044 ;;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
045 ;;; 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">
|
|
046 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
047 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
048
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
049 (def ^:constant default-sysout "lisp1.5.lsp")
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
050
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
051 (defn- full-path
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
052 [fp]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
053 (str
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
054 (if (:filepath *options*)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
055 (str (:filepath *options*) (java.io.File/separator))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 "")
|
|
</span><br/>
|
|
<span class="partial" title="12 out of 14 forms covered">
|
|
057 (if (and (string? fp)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
058 (> (count fp) 0)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
059 (not= fp "NIL"))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
060 fp
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
061 (str "Sysout-" (local-date)))
|
|
</span><br/>
|
|
<span class="partial" title="6 out of 7 forms covered">
|
|
062 (if (ends-with? fp ".lsp")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
063 ""
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
064 ".lsp")))
|
|
</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 ;; (find-var (symbol "beowulf.io/SYSIN"))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 ;; (@(resolve (symbol "beowulf.host/TIMES")) 2 2)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
068
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
069 (defn safely-wrap-subr
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 [entry]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
071 (cond (= entry NIL) NIL
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
072 (= (CAR entry) 'SUBR) (make-cons-cell
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
073 (CAR entry)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
074 (make-cons-cell
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
075 (listify-qualified-name (CADR entry))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
076 (CDDR entry)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
077 :else (make-cons-cell
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
078 (CAR entry) (safely-wrap-subr (CDR entry)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
079
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
080 (defn safely-wrap-subrs
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
081 [objects]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
082 (make-beowulf-list (map safely-wrap-subr objects)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
083
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
084 (defn SYSOUT
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
085 "Dump the current content of the object list to file. If no `filepath` is
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 specified, a file name will be constructed of the symbol `Sysout` and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
087 the current date. File paths will be considered relative to the filepath
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
088 set when starting Lisp.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
089
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
090 **NOTE THAT** this is an extension function, not available in strct mode."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
091 ([]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
092 (SYSOUT nil))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
093 ([filepath]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
094 (spit (full-path (str filepath))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 15 forms covered">
|
|
095 (with-out-str
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
096 (println (apply str (repeat 79 ";")))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
097 (println (format ";; Beowulf %s Sysout file generated at %s"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
098 (or (System/getProperty "beowulf.version") "")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
099 (local-date-time)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
100 (when (System/getenv "USER")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
101 (println (format ";; generated by %s" (System/getenv "USER"))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
102 (println (apply str (repeat 79 ";")))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
103 (println)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
104 (let [output (safely-wrap-subrs @oblist)]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
105 (pretty-print output)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
106 )))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
107
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
108 (defn resolve-subr
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 "If this oblist `entry` references a subroutine, attempt to fix up that
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
110 reference."
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 3 forms covered">
|
|
111 ([entry]
|
|
</span><br/>
|
|
<span class="partial" title="9 out of 12 forms covered">
|
|
112 (or (resolve-subr entry 'SUBR)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
113 (resolve-subr entry 'FSUBR)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
114 ([entry prop]
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
115 (cond (= entry NIL) NIL
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
116 (= (CAR entry) prop) (try
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
117 (make-cons-cell
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
118 (CAR entry)
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
119 (make-cons-cell
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
120 (interpret-qualified-name
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
121 (CADR entry))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
122 (CDDR entry)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
123 (catch Exception _
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
124 (print "Warnung: ne can āfinde "
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
125 (CADR entry))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
126 (CDDR entry)))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
127 :else (make-cons-cell
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
128 (CAR entry) (resolve-subr (CDR entry))))))
|
|
</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="1 out of 1 forms covered">
|
|
131 (defn- resolve-subroutines
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
132 "Attempt to fix up the references to subroutines (Clojure functions) among
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
133 these `objects`, being new content for the object list."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
134 [objects]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
135 (make-beowulf-list
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
136 (map
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
137 resolve-subr
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
138 objects)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
139
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
140 (defn SYSIN
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
141 "Read the contents of the file at this `filename` into the object list.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
142
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
143 If the file is not a valid Beowulf sysout file, this will probably
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
144 corrupt the system, you have been warned. File paths will be considered
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 relative to the filepath set when starting Lisp.
|
|
</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 It is intended that sysout files can be read both from resources within
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
148 the jar file, and from the file system. If a named file exists in both the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
149 file system and the resources, the file system will be preferred.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
150
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
151 **NOTE THAT** if the provided `filename` does not end with `.lsp` (which,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
152 if you're writing it from the Lisp REPL, it won't), the extension `.lsp`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
153 will be appended.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
154
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
155 **NOTE THAT** this is an extension function, not available in strct mode."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
156 ([]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 13 forms covered">
|
|
157 (SYSIN (or (:read *options*) (str "resources/" default-sysout))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
158 ([filename]
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
159 (let [fp (file (full-path (str filename)))
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
160 file (when (and (.exists fp) (.canRead fp)) fp)
|
|
</span><br/>
|
|
<span class="partial" title="4 out of 5 forms covered">
|
|
161 res (try (resource filename)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
162 (catch Throwable _ nil))
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
163 content (try (READ (slurp (or file res)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
164 (catch Throwable _
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
165 (throw (ex-info "Ne can ārǣde"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
166 {:context "SYSIN"
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
167 :filename filename
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
168 :filepath fp}))))]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
169 (swap! oblist
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 10 forms covered">
|
|
170 #(when (or % (seq content))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
171 (resolve-subroutines content))))))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|