So I think scheme is a very good choice for an introductory course...
Ruby is very nice (I'm mainly programming in it nowadays) but I'm not sure it's such a good choice for beginners, there are a lot of small details that could trip up beginners I think (block vs procs vs lambda vs method(:name_of_method), the eigenclass...)
From what I know, the Python mantra seems to be 'one way to do something', which I suppose would be less confusing for first timers.
So, while it doesn't really support FP fully, it's probably sufficient for basic FP from a pedagogical standpoint. (I also think it's one of the better candidates for a first programming language overall.)
Smalltalk as it exists today has about 8 terminals & nonterminals in its grammar. Python has something like 30. Ruby has something over a hundred, but for an intro to programming, you can just ignore most of the grammar and use a subset which makes it very close to Python in simplicity.
Smalltalk was specifically designed to be usable by children.
I think, in the beginning, people are most likely to understand concepts like Objects (Circle, Square, etc.) and how they relate to other stuff since it's so based off how we normally think. Also, since Java is statically typed, I think it makes things appear to contain less "voodoo". Then again, I could be completely wrong; I had been programming in other languages for years before taking my first Java course in college and only attended the class when there was a test.
Of course both have less obtrusive syntax than Java, which requires the famous
public static void main...
just to get started. That is the kind of stuff that I think confuses true beginners. They look at that stuff and think "holy crap memorize these voodoo incantations" and never really leave that mindset once they get there. Even if they eventually learn what static means, they will always treat it as such.I think once they get the hang of programming in something, it's easy to build up from there. I just think it causes people to focus on the wrong thing (syntax rather than semantics) when they are first starting out.
It's just not a concept most Freshmen are acquainted with.
No way. It's better to learn other programming concepts without the distraction of having to maintain types. Duck typing makes a lot more sense to new people, in my experience. Most of the popular languages with non programmers (PHP, VB, JavaScript) fit this mold.
puts(("foo #{bar} %s %s" % [bat, baz]) * 2.+(0b0010))
There are a huge number of syntax rules in that line. # from http://news.ycombinator.com/item?id=404609
bar = 3
bat = 4
baz = 5
puts(("foo #{bar} %s %s" % [bat, baz]) * 2.+(0b0010))
And here's a grammar for the subset of Ruby it uses: this <- 'A parsing expression grammar for a tiny subset of Ruby.'.
copyright <- 'Written by Kragen Javier Sitaker 2008; in the public domain.'.
program <- _ expr program / .
noninfix <- inparens / call / constant / quasiquoted / list / name.
expr <- infix / noninfix.
inparens <- '('_ expr ')'_.
call <- name '('_ commalist ')'_ / constant '.'_ methodname '('_ commalist ')'_.
constant <- '0b' bits / digits.
bits <- bit bits / bit _.
bit <- '0' / '1'.
digits <- digit digits / digit _.
digit <- bit / '2' / '3' / '4' / '5' / '6' / '7' / '8' / '9'.
quasiquoted <- '"' qqcontents '"'_.
qqcontents <- !'#{' !'"' char qqcontents / interpolation qqcontents / .
interpolation <- '#{' expr '}'.
list <- '['_ commalist ']'_.
commalist <- expr ','_ commalist / expr / .
infix <- noninfix '%'_ expr / noninfix '*'_ expr / noninfix '='_ expr.
_ <- sp _ / .
sp <- ' ' / '\n' / comment.
comment <- '#' commentchars '\n'.
commentchars <- !'\n' char commentchars / .
namechar <- 'b' / 'a' / 'r' / 't' / 'z' / 'p' / 'u' / 's'.
name <- namechar name / namechar _.
methodname <- '+'_ / name.
I have tested it (in http://github.com/kragen/peg-bootstrap/tree/master/peg.md) and it seems to work for that fragment, although I haven't examined the parse tree to see if it's right. (Obviously the definition of namechar is wrong, and there's no $end token separating statements, and you can't call methods on things that aren't constants or self, etc.)IMO, the only thing which would help most into students "get coding" is using an inline debugger to step though their code and understand what's happening. Because people don't get the idea that software is a dynamic thing once you run it.
Later, I signed up for a CS course at a college, and their textbook was just a glorified Visual Basic tutorial, because at the time, all the companies were looking for Visual Basic programmers.
Now, companies are looking for Java programmers, so the schools have switched over to that. Never mind that programming languages have a long history of turning out to be short-term fads (COBOL and Pascal before Java), and the real skill is in understanding the logic underneath the language.
But yeah, I'm sure there has to be a better language for learning out there, I just don't personally know it. I originally learned with C++, and I remember the terror that were pointers at first. When I had a class that taught me Scheme, I remember thinking: "hey, I could write this code on paper without even testing it out if I wanted", which was the polar opposite of my C++ experience.
Start people that are totally new to programming with something like Scheme or Ruby (surely there are even better ones than these) that requires less arcane punctuation to do things like hello world, then once they get the hang of things, slowly introduce them to more structured languages.