;; 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)))