CS 345 Syllabus:

Professor: Chris Brooks
Office: Harney 541
Phone: 422-5221
email: cbrooks@cs.usfca.edu
Office Hours: MTW 11-12 or by appointment

Time: TR 1:15-3:00

Place: HR 512

Course Objectives:

The goal of this course is to familiarize you with 'non-traditional' programming languages and styles, specifically Lisp, Smalltalk and Python. When the course is over, you should be able to write reasonably large programs using each of these languages. You should also be able to articulate their strengths and weaknesses. In addition, we will talk about the different programming paradigms (functional, object-oriented, declarative) represented by these languages more generally; you should be able to apply these ideas to the design of programs written in more 'traditional' languages, such as Java or C++.


CS 112 or equivalent. You should be familiar with at least one programming language, and comfortable with the material from CS 245 (which is highly recommended), including the use of common data structures such as lists, trees, and hash tables.


Each Tuesday you will receive a medium-sized lab/homework that will cover the concepts we learn about that week in class. That homework will be due the following Tuesday at the beginning of class. In addition, you'll have three larger programming projects that provide more exposure to the things that make each language interesting and cool. For these projects, you'll turn in your code for the project, plus a writeup describing the project. We'll also have a final exam, which will consist of questions designed to test your understanding of the concepts underlying each language, the realtionships between them, and your ability to apply OO, functional, and declarative programming techniques to more traditional languages.

Breakdown: Homeworks: 30%, Projects: 40%, Final 25%, Misc: 5%.


Squeak: Object-oriented Design with Multimedia Applications. Mark Guzdial.

Common Lisp: A Gentle Introduction. David Touretzky. (available for free online)

On Lisp. Paul Graham. (available for free online.)

Learning Python. David Ascher, Mark Lutz. This book is available online via O'Reilly's Safari service. (safari.oreilly.com). I strongly recommend using this; for $10-$15 per month, you can have acceess to O'Reilly's online catalog.

Late Policy: 10% taken off for each day your assignment is late. Weekends don't count, so if your assignment is due on a Friday and you turn it in on a Monday, you get 10% off. After 3 days (30% off), the assignment is worth zero - at that point, you're better off moving on to the next assignment rather than getting further behind.

Collaboration: In general, I expect students to behave responsibly and do their own work. I'm willing to assume this is the case until proven wrong. More specifically, it is OK to talk with each other about the general parameters or approach of the assignment. It is NOT OK to share source code, to do part of an assignment for another person, or to directly copy another person't work. If you are unsure as to whether something is considered fair game or not, please ask me and we can discuss it.

A few examples: "On question 4, are we supposed to implement a non-destructive version of sort?" This is fine; it's a clarification of the assignment. Feel free to talk about this sort of thing with your classmates.

"I just can't figure out the difference between cons and append, and it's messing up my list construction. Can you show me how they work?" Also fine; you're talking about the course material generally; I think students should help each other with this sort of thing - you're great resources for each other.

"Question 3 is really hard. How did you do it?" Now we're getting into a gray area. If you're talking in generalities here ("Well, we have a module that parses user input, and one that matches the template to stored data, and then another module that constructs a response") that's fine; you're not telling the other person exactly how to do the assignment, you're just discussing approaches. If you're talking specifics ("To reverse the list, you read in the first element and recursively cons the rest onto it") then we're moving into unacceptable territory. The question to ask is: does the person I'm talking to still need to think for themselves in order to solve the problem, or have I just given them the entire answer? I strongly recommend erring on the conservative side here; if you're unsure whether you're sharing too much, tell the question-asker that they should talk to me. I'm always happy to help people with problems .

"Can I just look at/use/copy your code?" Definitely not acceptable. Keep in mind that both participants are cheating here; the person who is copying and the person who is allowing their friends to copy. Students that I feel are cheating in this manner (this is cheating) will not be treated nicely.

Also note that using code that you get off the web, from a friend, etc. and turning it in as your own is considered plagiarism, just as if you did it in a paper. This will result in (at least) a zero for that assignment.

List of Topics:

Note: This is a preliminary list of topics, quite likely to change as the semester progresses.