GithubHelp home page GithubHelp logo

isabella232 / tools.reader Goto Github PK

View Code? Open in Web Editor NEW

This project forked from clojure/tools.reader

0.0 0.0 0.0 1.03 MB

Clojure reader in Clojure

License: Eclipse Public License 1.0

Clojure 94.87% HTML 5.13%

tools.reader's Introduction

clojure.tools.reader

A complete Clojure reader and an EDN-only reader, works with Clojure versions >= 1.4.0 and Clojurescript >=0.5308 and since version 0.10.0-alpha1

Rationale

clojure.tools.reader offers all functionality of the reader from clojure-1.9.0, and more.

For a list of additional features of the reader, read Differences from LispReader.java

Moreover, by using reader types from clojure.tools.reader.reader-types, if using an IndexingReader, column info is available and both line and column metadata is attached not only to lists, but to symbols, vectors and maps too, when additional debugging info is needed (note that the edn reader doesn't add any line/column metadata at all).

YourKit

YourKit has given an open source license for their profiler, greatly simplifying the profiling of tools.reader performance.

YourKit is kindly supporting open source projects with its full-featured Java Profiler. YourKit, LLC is the creator of innovative and intelligent tools for profiling Java and .NET applications. Take a look at YourKit's leading software products:

Releases and Dependency Information

Latest stable release: 1.3.6

clj dependency information:

org.clojure/tools.reader {:mvn/version "1.3.6"}

Leiningen dependency information:

[org.clojure/tools.reader "1.3.6"]

Maven dependency information:

<dependency>
  <groupId>org.clojure</groupId>
  <artifactId>tools.reader</artifactId>
  <version>1.3.6</version>
</dependency>

Changelog

API Index

Developer Information

Example Usage

To read data structures, functions from clojure.tools.reader.edn should be used, since those are safe and don't allow any code execution at all.

Remember that when using read you need to use a reader that implements IPushbackReader such as string-push-back-reader.

Note that since no code-execution is permitted, reader literals are also disabled.

(require '[clojure.tools.reader.edn :as edn])
;=> nil
(edn/read-string "1")
;=> 1
(edn/read-string "#inst \"2010-11-12T13:14:15.666\"")
;=> #inst "2010-11-12T13:14:15.666-00:00"
(let [my-unknown (fn [tag val] {:unknown-tag tag :value val})]
   (edn/read-string {:default my-unknown} "#foo bar"))
;=> {:unknown-tag foo, :value bar}
(edn/read-string {:readers {'foo (constantly 1)}} "#foo bar")
;=> 1

To switch from using clojure.core/read-string to clojure.tools.reader.edn/read-string in your projects, put this in your namespace declaration:

(:refer-clojure :exclude [read read-string])
(:use [clojure.tools.reader.edn :only [read read-string]])

If (and only if) reading from a trusted source, and advanced features that need some level of code-execution during read are needed, functions from clojure.tools.reader should be used.

(require '[clojure.tools.reader :as r])
;=> nil
(r/read-string "1")
;=> 1
;; WARNING!
(r/read-string "#=(+ 1 2)")
;=> 3
(binding [r/*read-eval* false]
  (r/read-string "#=(+ 1 2)"))
=> ExceptionInfo #= not allowed when *read-eval* is false

To switch from using clojure.core/read-string to clojure.tools.reader/read-string in your projects, put this in your namespace declaration:

(:refer-clojure :exclude [read read-string *default-data-reader-fn* *read-eval* *data-readers*])
(:use [clojure.tools.reader :only [read read-string *default-data-reader-fn* *read-eval* *data-readers*]])

Reader types example usage:

(require '[clojure.tools.reader.reader-types :as t])
;=> nil
(def reader (t/string-push-back-reader "1"))
;=> #'user/reader
(t/read-char reader)
;=> \1
(t/unread reader \a)
;=> \a
(t/peek-char reader)
;=> \a
(t/read-char reader)
;=> \a
(t/read-char reader)
;=> nil

Note that the pushback buffer is of dimension 1 by default, and an exception will be thrown if trying to unread more chars than the pushback buffer dimension.

Every predefined reader type has an additional arity that allows to specify the pushback buffer dimension.

(def reader (t/string-push-back-reader "" 2))
;=> nil
(t/unread reader \a)
;=> \a
(t/unread reader \b)
;=> \b
(t/read-char reader)
;=> \b
(t/read-char reader)
;=> \a
(t/read-char reader)
;=> nil

Differences from LispReader.java

There are small differences from clojure.lang.LispReader:

  • read throws an ex-info for almost every exception, whereas clojure.lang.LispReader/read throws a ReaderException wrapping the causing exception.
  • read is capable of reading literal tags containing periods, fixing #CLJ-1100
  • clojure.tools.reader/read checks if clojure.tools.reader/*alias-map* is bound, if that's the case, aliases will be resolved by querying it (must be a map), otherwhise (ns-aliases *ns*) will be used
  • clojure.tools.reader/read adds additional line/column info to symbols, vectors and maps when possible
  • clojure.tools.reader.reader-types/read-line has an additional arity with which is possible to specify the reader to read from

License

Copyright © 2013-2018 Nicola Mometto, Rich Hickey & contributors.

Licensed under the EPL. (See the file epl.html.)

tools.reader's People

Contributors

alexcoventry avatar andrewmcveigh avatar arichiardi avatar aterweele avatar borkdude avatar bronsa avatar cichli avatar green-coder avatar ibdknox avatar jafingerhut avatar jumarko avatar matthewwest avatar mfikes avatar miner avatar puredanger avatar rarous avatar russolsen avatar seancorfield avatar slipset avatar swannodette avatar tomfaulhaber avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.