liwg0 2014-03-26
Lisp 是一种编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况。Clojure 是一种运行在 Java™ 平台上的 Lisp 方言,它的出现彻底改变了这一现状。如今,在任何具备 Java 虚拟机的地方,您都可以利用 Lisp 的强大功能。
作为当今最主流的运算平台JVM,把函数式编程语言引入JVM也是很多人尝试的方向,Clojure就是其中之一。Clojure是一个在JVM平台运行的动态函数式编程语言,其语法接近于LISP语言,在JVM平台运行的时候,会被编译为JVM的字节码进行运算。
Clojure保持了函数式语言的主要特点,例如immutable state,Full Lisp-style macro support,persistent data structures等等,并且还能够非常方便的调用Java类库的API,和Java类库进行良好的整合。
Clojure 1.6 正式版发布,下载地址:http://clojure.org/downloads
此版本更新内容如下:
1 兼容性和依赖关系
Clojure now builds with Java SE 1.6 and emits bytecode requiring Java SE 1.6 instead of Java SE 1.5. [CLJ-1268]
The embedded version of the ASM bytecode library has been upgraded to ASM 4.1. [CLJ-713]
The following features are no longer marked Alpha in Clojure:
Watches - add-watch, remove-watch
Transients - transient, persistent!, conj!, assoc!, dissoc!, pop!, disj!
Exception data - ex-info, ex-data
Promises - promise, deliver
Records - defrecord
Types - deftype
Pretty-print tables - print-table
2.2 Map destructuring extended to support namespaced keys
2.3 New "some" operations
2.4 Hashing
Related tickets for dev and regressions:
CLJ-1328Make several Clojure tests independent of ordering
CLJ-1331Update primitive vectors to use Murmur3 hash
CLJ-1335Update hash for empty PersistentList and LazySeq
CLJ-1336Make hashing mixing functions available in Clojure
CLJ-1338Make Murmur3 class public
CLJ-1344Update mapHasheq to call Murmur3 algorithm
CLJ-1348Add hash-ordered-coll and hash-unordered-coll
CLJ-1355Restore cached hashCode for Symbol and (uncached) hashCode for Keyword
CLJ-1365Add type hints for new collection hash functions
CLJ-827 - unsigned-bit-shift-right
2.6 clojure.test
CLJ-908Print metadata for functions when print-meta is true and remove errant space at beginning.
CLJ-937pprint cl-format now supports E, F, and G formats for ratios.
CLJ-1248Include type information in reflection warning messages
CLJ-1099If non-seq passed where seq is needed, error message now is an ExceptionInfo with the instance value, retrievable via ex-data.
CLJ-1083Fix error message reporting for "munged" function names (like a->b).
CLJ-1056Handle more cases and improve error message for errors in defprotocol definitions.
CLJ-1102Better handling of exceptions with empty stack traces.
CLJ-939Exceptions thrown in the top level ns form are reported without file or line number.
CLJ-1164Fix typos in clojure.instant/validated and other internal instant functions.
CLJ-1143Correct doc string for ns macro.
CLJ-196Clarify value of file is undefined in the REPL.
CLJ-1228Fix a number of spelling errors in namespace and doc strings.
CLJ-835Update defmulti doc to clarify expectations for hierarchy argument.
CLJ-1304Fix minor typos in documentation and comments
CLJ-1302Mention that keys and vals order are consistent with seq order
CLJ-858Improve speed of STM by removing System.currentTimeMillis.
CLJ-669clojure.java.io/do-copy: use java.nio for Files
commitReduce overhead of protocol callsites by removing unneeded generated cache fields.
CLJ-908Make default-data-reader-fn set!-able in REPL, similar to data-readers.
CLJ-783Make clojure.inspector/inspect-tree work on sets.
CLJ-896Make browse-url aware of xdg-open.
CLJ-1160Fix clojure.core.reducers/mapcat does not stop on reduced? values.
CLJ-1121-> and ->> have been rewritten to work with a broader set of macros.
CLJ-1105clojure.walk now supports records.
CLJ-949Removed all unnecessary cases of sneakyThrow.
CLJ-1238Allow EdnReader to read foo// (matches LispReader behavior).
CLJ-1264Remove uses of _ as a var in the Java code (causes warning in Java 8).
CLJ-394Add record? predicate.
CLJ-1200ArraySeq dead code cleanup, ArraySeq_short support added.
CLJ-1331Primitive vectors should implement hasheq and use new hash algorithm
CLJ-1354Make APersistentVector.SubVector public so other collections can access
CLJ-1353Make awt run headless during the build process
CLJ-1018Make range consistently return infinite sequence of start with a step of 0.
CLJ-863Make interleave return () on 0 args and identity on 1 args.
CLJ-1072Update internal usages of the old metadata reader syntax to new syntax.
CLJ-1193Make bigint and biginteger functions work on double values outside long range.
CLJ-1154Make Compile.java flush but not close stdout so errors can be reported.
CLJ-1161Remove bad version.properties from sources jar.
CLJ-1175Fix invalid behavior of Delay/deref if an exception is thrown - exception will now be rethrown on subsequent calls and not enter a corrupted state.
CLJ-1171Fix several issues with instance? to make it consistent when used with apply.
CLJ-1202Protocol fns with dashes may get incorrectly compiled into field accesses.
CLJ-850Add check to emit invokePrim with return type of double or long if type-hinted.
CLJ-1177clojure.java.io URL to File coercion corrupts path containing UTF-8 characters.
CLJ-1234Accept whitespace in Record and Type reader forms (similar to data literals).
CLJ-1233Allow ** as a valid symbol name without triggering dynamic warnings.
CLJ-1246Add support to clojure.reflect for classes with annotations.
CLJ-1184Evaling #{do ...} or [do ...] is treated as do special form.
CLJ-1090Indirect function calls through Var instances fail to clear locals.
CLJ-1076pprint tests fail on Windows, expecting \n.
CLJ-766Make into-array work consistently with short-array and byte-array on bigger types.
CLJ-1285Data structure invariants are violated after persistent operations when collision node created by transients.
CLJ-1222Multiplication overflow issues around Long/MIN_VALUE
CLJ-1118Inconsistent numeric comparison semantics between BigDecimals and other numerics
CLJ-1125Clojure can leak memory in a servlet container when using dynamic bindings or STM transactions.
CLJ-1082Subvecs of primitve vectors cannot be reduced
CLJ-1301Case expressions use a mixture of hashCode and hasheq, potentially leading to missed case matches when these differ.
CLJ-983proxy-super does not restore original binding if call throws exception
CLJ-1176clojure.repl/source errors when read-eval bound to :unknown
CLJ-935clojure.string/trim uses different definition of whitespace than triml and trimr
CLJ-1058StackOverflowError on exception in reducef for PersistentHashMap fold
CLJ-1328Fix some tests in the Clojure test suite to make their names unique and independent of hashing order
CLJ-1339Empty primitive vectors throw NPE on .equals with non-vector sequential types
CLJ-1363Field access via .- in reflective case does not work
CLJ-944Compiler gives constant collections types which mismatch their runtime values