-
-
Notifications
You must be signed in to change notification settings - Fork 68
/
repl.clj
65 lines (61 loc) · 2.6 KB
/
repl.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
;
; Copyright © 2017 Colin Smith.
; This work is based on the Scmutils system of MIT/GNU Scheme:
; Copyright © 2002 Massachusetts Institute of Technology
;
; This is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 3 of the License, or (at
; your option) any later version.
;
; This software is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
; General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this code; if not, see <http://www.gnu.org/licenses/>.
;
(ns sicmutils.repl
(:refer-clojure :exclude [+ - * / zero? ref partial])
(:require [clojure.main :as main]
[clojure.tools.nrepl.transport]
[clojure.tools.nrepl.middleware :as mw]
[clojure.tools.nrepl.middleware.pr-values :refer [pr-values]]
[sicmutils
[env :refer :all]
[simplify :as simp]])
(:import [clojure.tools.nrepl.transport Transport])
(:gen-class))
(defn math-printer
"NRepl middleware to apply the simplifier and prettyprinter to print
values. See the documentation for the pr-values default middleware to
see how this is done by updating :value in a response object and
setting :printed-value."
[h]
(fn [{:keys [^Transport transport] :as msg}]
(h (assoc msg
:transport (reify Transport
(recv [_] (.recv transport))
(recv [_ timeout] (.recv transport timeout))
(send [this response]
(.send transport
(if-let [v (:value response)]
(assoc response
:value (simp/expression->string v)
:printed-value true)
response))
this))))))
;; Interpose our middleware between evaluation and printing.
(mw/set-descriptor! #'math-printer
{:requires #{#'pr-values}
:expects #{"eval"}
:handles {}})
(defn -main
"A simple main that runs Clojure's internal REPL in the math environment."
[& _]
(println "Won't you sign in, stranger?")
(main/with-bindings
(in-ns 'sicmutils.env)
(main/repl :print simp/print-expression)
(println "Home at last.")))