104 lines
2.6 KiB
Clojure
104 lines
2.6 KiB
Clojure
;; Copyright (c) Nicola Mometto, Rich Hickey & contributors.
|
|
;; The use and distribution terms for this software are covered by the
|
|
;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
|
;; which can be found in the file epl-v10.html at the root of this distribution.
|
|
;; By using this software in any fashion, you are agreeing to be bound by
|
|
;; the terms of this license.
|
|
;; You must not remove this notice, or any other, from this software.
|
|
|
|
(ns cljs.tools.reader.impl.utils
|
|
(:refer-clojure :exclude [char])
|
|
(:require
|
|
[clojure.string :as string]
|
|
[goog.string :as gstring]))
|
|
|
|
(defn char [x]
|
|
(when-not (nil? x)
|
|
(cljs.core/char x)))
|
|
|
|
(defn ^boolean ex-info? [ex]
|
|
(instance? cljs.core.ExceptionInfo ex))
|
|
|
|
(defrecord ReaderConditional [splicing? form])
|
|
|
|
(defn ^boolean reader-conditional?
|
|
"Return true if the value is the data representation of a reader conditional"
|
|
[value]
|
|
(instance? ReaderConditional value))
|
|
|
|
(defn reader-conditional
|
|
"Construct a data representation of a reader conditional.
|
|
If true, splicing? indicates read-cond-splicing."
|
|
[form splicing?]
|
|
(ReaderConditional. splicing? form))
|
|
|
|
(extend-protocol IPrintWithWriter
|
|
ReaderConditional
|
|
(-pr-writer [coll writer opts]
|
|
(-write writer (str "#?" (when (:splicing? coll) "@")))
|
|
(pr-writer (:form coll) writer opts)))
|
|
|
|
(def ws-rx #"[\s]")
|
|
|
|
(defn ^boolean whitespace?
|
|
"Checks whether a given character is whitespace"
|
|
[ch]
|
|
(when-not (nil? ch)
|
|
(if (identical? ch \,)
|
|
true
|
|
(.test ws-rx ch))))
|
|
|
|
(defn ^boolean numeric?
|
|
"Checks whether a given character is numeric"
|
|
[ch]
|
|
(when-not (nil? ch)
|
|
(gstring/isNumeric ch)))
|
|
|
|
(defn ^boolean newline?
|
|
"Checks whether the character is a newline"
|
|
[c]
|
|
(or (identical? \newline c)
|
|
(identical? "\n" c)
|
|
(nil? c)))
|
|
|
|
(defn desugar-meta
|
|
"Resolves syntactical sugar in metadata" ;; could be combined with some other desugar?
|
|
[f]
|
|
(cond
|
|
(keyword? f) {f true}
|
|
(symbol? f) {:tag f}
|
|
(string? f) {:tag f}
|
|
:else f))
|
|
|
|
(def last-id (atom 0))
|
|
|
|
(defn next-id
|
|
[]
|
|
(swap! last-id inc))
|
|
|
|
(defn namespace-keys [ns keys]
|
|
(for [key keys]
|
|
(if (or (symbol? key)
|
|
(keyword? key))
|
|
(let [[key-ns key-name] ((juxt namespace name) key)
|
|
->key (if (symbol? key) symbol keyword)]
|
|
(cond
|
|
(nil? key-ns)
|
|
(->key ns key-name)
|
|
|
|
(= "_" key-ns)
|
|
(->key key-name)
|
|
|
|
:else
|
|
key))
|
|
key)))
|
|
|
|
(defn second' [[a b]]
|
|
(when-not a b))
|
|
|
|
(defn char-code [ch base]
|
|
(let [code (js/parseInt ch base)]
|
|
(if (js/isNaN code)
|
|
-1
|
|
code)))
|