On Tuesday, December 6, 2016 at 5:55:52 AM UTC-6, Paul Walker wrote:
>
> Wow thank you for the fulsome responses
>
> A couple of thoughts. I brashly said
>
> > I cherrypicked a case where the runtime difference would be tiny
>
> and I appreciate the clarifications - especially that my naive 
> add-one-bytecode calculation in my head (the code I pasted has a pretty 
> meaty “analyze” call called before it every time which is why I thought I 
> cherry-picked) didn’t think about things like byte code inlining or, 
> really, the pile-of-sand one-more-bytecode syndrome. So thanks for that!
>

I think in the case you picked that you're right that the performance 
impact is minimal. This happens at compile-time and generally we are less 
sensitive there than in calls during the runtime. Colin's talk from last 
year's conj gives a good idea of some of the challenges in working on this 
stuff. https://www.youtube.com/watch?v=kt4haSH2xcs
 

> And my favorite response from Alex:
>
> > If I can make a request, it would be that instead of saying "errors are 
> bad" (which is honestly, not helpful by itself), but to step back and 
> either take a broader approach towards systemic issues
>
> This is so reasonable I’m embarrassed I was a bit glib in my first note. I 
> mean it’s not like they are C++ template errors from 1998  (my gold 
> standard for bad errors). So let me expand on “bad” a little. 
>
> I think the error messages are “bad” in 3 particular but related ways. I’d 
> be happy to expand on these, but the themes are:
>
> 1: They are “large” and “far from my code”. This is partly an issue with 
> java stack traces, but the intermixing of java and clojure and the 
> presentation of clojure names in java name-like things in the stacks is 
> obscuring. The line numbers are obscured instead of displayed prominently. 
> And so on.
>

Personally, I don't have a problem with stack traces - there's a ton of 
useful information in a stack trace. The issues of "distance from code" are 
interesting in Clojure though. One area I mentioned is due to errors in 
macros where it reports either the error in the macro rather than in the 
source OR where you get a runtime code that is based on code that was 
written by the macro (not by you). The first problem is significantly 
improved by spec. Another source of "distance" is laziness - sometimes a 
nested operation will not error until a lazy seq is forced, possibly far 
from the core of the problem. Eager transformations (we have more options 
for this now with transducers) can help with that, as can spec in reporting 
more accurately the error when it occurs.
 

> 2: Similarly, they expose internals of the runtime implementation to the 
> user. Stacks intertwine java and clojure (CIDER error screen has a toggle 
> to supress the stack partially for this). They show java exceptions as 
> clojure errors when they aren’t part of a clojure program. etc…
>

Again, Clojure is an unapologetically hosted language. There is no desire 
to hide that fact or to shield you from it. That means that learning 
Clojure inevitably means learning something about the JVM or Java as well. 
 

> 3: These, plus a few other things, mean the error messages are 
> semantically far away from the program you write. You stay happily in 
> LISP-y land until you get a stack, then you realize you are in java. There 
> are lots of examples of this, but take the dumb one I picked - (1 + 1) in a 
> REPL. That shows two concepts (java.lang.Long and clojure.lang.IFn) which 
> you don’t deal with in lisp. I’ve written quite a lot of clojure in the 
> last 5 months and never typed clojure.lang.IFn once. It’s a java error 
> message but I’m a clojure programmer. Instant semantic break. And since 
> many error messages are generated at the runtime level, which is java / 
> JVM, I experience this semantic break often. Add the excellent comments in 
> this thread on macro expand non-locality of error and the problem expands.
>

I get this and it's unfortunate when it exposes to you more than you need 
to know initially. But at the same time, I think developing that knowledge 
is essential to make the best use of Clojure in the long term.
 

> So if you imagine a guide like “the error should be as close to the error 
> causing code as possible and presented in the semantics of the problem” 
> then I think I conclude clojure messages are “bad”. (But I love clojure) 
>
> It seems spec, inasmuch as it acts as a sort of optional type system which 
> is in the space of the clojure language and produces information in that 
> space, would address many of these. 
>
> And as to why I mentioned this: I mean I haven’t had a problem. I just 
> built a dual mental model of clojure and the clojure runtime while I 
> learned the language and swapped between when an error popped. 
>

That seems like a good thing to me. :) 
 

> And I’ve written a lot of java (and interpreters and compilers too) so 
> that was easy enough for me to do. And I have been hugely productive in 
> your kit. I love clojure! 
>
> But indeed for teaching it’s an obstacle, but also for teaching’s adjacent 
> problem, using a language or toolset in a group of programmers of mixed 
> abilities, I was thinking errors would be something I’d improve.
>

There are some interesting gradations even in this depending on whether 
you're talking very new programmers, or experienced programmers new to 
Clojure, or experienced *Java* programmers new to Clojure, etc. Elena 
Machkasova has been working through how to present Clojure error messages 
for new developers at U of Minnesota. An older talk on this is 
at https://www.youtube.com/watch?v=k5erDyDPzgc. Elena has actually done 
some user studies on this as well (which Cognitect funded). I don't think 
she would say that this work is appropriate for all Clojure developers 
though.

But really, it seemed like a place I could lend a shoulder if work was 
> afoot, so the comments on the ticketing approach are appreciated and I will 
> dig into them.
>
> Thank you for your rapid and thoughtful responses
>
> - Paul
>
>
> On Dec 6, 2016, at 2:56 AM, Mars0i <marsh...@logical.net> wrote:
>
> On Monday, December 5, 2016 at 10:36:59 PM UTC-6, Sean Corfield wrote:
>>
>> Several of the Clojure/core folks have said at various times over the 
>> years that Clojure is deliberately not optimized for novices, on the 
>> grounds that whilst everyone starts out as a novice, most of your time 
>> spent with Clojure is beyond that stage (and an optimization for novices 
>> can be a de-optimization for everyone else).
>>
>
> This makes sense for anyone with significant programming experience.  It's 
> a shame, though, that Clojure would be a great language for novice 
> programmers except for the error messages, which are probably a 
> show-stopper for some p teachers thinking of using it for teaching.  I know 
> that there are people involved in Clojure Bridge and other teaching 
> programs, but as a teacher (in another discipline), I personally would have 
> a hard time choosing Clojure over Scheme at this point, if I was teaching 
> an intro programming course.  Clojure's probably a better language for 
> later growth though, given its easy integration with Java and Javascriptl.
>
> I'm not arguing for a change.  I like run-time performance, too.  Spec 
> messages are not any good for novice programmers, either, but I'd guess 
> that down the road it will be possible to build a friendly error system on 
> top of spec.  Can't do that as easily with JVM stacktraces. :-)
>
>

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to