diff --git src/jvm/clojure/lang/Compiler.java src/jvm/clojure/lang/Compiler.java index 352bfd8..5725d78 100644 --- src/jvm/clojure/lang/Compiler.java +++ src/jvm/clojure/lang/Compiler.java @@ -6479,6 +6479,7 @@ public static Object eval(Object form, boolean freshLoader) { Var.pushThreadBindings(RT.map(LINE, line)); try { + checkLet(form); // Fix CLJ-5 form = macroexpand(form); if(form instanceof IPersistentCollection && Util.equals(RT.first(form), DO)) { @@ -6522,6 +6523,42 @@ public static Object eval(Object form, boolean freshLoader) { } } +private static void checkLet(Object x) { + if (x instanceof ISeq) + { + ISeq form = (ISeq) x; + Object op = RT.first(form); + if (op instanceof clojure.lang.Symbol) + { + Symbol symbol = (Symbol)op; + if (symbol.getName().equals("let")) + { + Object arg = RT.second(form); + if (arg instanceof clojure.lang.PersistentVector) + { + PersistentVector v = (PersistentVector)arg; + for (int i = 0; i < v.size(); i = i+2) + { + Object leftSide = v.get(i); + if (!(leftSide instanceof clojure.lang.Symbol)) + { + throw new UnsupportedOperationException("left side " + + "of binding to let() must be a symbol (found a " + + leftSide.getClass().getSimpleName() + " instead)."); + } + } + } + else + { + throw new UnsupportedOperationException("argument to (let) " + + " must be a vector (found a " + + arg.getClass().getSimpleName() +" instead)."); + } + } + } + } + } + private static int registerConstant(Object o){ if(!CONSTANTS.isBound()) return -1;