I was just about to do that, Randall. :-)

clojure.contrib.repl-ln is a repl that supports lines and line  
numbers. Here's a session that demonstrates it.

--Steve

% java -cp clojure.jar:clojure-contrib.jar clojure.main -e "(use  
'clojure.contrib.repl-ln)" -e "(repl)"
1:1 user=> ; clojure.contrib.repl-ln provides a repl that supports  
lines and line numbers in the input stream
1:2 user=> ; every input line is counted. Every input line that's not  
within a clojure object generates a prompt
1:3 user=>
1:4 user=>
1:5 user=> ; even blank lines
1:6 user=> 1 2 3 ; multiple objects on one line are all printed, but  
only produce one prompt
1
2
3
1:7 user=> jkl ; exceptions show the repl name and line number where  
they happened
java.lang.Exception: Unable to resolve symbol: jkl in this context  
(repl-1:7)
1:8 user=> (/ 1 0)
java.lang.ArithmeticException: Divide by zero (repl-1:8)
1:9 user=> (defn greet [] "
hello"
)
#'user/greet
1:12 user=> (meta (var greet)) ; metadata for definitions include repl  
name and line number
{:file "repl-1", :line 9, :ns #<Namespace user>, :name  
greet, :arglists ([])}
1:13 user=> ; the repl name is configurable. It defaults to: "repl-%S"  
where %S is the repl serial number
1:14 user=> (repl) ; creating a new repl produces a nested repl with a  
new serial number
2:1 user=> ; and a fresh set of line numbers
2:2 user=> ; the default prompt is "%S:%L %N=> ", serial number, line  
number, and namespace name
2:3 user=> (in-ns 'cool)
#<Namespace cool>
2:4 cool=> ; quitting a repl pops namespace as well
2:5 cool=> ^D
nil
1:15 user=> (repl) ; creating a new repl produces a nested repl with a  
new serial number
3:1 user=> ; if the prompt is too busy for your taste, you can set it  
to something more familar:
3:2 user=> (set-repl-prompt "%N=> ")
nil
user=> (repl) ; nested repls inherit their name format and prompt  
format from their parent
user=> ; this one is serial number 4, but if it's not in the prompt,  
how can we know?
user=> (repl-info) ; repls have properties accessible this way
{:name "repl-4", :started #<Date Wed Dec 03 09:02:59 EST 2008>, :name- 
fmt "repl-%S", :prompt-fmt "%N=> ", :serial 4, :thread 1, :depth  
3, :line 2}
user=> (print-repl-info) ; or this way
Name:       repl-4
Started:    Wed Dec 03 09:02:59 EST 2008
Name-fmt:   "repl-%S"
Prompt-fmt: "%N=> "
Serial:     4
Thread:     1
Depth:      3
Line:       3
nil
user=> ; thread id and nesting level are also available for use in the  
prompt and repl name.
user=> ; a long running clojure could create many of them, say, over  
sockets.
user=> (set-repl-prompt "%S:%T:%D:%L %N=> ") ; a big ol' prompt
nil
4:1:3:7 user=>
4:1:3:8 user=>
4:1:3:9 user=>
4:1:3:10 user=> (set-repl-name "clojure-%S:%T:%D")
nil
4:1:3:11 user=> kjd
java.lang.Exception: Unable to resolve symbol: kjd in this context  
(clojure-4:1:3:11)
4:1:3:12 user=> ; end-of-stream (^D at the beginning of the line on  
Unix/Mac OS X) quits the repl
4:1:3:13 user=> ^D
nil
user=> ^D
nil
1:16 user=> ^D
%


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To post to this group, send email to clojure@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to