diff --git a/project.clj b/project.clj index 7738a79..c547395 100644 --- a/project.clj +++ b/project.clj @@ -3,7 +3,7 @@ :url "http://example.com/FIXME" :license {:name "GPL-2.0-or-later" :url "https://www.eclipse.org/legal/epl-2.0/"} - :dependencies [[org.clojure/clojure "1.10.0"] + :dependencies [[org.clojure/clojure "1.8.0"] [org.clojure/math.numeric-tower "0.0.4"] [org.clojure/tools.trace "0.7.10"] [environ "1.1.0"] diff --git a/src/beowulf/read.clj b/src/beowulf/read.clj index da35d65..9a91807 100644 --- a/src/beowulf/read.clj +++ b/src/beowulf/read.clj @@ -26,7 +26,7 @@ fncall := fn-name lsqb args rsqb; lsqb := '['; rsqb := ']'; - defn := mexpr opt-space '=' opt-space mexpr; + defn := mexpr opt-space <'='> opt-space mexpr; cond := lsqb (cond-clause semi-colon opt-space)* cond-clause rsqb; cond-clause := expr opt-space arrow opt-space expr; arrow := '->'; @@ -81,7 +81,7 @@ (case (first p) (:arg :expr :coefficient :fn-name :number :sexpr) (simplify (second p) context) (:λexpr - :args :bindings :body :cond :cond-clause :dot-terminal + :args :bindings :body :cond :cond-clause :defn :dot-terminal :fncall :octal :quoted-expr :scientific) (map #(simplify % context) p) (:arrow :dot :e :lpar :lsqb :opt-space :q :quote :rpar :rsqb :semi-colon :sep :space) nil @@ -195,6 +195,17 @@ (generate (second p)) (generate (nth p 2))))) +(defn gen-defn + [p] + (make-beowulf-list + (list + 'LABEL + (generate (second (second p))) + (make-beowulf-list + (list + 'LAMBDA + (generate (nth (second p) 2)) + (doall (map generate (rest (rest p))))))))) (defn gen-dot-terminated-list "Generate a list, which may be dot-terminated, from this partial parse tree @@ -247,6 +258,7 @@ :body (make-beowulf-list (map generate (rest p))) :cond (gen-cond p) (:decimal :integer) (read-string (strip-leading-zeros (second p))) + :defn (gen-defn p) :dotted-pair (make-cons-cell (generate (nth p 1)) (generate (nth p 2))) diff --git a/test/beowulf/mexpr_test.clj b/test/beowulf/mexpr_test.clj index 3500875..51c062e 100644 --- a/test/beowulf/mexpr_test.clj +++ b/test/beowulf/mexpr_test.clj @@ -64,3 +64,4 @@ (parse "label[ff;λ[[x];[atom[x]->x; T->ff[car[x]]]]]"))))] (is (= actual expected))))) +;; (parse "equal[x;y] = [atom[x]->[atom[y]->eq[x;y]; T->F]; equal[car[x]; car[y]]->equal[cdr[x];cdr[y]];T->F]")