Recs.
Updated
SpecsUpdate
Pros
Pro Excellent beginner text
Pro S-expressions reduce syntax confusion
Homoiconicity / S-expressions are a very regular syntax that someone can be taught in minutes. This sidesteps most all issues regarding syntax that commonly arise when teaching new coders. No more holding operator precedence in your head. Learn one syntactical form (s-expressions), and everything else is just learning the functions and composing them! For a little sugar there is also this.
Pro Racket was designed to teach functional programming from the start
Racket began life as PLT Scheme and was designed for teaching programming. While being from the LISP family means there are a ton of parenthesis, the simple syntax (while seeming eccentric at first) results in code that is consistent, and thus very easy to learn. Yet being designed for instruction does not mean that Racket isn't productive, and production ready. it's also a great stepping stone towards Clojure (or other LISP-like languages designed for productivity and production). A great thing about Racket as a first language is that it has everything included in DrRacket (IDE & environment), and because the community is so unified in tooling, it means the resources available are consistent (ideal for learning to program). There are even language "levels" so that students can be exposed to the language in stages/subsets, which makes things easier to pick up.
Pro Highly extensible
Pro Multi-paradigm support
You can easily switch between Object-oriented, Functional and Logic programming. You only learn new concepts not new syntax, new tools, etc.
Pro Great REPL included in Dr. Racket IDE
The development environment, Dr. Racket, comes with the ability to run programs line by line in an interactive computer programming environment, retaining all created variables (technically, not variables but expressions) in memory, until the user closes the program, ending the session. This interactive computer programming environment is also termed a "shell" or "REPL" (Read-Evaluate-Print Loop).
Pro Can create new languages and emulate others
Racket is a language-oriented paradigm system that allows you to create domain specific syntax to accomplish things more efficiently. Other languages can be emulated within Racket and selected by typing the dialect name at the top of the source file after a #. This source file can be compiled or interpreted using Racket's tool-chain, removing the need to learn an entire new set of tools for another language, time and again. For this reason, Racket has potential to become the proverbial "100 year" language, providing an extensible, powerful, and simplified approach to programming.
Cons
Con Very different syntax from mainstream languages
While the semantics do differ from mainstream languages (especially at the beginner level). The syntax of LISP like languages (s-expressions, and lack of infix operators) is hugely different from mainstream languages, and even counter intuitive in general for many (at first). The transition from Scheme to a language like Java can be daunting, and should not be understated.
This (prefix vs infix) syntax is difficult to read for arithmetic:
(+ 1 (* 3 4))
vs
1 + 3 * 4
Con Lack of production grade libraries
Most libraries are build around academic papers and homework and are not developed, supported or documented beyond the initial paper.
Con Very different semantics from mainstream programming languages
LISP-like languages are very different from mainstream languages. Jumping from a LISPy language to a mainstream language comes with a learning curve that would otherwise be minimal (when jumping between mainstream languages). Many people would argue that the advantages are worth it, and it will make you a better programmer in the long run, as well as help you grasp computer science concepts more quickly. However, while Scheme may be a fantastic language to start grokking programming concepts, making real-world programs in a lower level language will require a lot of low level understanding that Scheme is unlikely to teach. Functional languages may teach a great high level way of thinking, but translating functional solutions into OOP and/or low level procedural code is a skill in and of itself.
Recommendations
Comments
Flagged Pros + Cons
Pro Free resources to Learn
Includes several free online books and great documentation.
Pro REPL included
Racket includes a REPL for interactive exploration and development.
Pro Free resources to learn
Includes several free online books and great documentation.