Follow Slashdot stories on Twitter

 



Forgot your password?
typodupeerror
×
Programming Books Media Book Reviews Technology

Practical Common Lisp 617

Frank Buss writes "Common Lisp is an ANSI standard, which defines a general purpose language and library, and is implemented by free and commercial compilers and IDEs; see *hyper-cliki* for more general information about Common Lisp. The book Practical Common Lisp explains the language with many practical examples and is available in full text online, too." Read on for the rest of Buss' review.
Practical Common Lisp
author Peter Seibel, Gary Cornell (Editor)
pages 500
publisher Apress
rating 8
reviewer Frank Buss
ISBN 1590592395
summary A book for learning and using Common Lisp

Unlike other good books about Lisp, which are focused on a specific domain, like AI (such as Paradigms of Artificial Intelligence Programming ) or basic computer science (for example Structure and Interpretation of Computer Programs for the Lisp-like language Scheme), this book focuses on solving real-world problems in Common Lisp, like web programming, testing etc., after introducing the language by examples in the first chapters. I started with Lisp half an year ago, and it has helped me a lot in learning it. But even if you already know Lisp, this book may be useful for you, because it has a fresh view on the language and the examples in the later chapters are usable in your day-to-day work as a programmer.

The first chapter tells you something about the author (he was a good Java programmer before starting with Lisp) and the history of Lisp and Lisp dialects like Scheme. The next chapters are a tour through all Lisp features, written in easy-to-understand steps, beginning with the installation of a Lisp system and an introduction to the interactive REPL. You don't need any experience in other languages to understand it.

The general concept throughout is to explain a feature first, then show an example of how to use it, with detailed discussion of what the example does and possible pitfalls. A nice example is the APPEND function, which does not copy the last argument:

The reason most list functions are written functionally is it allows them to return results that share cons cells with their arguments. To take a concrete example, the function APPEND takes any number of list arguments and returns a new list containing the elements of all its arguments. For instance:(append (list 1 2) (list 3 4)) ==> (1 2 3 4)

From a functional point of view, APPEND's job is to return the list (1 2 3 4) without modifying any of the cons cells in the lists (1 2) and (3 4). One obvious way to achieve that goal is to create a completely new list consisting of four new cons cells. However, that's more work than is necessary. Instead, APPEND actually makes only two new cons cells to hold the values 1 and 2, linking them together and pointing the CDR of the second cons cell at the head of the last argument, the list (3 4). It then returns the cons cell containing the 1. None of the original cons cells has been modified, and the result is indeed the list (1 2 3 4). The only wrinkle is that the list returned by APPEND shares some cons cells with the list (3 4). The resulting structure looks like this:

*
In general, APPEND must copy all but its last argument, but it can always return a result that shares structure with the last argument.

In chapter 9, the first larger practical example is developed, a unit testing framework (like JUnit), which is easy to use and to enhance.

Certain Lisp implementation behaviors can be confusing, such as those for for building pathnames. The pathname concept in Lisp is very abstract, leading to different choices in different implementations. This is no problem if you use only one implementation, but chapter 15 develops a portable pathname library, which works on many implementations. By doing this, it shows you how to write portable Lisp code, using different code for different implementations with reader macros.

After an introduction to the Common Lisp Object System (CLOS) and a few practical FORMAT recipes (the printf for Lisp, but more powerful), chapter 19, "Beyond Exception Handling: Conditions and Restarts", is really useful. The exception handling in Lisp (called "condition system") is more general than other exeption systems: In Lisp you can define restarts where you generate an exception and the exeption handler can call these restarts to continue the program. After reading this chapter, you'll never again want to use the restricted version of Java or C++ exception handling.

Chapters 23 to 31 show real world examples: a spam filter, parsing binary files, an ID3 parser, Web programming with AllegroServe, an MP3 database, a Shoutcast server, an MP3 browser and an HTML generation library with interpreter and compiler. If you ever thought that Lisp is an old language, only used for AI research, these chapters prove you wrong: Especially the binary files parser shows you, how you can extend the language with macros for implementing binary file readers, which looks nearly as clear and compact as the plain text binary file description itself. I'm using some of the ideas for a Macromedia Flash SWF file reader/writer I'm currently writing. Take a look at my Web page for my currently published Lisp projects.

