As you all know by now, I am currently teaching the Scheme programming language to my 2nd year students as a means to master the functional programming paradigm.
I started four weeks ago with a general introduction on programming paradigms and on the necessity to at least know the most important ones in order to become a decent programmer. As my students had already studied imperative and object-oriented programming become coming to my class, I offered them to teach functional programming (using Scheme), logic programming (using Prolog in principle) and scripting (using Ruby). This first lecture can be downloaded here.
The following week, I introduced Scheme by putting a lot of accent on the evaluation of expression and the definition of simple (mathematical functions). The lecture, which is available here, was followed by a lab sheet where the students were introduced to DrScheme and were asked to write a number of simple functions (like fahrenheit->celcius).
The next lecture was on recursion and I focussed on a number of mathematical functions like factorial, fibonacci, square root using Newton’s successive approximation etc. I spent some time introducing the concept of tail-recursion to them as well as the tail-recursion optimization that Scheme has to do.
As an example, this:
(define (o+ n m)
(cond ((zero? m) n)
(else (o+ (add1 n) (sub1 m)))))
runs in constant space (i.e. there are no recursive function calls at runtime) even though it is expressed recursively. During the lab, the students implemented and traced a number of recursive functions (using the tracing facilities found in MzScheme). They implemented o+’s friends, o-, o*, o/, o^, o=, o< and o> (corresponding, of course, to our usual +, -, *, /, ^, =, < and >) using tail-recursion so that they run as quickly as possible.
The last lecture which I had last Friday was on pairs and lists, the most fundamental compound data structures found in Scheme. I introduced them to car and cdr and showed them a number of fundamental algorithms acting on lists (like length). During the lab, I asked the students to implement a simple database of students and marks and this is inspired by what I read in Practical Common Lisp.
My observations
My lectures have been cool up to now. The students are lively and responsive to my jokes and “parentheses”. The labs also are going on nicely with students who are really learning new things and having fun in the process.
It’s too early to say whether they’ll become better programmers eventually but I feel they are on the right track…
Harry says
I confirm scheme is really beautiful compared to c++ wer there are so many libraries, declaration types, variables and so on. scheme is really simple and easy to use. So far so good., im enjoying the labs and lectures. Thanks Sir. n i do hope we’l have fun also wiv the other two languages that we’l study…
selven says
flame me if you want, but i have never managed to understand that way of thinking
“MIT does it this way so does Berkeley, they are the best, so we must follow”
Why do we always have to follow, am not saying that mit dudes and berkeley dudes don’t deserve there place, but what am saying is that, instead of following, why not lead? why not find better alternatives instead, following following following, one day we might start saying “beuhhhh beuhhhh like sheep”
avinash says
Simply because the MIT and Berkeley lecturers have more experience than me :-)
Of course, I’m not paraphrasing a MIT lecture (this would have been easy actually with OpenCourseWare). Rather, nanos gigantium humeris insidentes which as Samuel Taylor Coleridge put it in The Friend (1828) “The dwarf sees farther than the giant, when he has the giant’s shoulder to mount on.”
So I not exactly doing “beuhhhh beuhhhh”. Rather I’m adapting what the best do to cater for our own students.
What’s nice is that the latter like the lectures and the lab sessions. I can easily see that in their eyes. And they are actually learning very important programming techniques.
I’m happy.
flyjason says
Looking at the first slide “…lists 8512 programming languages!”, which is wow a huge and very impressive number indeed!!, reminds me about a telling article (http://www.bitwisemag.com/2/The-Next-Big-Thing-In-Programming) which I recently read on bitwisemag. I recommend everyone of you to have a glimpse at it (actually it may perhaps unlock the future).
So why are there so many PLs??! Hmm simply because most of them are YACLL (‘Yes Another C-Like Language’)!!! How do these languages really differ? Yeah you got it…a great deal of them are structured the same way with slight variations in the syntax.
Here is an excerpt of the article (The Next Big Thing in Programming):
/*
…In the long history of programming they will, ultimately, all be seen as ‘more or less the same thing’ doing ‘more or less the same job’.
…These are all, in their way, useful languages. But they are devoid of Big Ideas.
*/
Yes, all of us must be wondering about what Big thing or breakthrough to loom up next in programming, if any?!!! Up to now, “…the goal has been to get the job done rather than to change the nature of the job itself”.
The future is perhaps already set – and it’s YACLL!!! I desperately hope I’m wrong on that.
avinash says
What about this? Or this?
Or simply this (or this)?
flyjason says
Languages always crop up…but will they stand the test of time? This is what is at stakes!! For example, logic programming languages (such as PROLOG) which were praised decades ago and indeed looked evenly promising are almost obsolete today.
Exploratory programming looks equally promising. Will it shape the programming world to new heights? Will it be adopted by professionals? Is it a Big Idea? Let’s see if it lives up to expectation.
avinash says
My feeling is that people have missed the point for a long time. You can’t really write a complete application productively using only one programming language. For instance, a game’s 3D engine can be written in C++, the AI part using Scheme and Prolog and everything glued using Ruby. And plugins would be written in Lua. The languages only have to share the same “object model” whatever that may mean…
It seems that Microsoft was ahead of the rest after all with its .NET architecture :-)
Sandeep says
I find scheme to be a good way of exploring other ways of programming. The teach-pack in Scheme make programs more obvious to understand… you remember the celsius program?
You are the only lecturer who talks about technology and the people who developed them. Its encouraging and insightful.
avinash says
Nice of you to say that.
I think it’s essential that students know who have invented the tools they use and why. It’s a good way to appreciate the tool and to (maybe) predict what the future will be.
selven says
what i find even more interesting (compared to know who invented it), is to re invent that tool, atleast, that gives me a sense of “that’s no big deal, he only did it coz he was born first” :p
avinash says
What is more interesting is to invent something new.
Alan Kay said: “The best way to predict the future is to invent it.”
And Coluche said (I’m translating): “It’s easy to be intelligent: think of something really dumb and say the exact inverse”
As for “that’s no big deal, he only did it coz he was born firstâ€, I’m not too sure about that or else there would have been nothing else to invent… because there were so many people born before us ;-)
Ashesh says
Hello Sir,
After Scheme, are you planning or do you have in mind to teach Ruby/Rails?
avinash says
Hi Ashesh,
I will teach Prolog for the next two week and then swiftly move to Ruby for one month. I don’t intend to teach Rails though. I’ll focus on the scripting and metaprogramming capabilities of Ruby.