J.F. Rick wrote:
Smalltalk is a pretty great language, but its syntax is unusual. I've
taught introductory programming in Pharo three times and, in my
experience, there are two places where novices get repeatedly confused
with syntax.
First, there is the differences between assignment := and comparison =
. Obviously, Smalltalk is not the only language where that is a
problem. Java is even more confusing, with assignment = and comparison
== . In Squeak, there was the attempt to address this problem head on
with using _ instead of := and having it show up as an arrow pointing
left; while that nicely addressed that problem, it proved awkward for
many reasons (e.g., it only appeared as an arrow in Squeak, it wasn't
compatible with other Smalltalks). In addition, comparison is a simple
message send, where assignment is the most critical language element
that is not an object or a message. In other words, there is a huge
difference in meaning between the two and a really minor syntactical
one. That's confusing to novices. Even after covering it repeatedly in
class I still find novices making that mistake. As their debugging
skills are minimal, this can be a real obstacle.
Second, there is the problem of keyword messages with more than one
argument. In Java, "this.someMessage( arg1, arg2)" is pretty
comprehensible to a novice. In Smalltalk, "self someMessage: arg1 and:
arg2" seems like two message sends (i.e.,
"this.someMessage(arg1).and(arg2)"). While novices won't see
multi-argument messages very often, they do come up (e.g.,
ifTrue:ifFalse:). I have my class do regular quizzes on identifying
messages and this still tricks them up even if they've already seen in
10 times.
Now, I'm not advocating changing the Smalltalk syntax; that's just
unlikely to happen. But, perhaps syntax highlighting could be employed
to good use. For instance, it is extremely helpful that blocks and
parentheses show by color which ( [ go with which ] ). Perhaps
something similar could be done for messages with more than 1
argument. For instance, the message could be underlined in different
colors. That way I could easily see which ifFalse: went with which
ifTrue:. It would also give a visual indicator: (for novices) Be
careful, this message is one of those weird ones that's longer than it
first appears. For assignment vs comparison, you similarly need a
powerful visual cue that assignment is an usual thing, where
comparison is a pretty ordinary thing. Perhaps an arrow decoration
could appear behind the :=.
These may seem like trivial issues. For experts, they are. I don't
need any of it. I don't find syntax highlighting and command
completion that useful in my programming. But, I'm proficient with a
debugger. Should I occasionally make such a trivial mistake (e.g.,
forgetting to type : in :=), I immediately find it while debugging and
easily fix it. For novices, using a debugger is not an option.
Remember, they don't understand what a stack is. Syntax highlighting
is the best debugging feature that they understand. And these are two
real common mistakes that they make that could be addressed by
improvements to syntax highlighting.
Just a suggestion,
Jeff
--
Jochen "Jeff" Rick, Ph.D.
http://www.je77.com/
Skype ID: jochenrick
For assignment, I would say bold both := and the variable being assigned to.
Underlining sounds interesting, but there are a few choices:
a. nested underlining - self someMessage: (self otherMessage: arg 1 and:
arg2) and: arg3
b. non-nested underlining - only underline #otherMessage:and: and not
#someMessage:and:
c. dynamically underline only message where cursor is located.
I prefer (c.). This would be least annoying to the experts, and maybe
not even need a Preference. Students don't have it as a continual
crutch - but they can easily check whenever needed with a tight feedback
loop most productive for learning.
cheers, Ben