diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..488c16c1c --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +pom.xml +*jar +/lib/ +/classes/ +.lein-failures +.lein-deps-sum diff --git a/README b/README new file mode 100644 index 000000000..d0b0214c9 --- /dev/null +++ b/README @@ -0,0 +1,13 @@ +# typed-clojure + +FIXME: write description + +## Usage + +FIXME: write + +## License + +Copyright (C) 2011 FIXME + +Distributed under the Eclipse Public License, the same as Clojure. diff --git a/project.clj b/project.clj new file mode 100644 index 000000000..b54997645 --- /dev/null +++ b/project.clj @@ -0,0 +1,3 @@ +(defproject typed-clojure "1.0.0-SNAPSHOT" + :description "FIXME: write description" + :dependencies [[org.clojure/clojure "1.2.1"]]) \ No newline at end of file diff --git a/src/typed_clojure/core.clj b/src/typed_clojure/core.clj new file mode 100644 index 000000000..a8b80f063 --- /dev/null +++ b/src/typed_clojure/core.clj @@ -0,0 +1,68 @@ +(ns typed-clojure.core) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Global type environment + +(defprotocol ITypeEnv + (extend-env! [this name type]) + (get-env [this])) + +(deftype TypeEnv [env] + ITypeEnv + (get-env [this] env) + (extend-env! [this name type] + (swap! env assoc name type))) + +(def the-env (TypeEnv. (atom {}))) + +(defn extend-env [name type] + (extend-env! the-env name type)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Type utilities + +(defn make-union [& types] + (vec types)) + +(defmacro defnt [name & body] + (extend-env name (-> (meta name) :-)) + `(defn ~name ~@body)) + +(defn type-declaration [name type] + (extend-env name type)) + +(defmacro make-type [name] + `(do + (deftype ~name []) + (new ~name))) + +(defmacro make-type-alias [name type] + `(make-type ~name)) + +(deftype Function [sig]) +(defn make-Function [& types] + (Function. types)) + +(deftype List [type]) +(defn make-Listof [sig] + (List. sig)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Primitive types + +;; TODO Work out proposition representation + +(make-type Any) +(make-type None) + +(type-declaration + (make-Function Number Number Number)) +(type-declaration - (make-Function Number Number Number)) + +;(make-pred-ty symbol? Symbol) + +(defnt ^{:- (make-Function Number Number)} + f + [x] + (if (number? x) + (+ x) + (- x))) diff --git a/test/typed_clojure/test/core.clj b/test/typed_clojure/test/core.clj new file mode 100644 index 000000000..3aa918f72 --- /dev/null +++ b/test/typed_clojure/test/core.clj @@ -0,0 +1,6 @@ +(ns typed-clojure.test.core + (:use [typed-clojure.core]) + (:use [clojure.test])) + +(deftest replace-me ;; FIXME: write + (is false "No tests have been written."))