395 lines
27 KiB
HTML
395 lines
27 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> beowulf/interop.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns beowulf.interop
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 (:require [beowulf.cons-cell :refer [make-beowulf-list]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 [beowulf.host :refer [CAR CDR]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 [beowulf.oblist :refer [*options* NIL]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 [clojure.string :as s :refer [last-index-of lower-case split
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
006 upper-case]]))
|
|
</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 ;;;; INTEROP feature ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</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 (defn listify-qualified-name
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 "We need to be able to print something we can link to the particular Clojure
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 function `subr` in a form in which Lisp 1.5 is able to read it back in and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 relink it.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 This assumes `subr` is either
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 1. a string in the format `#'beowulf.io/SYSIN` or `beowulf.io/SYSIN`; or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 2. something which, when coerced to a string with `str`, will have such
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 a format."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 [subr]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
020 (make-beowulf-list
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
021 (map
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
022 #(symbol (upper-case %))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 9 forms covered">
|
|
023 (remove empty? (split (str subr) #"[#'./]")))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
024
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
025
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
026 (defn interpret-qualified-name
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
027 "For interoperation with Clojure, it will often be necessary to pass
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
028 qualified names that are not representable in Lisp 1.5. This function
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
029 takes a sequence in the form `(PART PART PART... NAME)` and returns
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
030 a symbol in the form `part.part.part/NAME`. This symbol will then be
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 tried in both that form and lower-cased. Names with hyphens or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 underscores cannot be represented with this scheme."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 ([l]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
034 (symbol
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
035 (let [n (s/join "."
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
036 (concat (map #(lower-case (str %)) (butlast l))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
037 (list (last l))))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
038 s (last-index-of n ".")]
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
039 (if s
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
040 (str (subs n 0 s) "/" (subs n (inc s)))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
041 n)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
042
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
043 (defn to-beowulf
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
044 "Return a beowulf-native representation of the Clojure object `o`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
045 Numbers and symbols are unaffected. Collections have to be converted;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
046 strings must be converted to symbols."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
047 [o]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
048 (cond
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
049 (coll? o) (make-beowulf-list o)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
050 (string? o) (symbol (s/upper-case o))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
051 :else o))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
052
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
053 (defn to-clojure
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
054 "If l is a `beowulf.cons_cell.ConsCell`, return a Clojure list having the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 same members in the same order."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 [l]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
057 (cond
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
058 (not (instance? beowulf.cons_cell.ConsCell l))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
059 l
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
060 (= (CDR l) NIL)
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
061 (list (to-clojure (CAR l)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
062 :else
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
063 (conj (to-clojure (CDR l)) (to-clojure (CAR l)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
064
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
065 (defn INTEROP
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
066 "Clojure (or other host environment) interoperation API. `fn-symbol` is expected
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
067 to be either
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
068
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
069 1. a symbol bound in the host environment to a function; or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
070 2. a sequence (list) of symbols forming a qualified path name bound to a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
071 function.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
072
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
073 Lower case characters cannot normally be represented in Lisp 1.5, so both the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
074 upper case and lower case variants of `fn-symbol` will be tried. If the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
075 function you're looking for has a mixed case name, that is not currently
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
076 accessible.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
077
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
078 `args` is expected to be a Lisp 1.5 list of arguments to be passed to that
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
079 function. Return value must be something acceptable to Lisp 1.5, so either
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
080 a symbol, a number, or a Lisp 1.5 list.
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
081
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
082 If `fn-symbol` is not found (even when cast to lower case), or is not a function,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
083 or the value returned cannot be represented in Lisp 1.5, an exception is thrown
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
084 with `:cause` bound to `:interop` and `:detail` set to a value representing the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
085 actual problem."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 [fn-symbol args]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
087 (if-not (:strict *options*)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
088 (let
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
089 [q-name (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
090 (seq? fn-symbol)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
091 (interpret-qualified-name fn-symbol)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
092 fn-symbol)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
093 l-name (symbol (s/lower-case q-name))
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 3 forms covered">
|
|
094 f (cond
|
|
</span><br/>
|
|
<span class="partial" title="1 out of 2 forms covered">
|
|
095 (try
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
096 (fn? (eval l-name))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
097 (catch java.lang.ClassNotFoundException _ nil)) l-name
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
098 (try
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
099 (fn? (eval q-name))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
100 (catch java.lang.ClassNotFoundException _ nil)) q-name
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
101 :else (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
102 (ex-info
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
103 (str "INTEROP: ungecnáwen þegnung `" fn-symbol "`")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
104 {:cause :interop
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
105 :detail :not-found
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
106 :name fn-symbol
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
107 :also-tried l-name})))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
108 args' (to-clojure args)]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 ;; (print (str "INTEROP: eahtiende `" (cons f args') "`"))
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
110 (flush)
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
111 (let [result (eval (conj args' f))] ;; this has the potential to blow up the world
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
112 ;; (println (str "; ágiefende `" result "`"))
|
|
</span><br/>
|
|
<span class="partial" title="4 out of 6 forms covered">
|
|
113 (cond
|
|
</span><br/>
|
|
<span class="partial" title="4 out of 5 forms covered">
|
|
114 (instance? beowulf.cons_cell.ConsCell result) result
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 6 forms covered">
|
|
115 (coll? result) (make-beowulf-list result)
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 4 forms covered">
|
|
116 (symbol? result) result
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
117 (string? result) (symbol result)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
118 (number? result) result
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
119 :else (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
120 (ex-info
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
121 (str "INTEROP: Ne can eahtiende `" result "` to Lisp 1.5.")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
122 {:cause :interop
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
123 :detail :not-representable
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
124 :result result})))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 1 forms covered">
|
|
125 (throw
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 2 forms covered">
|
|
126 (ex-info
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
127 (str "INTEROP ne āfand innan Lisp 1.5.")
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
128 {:cause :interop
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
129 :detail :strict}))))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|