summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Teuber <bsteuber@gmail.com>2010-04-14 19:07:09 +0200
committerStuart Halloway <stu@thinkrelevance.com>2010-10-12 19:46:17 -0400
commit6d300332f810a68869c11ddfcc55f4439b70fdb3 (patch)
tree91a7432e9d1ab41cb9a3a478301943f589fe1596
parent83fc4fe476b75553a4c2db8bd4f7fdfc02379dce (diff)
add docstring support to def
code is a bit ugly, but touches as few lines as possible to not introduce anything nasty Signed-off-by: Stuart Halloway <stu@thinkrelevance.com>
-rw-r--r--src/jvm/clojure/lang/Compiler.java9
-rw-r--r--src/jvm/clojure/lang/RT.java1
2 files changed, 9 insertions, 1 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 1eaa9e81..24cb9359 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -414,7 +414,12 @@ static class DefExpr implements Expr{
static class Parser implements IParser{
public Expr parse(C context, Object form) throws Exception{
- //(def x) or (def x initexpr)
+ //(def x) or (def x initexpr) or (def x "docstring" initexpr)
+ String docstring = null;
+ if(RT.count(form) == 4 && (RT.third(form) instanceof String)) {
+ docstring = (String) RT.third(form);
+ form = RT.list(RT.first(form), RT.second(form), RT.fourth(form));
+ }
if(RT.count(form) > 3)
throw new Exception("Too many arguments to def");
else if(RT.count(form) < 2)
@@ -446,6 +451,8 @@ static class DefExpr implements Expr{
Object source_path = SOURCE_PATH.get();
source_path = source_path == null ? "NO_SOURCE_FILE" : source_path;
mm = (IPersistentMap) RT.assoc(mm, RT.LINE_KEY, LINE.get()).assoc(RT.FILE_KEY, source_path);
+ if (docstring != null)
+ mm = (IPersistentMap) RT.assoc(mm, RT.DOC_KEY, docstring);
Expr meta = analyze(context == C.EVAL ? context : C.EXPRESSION, mm);
return new DefExpr((String) SOURCE.deref(), (Integer) LINE.deref(),
v, analyze(context == C.EVAL ? context : C.EXPRESSION, RT.third(form), v.sym.name),
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index a7c494cb..78ab5767 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -185,6 +185,7 @@ final static public Var MATH_CONTEXT = Var.intern(CLOJURE_NS, Symbol.create("*ma
static Keyword LINE_KEY = Keyword.intern(null, "line");
static Keyword FILE_KEY = Keyword.intern(null, "file");
static Keyword DECLARED_KEY = Keyword.intern(null, "declared");
+static Keyword DOC_KEY = Keyword.intern(null, "doc");
final static public Var USE_CONTEXT_CLASSLOADER =
Var.intern(CLOJURE_NS, Symbol.create("*use-context-classloader*"), T);
//final static public Var CURRENT_MODULE = Var.intern(Symbol.create("clojure.core", "current-module"),