The Web programming chapters demonstrates how to use a dynamic approach for generating web pages. You just start a Web server in your Lisp environment; then you can publish static Web pages or define functions, which are called when the page is requested by a browser. The author demonstrates how to define dynamic pages with formulars in Lisp and Lisp HTML generators.

After reading Practical Common Lisp, you will know most of Common Lisp and how to write real-world programs with it. Some special features, like set-dispatch-macro-character, or using one of the non-standard GUI libraries, are not explained, but it is easy to learn the rest of Common Lisp and to use other Lisp libraries, with the knowledge gained from this book.


You can purchase Practical Common Lisp from bn.com. Slashdot welcomes readers' book reviews -- to see your own review here, read the book review guidelines, then visit the submission page

This discussion has been archived. No new comments can be posted.

Practical Common Lisp

Comments Filter:
  • I'm sorry, (Score:3, Funny)

    by re-Verse ( 121709 ) on Thursday April 28, 2005 @05:01PM (#12377053) Homepage Journal
    But since we're practicing it, Isn't that supposed to be lithp
  • Whenever I think of Lisp, I'm transported back in time to 1975 where I'm trying (unsuccessfully) to learn this as my 2nd programming language after Fortran IV (on a DECsystem-10, no less).

    I never revisited Lisp. Perhaps now that I have the book, I'll give it a shot.

    You can download a copy here [networkmirror.com] if the main site is too busy.
    ~
    • If you find LISP interesting, Haskell might also be of interest.

      Recent interest in Haskell has exploded because of the implementation of Pugs [pugscode.org] in GHC. Pugs is a compiler / interpreter prototype for Perl 6, which is also a functional language, borrowing many concepts from LISP and smalltalk (as well as just about every other popular research or practical programming language).
      • Some of the key differences between Haskell and Lisp are:
        • Haskell has a strong typing system, similar to that of ML. Lisp's type system is optional, and while many Lisp implementations can do type inference and checking, it isn't required, nor is it as big a part of the language.
        • Haskell is purely functional, and it fakes side-effects with the Monad design pattern. Lisp has side-effects, with all the advantages and disadvantages that entails.
        • Haskell uses lazy evaluation. Lisp uses strict evaluation unless you explicitly ask for lazy evaluation.
        • Lisp, thanks to all those parentheses, has very powerful macros. I know every Lisp fan says this, but they're really cool. Haskell relies more on higher-order functions and infix syntax for that sort of thing, which isn't as powerful but which you may find to be a decent tradeoff.
        • Haskell has significant whitespace, like Python. Lisp doesn't.
        • I find that editing Lisp code is easier than editing Haskell code, due to the excellent Lisp editing modes available for various text editors. OTOH, maybe that's partly because haskell-mode for emacs is pretty rough.
        • Lisp can generally be made faster than Haskell, which is very nice in bottlenecks. For the rest of the program, though, this isn't so major.
        • First off, let me say that I'm new to Haskell, and learning it, Python and (as of last night) Fortress at the same time, so I'm far from an expert.

          "Lisp can generally be made faster than Haskell"

          Certainly, and I'm not saying Haskell makes a good language for day-to-day coding. I'm just saying that it's a good place to learn functional programming.

          "Haskell uses lazy evaluation. Lisp uses strict evaluation unless you explicitly ask for lazy evaluation."

          For those who do not understand this point, it's worth going into. In C, when you say:

          c = foo() + bar();

          you call functioan foo and bar, add their results, and store that result in c. In Haskell a similar construct would store in c the information required to call foo and bar at a later time when/if you needed the value of c, but of course, if you just add c to another value, you just create a more complex result, you still don't invoke foo or bar.

          This is a very powerful concept, but can also lead to surprising results if you are used to programming in non-lazy languages.
    • FYI, the download-able files contain the book examples' source code. They do not contain the book itself.
    • by omnirealm ( 244599 ) on Thursday April 28, 2005 @07:15PM (#12378521) Homepage

      Whenever I think of Lisp, I'm transported back in time to 1975 where I'm trying (unsuccessfully) to learn this as my 2nd programming language after Fortran IV (on a DECsystem-10, no less).

      I've heard it said that someone just learning how to program can pick up Lisp in a day. If you happen to already know Fortran, it will take two days.

  • LISP is amazing. (Score:5, Interesting)

    by millennial ( 830897 ) on Thursday April 28, 2005 @05:03PM (#12377073) Journal
    I took a Programming Languages course up at Michigan Tech a couple years back. We wrote our own interpreter using nothing but Common LISP, and it blew my mind. It got me really interested in programming language design.
    However, LISP can also be hard to learn. The function names don't make sense to most people who have been raised on higher-level (1980s+) languages. I mean, 'car' to grab the first element of a list, and 'cdr' to grab all the others? It can get downright confusing sometimes.
    • by worst_name_ever ( 633374 ) on Thursday April 28, 2005 @05:10PM (#12377155)
      I mean, 'car' to grab the first element of a list, and 'cdr' to grab all the others? It can get downright confusing sometimes.

      But it leads to hilarious bumper stickers, such as: "My other car is a cdr"

    • The function names don't make sense to most people who have been raised on higher-level (1980s+) languages. I mean, 'car' to grab the first element of a list, and 'cdr' to grab all the others? It can get downright confusing sometimes.

      Common Lisp has first [lispworks.com] and rest [lispworks.com] as accessors for lists. Many Lispers consider it good style to use them when treating conses as lists and to use car/cdr when treating conses as binary trees.

    • Which leads us to the LISP catch phrase: "Easier to use than assembler".
      • Tcl [www.tcl.tk] captures the Lisp-nature without retaining the assembly-nature, the parentheses-everywhere-nature, and the wow-is-it-still-the-1950s-nature.

        I predict this comment lasts 12 minutes before being modded down to -1. WHY DO THE MODERATORS HATE AMERICA?

        • Re:Tcl/Tk RULES!!! (Score:3, Insightful)

          by nizo ( 81281 ) *
          I swear I would rather chop off my left hand then program in Tcl ever again. But I won't hold your love of Tcl against you :-) My favorite behaviour when using Tcl was seeing a syntax error in code that had been running in production for years. Since Tcl isn't preprocessed god only knew how many syntax errors where in that code. Granted the programmer should have written test cases to exercise all of the code, but that is a whole other ball of stupidity.
        • Tcl however lack the "robust abstraction" nature of Lisp. Instead, has "everything a string" nature.

          Personally, OOGG feel any language where "value of variable" needs $ notation is severely brain-damaged. Absolute opposite of abstraction.
      • Re:LISP is amazing. (Score:4, Informative)

        by sketerpot ( 454020 ) * <sketerpot@gma[ ]com ['il.' in gap]> on Thursday April 28, 2005 @07:02PM (#12378395)
        It's much easier to use than assembly. In assembly language, for example, it would be non-trivial to do something like this:

        (remove-if-not #'oddp list-of-numbers)

        That returns a list of all odd numbers in a list of numbers. With this sort of a difference in ease of use, why are you comparing Lisp to assembly language? My guess is that you're just talking out your ass.

    • by jtdubs ( 61885 ) on Thursday April 28, 2005 @06:38PM (#12378167)
      That's probably not the right way to think about it. A cons cell is a data structure that holds a pair of items. The first is the car; the second is the cdr. The accessors for those parts of a cons cell also have the names car and cdr.

      Linked lists are just one data structure that you can implement with cons cells. You can also implement a stack, queue, binary-tree, association-list, etc...

      If your are using "cons cells" in your program, use car and cdr.
      If you are using lists that are implemented via cons cells use first and rest.
      If you are using a stack use push and pop.
      And so on...

      In other words:

      CL-USER> (car (cons 1 2))
      1
      CL-USER> (cdr (cons 1 2))
      2
      CL-USER> (first (list 1 2 3))
      1
      CL-USER> (rest (list 1 2 3))
      (2 3)

      Justin Dubs
  • by Stanistani ( 808333 ) on Thursday April 28, 2005 @05:04PM (#12377080) Homepage Journal
    Could someone proficient in LISP give me three cogent reasons to learn the language?
    • 1) macros will blow your mind. Read Paul Grahams' 'On Lisp'
      2) takes bottom-up programming to the extreme. Really does help, but takes a while to get used to.
      3) Much better to develop in...interact with the interpreter, compile individual functions and run them, change variables in a running image...
      • by ajs ( 35943 ) <{moc.sja} {ta} {sja}> on Thursday April 28, 2005 @05:18PM (#12377230) Homepage Journal
        1) macros will blow your mind. Read Paul Grahams' 'On Lisp'
        2) takes bottom-up programming to the extreme. Really does help, but takes a while to get used to.
        3) Much better to develop in...interact with the interpreter, compile individual functions and run them, change variables in a running image...
        Of course, these things are true of most any functional language. IMHO, LISP is a poor choice as a starter language if you're looking for the above wins. I would start with Haskell or Scheme and move on to LISP once you had your bearings.

        Common LISP is a very old language (not as old as LISP, of course), full of the same kinds of pitfalls that any language its age or older shows (e.g. C, FORTRAN, etc). It is best to start with younger languages and work your way back.
        • I got my start using lisp in emacs. I highly recommend this method. There is a lot of code readily available directly in the editor both for inspection and use. There are tons of functions that directly relate to a text editor.

          This will get you familiar with some of the concepts of lists, atoms, quoting and order of evaluation. There really isn't much to a language like LISP or Scheme. The basic building blocks are few, it's largely a matter of where the line between language and library is drawn.

          The
        • Of course, these things are true of most any functional language. IMHO, LISP is a poor choice as a starter language if you're looking for the above wins. I would start with Haskell or Scheme and move on to LISP once you had your bearings.
          This is what I did, and it was a mistake for me. Many parts of Lisp are far "newer" than other languages because it is far easier to modernize.

          For example, Qi is built on Common Lisp and claims to have "the most powerful type system of any existing functional language." I think it's a fancy academic language, but the win is that you can combine it with the hardened industrial features of Common Lisp.

        • Comment removed (Score:4, Interesting)

          by account_deleted ( 4530225 ) on Thursday April 28, 2005 @07:39PM (#12378701)
          Comment removed based on user account deletion
        • by e40 ( 448424 ) on Thursday April 28, 2005 @08:55PM (#12379249) Journal
          If you think that macros in any language are better than the ones in Lisp you are very uninformed... and you clearly never used Lisp. Lisp macros manipulate and transform Lisp expressions. Once you have used them you will be completely amazed at how powerful this is.

          As for starting with younger languages... cripes. Common Lisp became an ANSI standard in 1994. It continues to evolve and has two commercial companies behind it, and many open source projects.
    • by Neil Blender ( 555885 ) <neilblender@gmail.com> on Thursday April 28, 2005 @05:08PM (#12377133)
      1. You can post on slashdot when ever the topic comes up.

      2. You can think of yourself as extra cool.

      3. It'll get you laid.
    • by Lisper ( 461847 ) on Thursday April 28, 2005 @05:09PM (#12377143)
      "Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot."

      - Eric Raymond, "How to Become a Hacker"
    • Chapter 1. Introduction: Why Lisp? [gigamonkeys.com]

      Here's an interesting snippet:

      The nearest thing Common Lisp has to a motto is the koan-like description, "the programmable programming language." While cryptic, that description gets at the root of the biggest advantage Common Lisp still has over other languages. More than any other language, Common Lisp follows the philosophy that what's good for the language's designer is good for the language's users. Thus, when you're programming in Common Lisp, you almost never

    • cadr(`yes `no `maybe)
    • by Anonymous Coward
      1. Run-time typed, like Python, with optional compile-time declarations to improve efficiency in cases where compiler can not predict types.

      Advantage is much fast code creation, with run-time safety, and option to get efficiency later.

      2. Well thought out data structures with nice language support.

      For example, ability to inline arrays and lists and symbols very conveniently in code. Ability to read complicated data structures (data files) without writing parsers, that are easier for humans to interpret a
    • Could someone proficient in LISP give me three cogent reasons to learn the language?

      It's sufficiently different from other languages outside the Lisp family so that learning it is an entertaining exercise.
    • I can just say what it helped for me, so it's subjective, but:

      1. Opened my eyes on how recursion should really be used, and improved my software design abilities a lot, since you're encouraged on writing new small functions and then put pieces together. LISP is built on LISP, and I found it a really educative language (and that's the same reason because I dislike Java, with its too-easy-to-become spaghetti-code). Moreover, in LISP it isn't just that a program has to work; it has to do it in an elegant way.
    • Could someone proficient in LISP give me three cogent reasons to learn the language?

      Try here [tech.coop]

    • Could someone proficient in LISP give me three cogent reasons to learn the language?

      Bacon-and-eggs things to help you write more robust code:

      • Powerful basic datatypes. Multidimensional extensible arrays with fill pointers. One-way/two-way/synonym streams, strings with fill-pointers, integer/rational/complex/floating-point/big/fixnum numbers, bit vectors, OOP with metaobject-protocol/{before/after/around}-methods/ multiple-inheritance/multiple-dispatch, errors/warnings/conditions. Etc.
      • Something l
    • There is really only one thing you need to know about lisp- Lisp essentially has NO SYNTAX. What this means is that your program is an abstract syntax tree that goes directly into the compiler.

      Compilers in other languages first need to convert the program into an AST before compiling the code. (this is a bit of an oversimplification, but essentially true.) If you want three reasons, I can explain the repercussions of programming directly in an AST:

      Elegance: In Lisp, you don't have to worry about idiosyncracies in the head of the language designers like you do in other languages: You don't have to worry about whether AND has precedence over EQUALS (Delphi programmers know this trap) you don't need to worry when a line needs to end in a semicolon, etc. etc.

      Macros: By being an AST, Lisp lets you trick the compiler into thinking it sees other code than is actually there. This is COMPLETELY DIFFERENT than so-called "macros" in other languages- In Lisp you can turn your programming language into basically ANY programming language you want, within the language itself. Read Peter's excellent book or check out this site [lisperati.com] for more info.

      Productivity: You can program in the purely-functional style that has been shown to increase programmer productivity by having a property called "referential transparency" and having the easily serializable syntax-expression format. Basically, with Lisp you can analyze/manipulate/automate the bejeezus out of your code very easily, under the mantra "code is data, data is code".

      That's what I like about Lisp, anyway...
    • by doc modulo ( 568776 ) on Thursday April 28, 2005 @05:54PM (#12377634)
      - C++ is more readable than assembler
      - C# and Java are more readable than C++ ...
      - At the end of this list are functional programming languages.

      If you can read source more easily, then maintainability will be better. Most projects maintain code, they write new code less often.

      This article [paulgraham.com] will tell you why you should be interested in functional programming languages (this link is about Lisp). If you're smart and open minded, you will be convinced.

      The best functional languages are Haskell [haskell.org] and Erlang [erlang.org] (click "next" at the bottom of the page). But like the review and link indicate, there's actual value to learning Lisp.

      However, the book review is much too in-depth and has jargon.

      A simpler example: with Java you prevent bugs by static typing variables, example:

      int numberOfTries = 3;

      If you later try to fill "numberOfTries" with a string, the compiler will warn you of a bug and you'll have prevented it. The Java compiler makes it a rule that you have to give a type to your variable so your code quality will be higher (fewer bugs).

      With Haskell, you don't have to type int. Haskell will figure out the type for you, you get the benefit of preventing bugs with the convenience of not having to type variables. There are other good features like that in functional programming languages.

      You could say that every language puts restrictions on what the programmer can do. I mean writing the source code is bottlenecked by the rules of the language (every variable should have a type. You can't do this/that etc.) so that the resulting code AUTOMATICALLY has fewer bugs. Well the amount of source "laws" in functional languages is much lower than in C++ and Java. This means that there is less to remember for a programmer and there is less chance for rules to conflict/interact with each other (in Java you can't use certain variable types in static classes = another meta rule to remember).

      Besides having less rules to remember and take into consideration. The functional languages have also chosen the best "laws" to follow. I mean that if you follow the source laws of Java, it's still relatively easy to produce buggy programs, with functional languages it's harder to produce implementation bugs (thinking bugs are always possible but that's your problem).

      The only problems with functional programming languages is that the rules which govern source code are very good, but also very different from the rules in traditional programming languages. It might seem like thinking upside down/backwards for people already familiar with procedural languages. Another problem is that because of humans sticking to what they know, the libraries of the functional languages aren't as extensive as those of Java for example. This means that you'll have to program more parts of your program yourself instead of just using a ready made library which fits the task. This problem is limited by the fact that you can program 10 times faster than in Java and, as I said, maintenance takes up most of the time anyway.

      The reason I chose Erlang is because with functional purely functional programming languages like Erlang, you can automatically multitask your program over several CPU's (or this will take minimal effort). Nice feature to have in the future because every CPU manufacturer is going multi-core chip now. The future is in multiprocessor machines, not higher clockspeeds (unless diamond wafers become viable) (Lisp is not purely functional by the way).

      Also, you can easily make a server that never goes down with Erlang because your server is automatically clustered. Just plonk down a couple networked PC's and if one dies, the server cluster will just keep on going (a bit slower) until you replaced the power supply of the broken PC.

      There are tons of other advantages but, as I said,
      • Oh man, your post has so many things wrong, I don't know where to start! And I am not trolling, this is serious: dissinformation should be stopped. Read on, please.

        C# and Java are more readable than C++

        C# and Java are not more readable than C++. If I write C++ code without templates, C++ code is 99% similar to C#/Java.

        At the end of this list are functional programming languages

        Functional languages are not more readable than C++/C#/Java. ML is bareable, but a long Haskell/Erlang/O'Caml program is

    • I am an ex-Lisper who strayed from the One True Language and am now in the process of regaining proficiency to rejoin the Lisp Priesthood. My motivation is that I am tired of the limitations I hit due to the deficiencies inherent in all the other supposed "modern" popular programming languages I've encountered. I also remembered really *enjoying* the whole process of rolling Lisp code, a joy I lost long ago when I strayed into the mass market of more socially acceptable programming languages.

      The deficien
  • Lisp Scheme (Score:4, Funny)

    by superpulpsicle ( 533373 ) on Thursday April 28, 2005 @05:06PM (#12377098)
    Lisp is essentially the same as scheme. It's the hardest language to write for IMHO just cause it's out of ordinary.

    There was a story of a hacker stole one of the A.I code from the government. The code turned out to be the last 100 pages of the program. It was all closing paranthesis. That should sum up how nasty the language is.

    • Lisp is essentially the same as scheme.

      Lisp is to scheme, as ,uhmm..., C++ is to Pascal. Apart from the parenthesis-heavy syntax, they have very little in common.

      It's the hardest language to write for IMHO just cause it's out of ordinary.

      Well, then you haven't looked very far. The hardest language language to write for is probably Malbolge [lscheffer.com].

      But there are plenty of more mainstream languages that are harder to write for than lisp. As a matter of fact, most mainstream languages are harder to write

    • by notany ( 528696 ) on Thursday April 28, 2005 @05:42PM (#12377461) Journal
      Comon Lisp and Scheme are as different as programming languages can be.

      Scheme can be said to be ontological attack against Lisp. It looks Lisp but is as far from Lispiness as you can and being still Lisplike.

      Schemer: "Buddha is small, clean, and serious."
      Lispnik: "Buddha is big, has hairy armpits, and laughs."
      -- Nikodemus

      Greenspun's Tenth Rule of Programming:
      "Any sufficiently complicated C or Fortran program contains an ad hoc informally-specified bug-ridden slow implementation of half of Common Lisp."

      Common Lisp people seem to behave in a way that is akin to the Borg: they study the various new things that people do with interest and then find that it was eminently doable in Common Lisp all along and that they can use these new techniques if they think they need them.
      -- Erik Nagggum

      More than anything else, I think it is the ability of Lisp programs to manipulate Lisp expressions that sets Lisp apart. And so no one who has not written a lot of macros is really in a position to compare Lisp to other languages. When I hear people complain about Lisp's parentheses, it sounds to my ears like someone saying:

      "I tried one of those bananas, which you say are so delicious.
      The white part was ok, but the yellow part was very tough and tasted awful."
      -- Paul Graham

      Lisp is about rising above implementation to saying something of lasting
      value. -- Kent Pitman

      Pascal is for building pyramids -- imposing, breathtaking, static structures
      built by armies pushing heavy blocks into place. Lisp is for building
      organisms -- imposing, breathtaking, dynamic structures built by squads
      fitting fluctuating myriads of simpler organisms into place.
      - Alan J. Perils

      Puns are pricey to have in the language becuase they lead to ambiguity
      but they are also a source of great expressional power, so we live
      withthem. People who don't like them should probably seek out Scheme,
      which tends to eschew puns, for better or worse.
      -- Kent M Pitman @ comp.lang.lisp

      Q: How can you tell when you've reached Lisp Enlightenment?
      A: The parentheses disappear.
      LISP has survived for 21 years because it is an approximate local
      optimum in the space of programming languages.
      -- John McCarthy (1980)

      ``Lisp has jokingly been called "the most intelligent way to misuse a
      computer". I think that description is a great compliment because it
      transmits the full flavor of liberation: it has assisted a number of our
      most gifted fellow humans in thinking previously impossible thoughts.''
      -- "The Humble Programmer", E. Dijkstra, CACM, vol. 15, n. 10, 1972

      Lisp is like a ball of mud--you can throw anything you want into it, and
      it's still Lisp".

      Java was, as Gosling says in the first Java white paper,
      designed for average programmers. It's a perfectly
      legitimate goal to design a language for average
      programmers. (Or for that matter for small children, like
      Logo.) But is is also a legitimate, and very different, goal
      to design a language for good programmers.
      -- Paul Graham

      > The continuing holier-than-thou attitude the average lisp programmer...

      There are no average Lisp programmers. We are the Priesthood. Offerings
      of incense or cash will do.

      -- Kenny Tilton at c.l.l

      Dalinian: Lisp. Java. Which one sounds sexier?
      RevAaron: Definitely Lisp. Lisp conjures up images of hippy coders,
      drugs, sex, and rock & roll. Late nights at Berkeley, coding in Lisp
      fueled by LSD. Java evokes a vision of a stereotypical nerd, with no
      life or social skills.

      In the Algol family, parentehses
      signal pain. In the Lisp family, they signal comfort. Since most people are
      highly emotional believers, even programmers, it is very hard for them to
      relinquish their beliefs in their associations of parentheses with pain and
      suffering. This has nothing to do with aesthetics, design rationales, ease
      of u
  • by daraf ( 739813 ) on Thursday April 28, 2005 @05:11PM (#12377165)
    (if (or (= lisp practical) (= lisp common)) (monkeys-fly-out 'my-ass) (life-as-normal))
  • Dylan - pretty Lispy (Score:3, Interesting)

    by aCapitalist ( 552761 ) on Thursday April 28, 2005 @05:12PM (#12377176)
    Dylan [gwydiondylan.org]

    seemed to have many of the benefits of Lisp without the prefix notation - macros, CLOS-based object system, multi-methods, multiple returns, optional type declarations, named parameters (I think), etc...

    Dylan was started by Apple Research Cambridge in the late 80s, but was laid to rest (at least for Apple) after Jobs came back and the NeXT infusion.

    At least Functional Objects opened up their stack and is now being incorporated by the above URL guys.
  • by Anonymous Coward
    Lately there has been a lot of LISP hype mostly thanks to Paul Graham. I keep hearing "Macros are amazing", "totally different way of thinking about programming".

    That's great and all but I can't find any concrete examples. I want to see a list of problems that are either difficult or nearly impossible with Java/C++ and see LISP's implementation.

    Can anyone help me to get past the hype?
  • Now there's an oxymoron if I ever saw one!
    • People who can't spell "practical" can't be expected to appreciate the finer things in life.
      • My spelling is poor.... that is why I code, instead of writing the next great American novel.

        Self modifying, recursive, spaghetti code I can do without..... but I have written a chunk of it.
        • Your assumption that all self-modifying and/or recursive code is spaghetti code belies the fact that you've never actually learned Lisp.

          I have always found that spelling and grammar skills are very important to good coding, as well. After all, it helps immensely to be able to spell your variable names correctly. Even if you spell them incorrectly consistently, someone else who is looking for the bugs in your code will probably decide that one of the bugs is your spelling, and will break more things tha
  • There IS a place for modern Lisp books!
  • by grumpyman ( 849537 ) on Thursday April 28, 2005 @05:18PM (#12377235)
    When I think of functional (lisp), my head's twisted and then unwinded. When I think of contraint-based (prolog), my head feels like upside-down. When I think of object-oriented, I think of org-chart. When I think of procedural, I think of spagetti.
  • I have a tutorial [slashdot.org] available that teaches lisp in comic-book form. It is geared to quickly ramp up a newbie to some very advanced lisp tool very quickly.

    It uses a free online telnet lisp that lets you try Lisp with zero install required.
  • Elisp feels very much like java to me -- everything appears to get passed by reference and you can use goops if you want objects. Guile and other variants don't behave the same way, which can catch you by surprise if you started out writing useful little utilities for Emacs. Elisp makes a lot of sense but it's not good at threading and stuff like that which other variants of lisp do have to one degree or another (Guile's threading seems to be pretty good though I haven't done a whole lot with it.)

    My bigge

  • by ari_j ( 90255 ) on Thursday April 28, 2005 @05:31PM (#12377336)
    Paul Graham [paulgraham.com]'s book, On Lisp [paulgraham.com], is the single best book on programming I have ever read. You can get it as a PDF from his website, for free [paulgraham.com].

    You will also want to read his essay, Revenge of the Nerds [paulgraham.com], for some serious insight into why Lisp is just so darn good.

    If you're just starting on Lisp, the best place to start is with GNU CLISP [cons.org], although you will find yourself wanting to use Emacs with SLIME [common-lisp.net] to interact with your Common Lisp environment. I use SBCL [sbcl.org], but CMUCL and CLISP are also acceptable. On my Powerbook, I use SLIME with OpenMCL [openmcl.org].
    • On Lisp is certainly a good book about one particular feature of Common Lisp (macros), but it's not a good introduction to the language.

      Frankly, I find both Seibel's Practical Common Lisp and Norvig's Paradigms of Artificial Intelligence Programming to be much better books on Common Lisp than anything Graham has written. Seibel has excellent practical examples dealing with current technologies, and Norvig's examples cover a very interesting subject matter not usually used when teaching a language.

  • by Anonymous Coward on Thursday April 28, 2005 @05:37PM (#12377384)
    To wonder why there isn't a -99 "Suicidally Boring" option when you're moderating...
  • by Florian ( 2471 ) <cantsin@zedat.fu-berlin.de> on Thursday April 28, 2005 @06:43PM (#12378215) Homepage
    It's amazing and somwhat sad that programming languages and runtime environments from Smalltalk to Java to Python to C#/.NET keep reinventing the wheel while a language from the 1950s has it all and does it even better - the most elegant syntax thinkable, powerful paradigms for code reuse, dynamic typing, modern memory management with no buffer overflows, and, with Common Lisp, one robust, industrial-strength language with a rich standard library that can both interpreted and compile code, obsoleting the difference between "programming" and "scripting" languages.

    The initial vision of the GNU system - remember "GNU's not Unix" - was to combine a kernel written in C for performance reasons with a userland written largely in LISP. Emacs is the only remnant of that idea, isn't even LISP in its program core, and uses its own LISP dialect instead of CLISP or Scheme. [The climacs [common-lisp.net] project, a CLISP reimplementation of Emacs, tries to fix that.]

    Two years ago, I saw a practical demonstration of a Symbolics LISP Machine from 1987. It was like seeing the light of the holy hacker grail - the first system whose userland was superior to commandline Unix in every aspect [Plan9 has superior kernel design to Unix/BSD/Linux, but its mouse-centric userland sucks IMHO]. Everything was in one language, syntax and namespace. You could hack and debug the kernel (written in LISP, too) while it was running [!], the commandline userland hooked into every aspect of the system, and could be endlessly and seamlessly extended it just through custom LISP functions and eval-ing them.

    Let's dream and hope that perhaps in one or two decades, when insight into the limitations of the Unix paradigm has become common sense, we will have a free Lisp OS as the next iteration of Free Software computing...

    • by noahm ( 4459 ) on Thursday April 28, 2005 @09:39PM (#12379488) Homepage Journal
      Two years ago, I saw a practical demonstration of a Symbolics LISP Machine from 1987

      The frightening thing is, lispms from the 80's enjoy quite some popularity among certain people where I work [mit.edu]. They really are amazing machines, and those who use them regularly feel strongly that there hasn't been a more usable environment in all the time since they were created.

      Let me tell you, though, as a sysadmin, these things can be a royal PITA. Not because there's anything wrong with them (well, except maybe for their complete lack of security) but they're just so different.

      There are still many copies of The Lisp Machine Manual [acm.org] lying around, including an early rant by RMS against the recent trend of software hoarding. It makes for an interesting read...

      noah

  • Practical Lisp? (Score:3, Insightful)

    by Zangief ( 461457 ) on Thursday April 28, 2005 @08:50PM (#12379218) Homepage Journal
    I have yet to find a lisp implementation that:

    1-it is open sourced.
    2-it has some GUI support (tk or gtk).
    3-it is cross platform (including the GUI support).
    4-it is estable, not in some estate of eternal beta.
    5-it is embeddable in a web server (yes, I know Mod_lisp exists. But, yet it doesn't comply with 2 or 3)

    If a young language, like Ruby or Python, can do this, why the hell Lisp, one of the oldest languages around, can't?!

    Until I find something like that, I can't say Lisp is practical, no matter how theoretically cool it is.

Like punning, programming is a play on words.

Working...