Monday, October 02, 2006

Scheme Death Knell?

As a subject of minor annoyance, Lambda the Ultimate has a bit suggesting that someone translate Hofstadter's Scientific American columns introducing Scheme to a general audience into Haskell. Yet more evidence that Scheme is losing its "cool" factor.

The thing is, I don't think there's any good reason for it. There is nothing wrong with Scheme. I think the only actual reason that people switch to Haskell and so on is just to jump a train. Scheme's been plugging along since 1975, and people therefore think it's time for something new.

Why Haskell? Here are the commonly-cited reasons:

  • Haskell is Purely Functional - apparently, Haskell is a purely functional programming language. Scheme has some impurities floating around herer and there. Well, wonderful. But I don't see the big deal. I mean, can it be a bad thing to allow some (limited) flexibility in the paradigm? I really do think this is going to be the hallmark of the next 5-10 years of PL design - this insistence on pure versions of various paradigms. And I also think it's silly. It's one thing for a language to support a particular paradigm and encourage its use, but to choose one paradigm exclusively is to deliberately exclude classes of users. But OK, ya'll have fun making your loop objects in Ruby, or doing monadic I/O in Haskell. Don't let me spoil the fun!

  • Monads - not that anyone actually knows what these are, but Monads are the shit, let me tell you. So this is the functional programmer's OOP. Monads are supposed to be some kind of huge foundational paradigm shift, but all they really are is a way to introduce sequencing and side-effects into the "purely functional" programming languages. Which of course just illustrates the point above: there is no sense in having a purely functional programming language!. Now, actually, I'm being too harsh. Monads may not be strictly necessary, but the fact that they had to be discovered to make Haskell work properly has led to more than one insight (demonstrating that seemingly unrelated computations in fact have related forms) in computation theory. So Monads are useful. It's just that it's a bit embarrassing to watch the Haskell people go all glowy over something that started out - let's be honest - as a workaround. They're scaffolding for people who like to pretend that programs are proofs - that programming is just math. But programming is more than that and we all know it.

  • Call-by-need - I can never put my finger on just why, but I think this is largely hype too. For those not in the know - "call-by-need" is one broad category of functional semantics a programming language can exhibit. The main ones are call-by-value, call-by-reference, call-by-name and call-by-need. The overwhelming majority of PLs use call-by-value. This means two things - broadly: (1) when you pass a value to a function parameter, the function will not change the value passed. It may perform operations on it using private variables, but it will not actually change the caller's value unless you ask it to. This is distinct from call-by-reference, where variable names all refer, thoughout a program, to the associated memory register. In call-by-refernece, when you name a variable inside a function x, it's the same x as any variables by that name outside the function. Parameters passed to functions are the same as the variables associated with them. Run-time efficient, but computationally confusing. (2) Arguments are evaluated before being passed to the function. This is the disctinction with call-by-name. In call-by-name, arguments are passed as they are to functions. So - to use one of Friedman's examples - the difference can be seen in the return value of this function:

    fun x = x + x

    Looks like a function that doubles its argument, right? And under call-by-value it is - becuase x gets evaluated before it's passed. But with call-by-need it isn't necessarily. If we said:

    x(random 10)

    we might not get double anything - might get an odd number. And that's because in call-by-name what gets passed is (random 10) itself. So for each x in the body it is reevaluated. This seems silly, but it's actually very useful in some cases because it prevents code from being unnecessarily evaluated. In addition to sometimes being an efficiency gain (though not always), this has the huge advantage of minimizing chances of going into infinite loops.

    Well, call-by-need is supposed to be the best of both worlds. It has the lazy evaluation of call-by-name, but once an argument has been evaluated it also remembers that value so that the semantics come out right - i.e. our example function is a doubling function for all arguments again.

    I dunno - I can't prove it but I think there's something cheesy about this. It's another smug Haskell pretend solution - something just tells me so. On the documented side - it is true that evaluation order becomes a problem here. I won't give a motivating example because I think this is probably obvious from the example above. Now, evaluation order isn't always such a big deal in functional langages (especially, one presumes, in purely functional languages...), but it could still be annoying I think. But until I can come up with something better than "evaluation order problems," I think I'm going to have to admit that this feature of Haskell is indeed Very Cool. After all, evaluation order problems are less severe than the enhanced potential infinite loop problems that Scheme's call-by-value paradigm has.

So anyway - lots of the stuff that's supposedly cool about Haskell is...well, cool, but maybe not as cool as we're often led to believe. To all of the above I just want to say: I admit that call-by-need is probaby cool. Monads are cool too, but maybe not to the extent people wet their pants over them (and anyway they're supported in Scheme too). The purely functional stuff is crap and is actually an argument against Haskell, in my opinion. But then, I underestimate the extent to which some people are born with the functional programming gene.

In any case, I think Haskell is a fad, and one that has already peaked, at that. It's here to stay, don't get me wrong, but it definitely isn't the Next Big Thing - neither in the functional programming subculture nor in the real world of industry programming.

Which is why I get a little annoyed that so many Haskell hackers think Scheme should just step aside. This town's definitely big enough for both of us, thanks partner.


At 12:22 AM, Anonymous Anonymous said...

I was once fluent in Scheme and ML; I'm currently learning Haskell. Why isn't Scheme my choice?

Static typing: I like a language that helps catch my silly mistakes.

Module system: Can't program without one. Can't believe Scheme doesn't have one.

Support for standalone utilities: With reasonable effort, I can build a Haskell executable that looks pretty much like any other Linux executable.

Powerful libraries and utilities: Spend my time on new stuff instead of re-inventing wheels.

I don't hate Scheme by any means. But in 2006 I prefer ML or Haskell in almost every case.

At 3:26 AM, Blogger Harald Korneliussen said...

I think the reason why people are jumping on to the new train is not because of Haskell, but because of scheme. It just hasn't become what people hoped for, which isn't so strange. Like all lanugages it's made to be useful to its makers, and what do they want to? They want to create new languages...
No functional language will replace the popular imperative ones (C#, Java) unless the inventor(s) have long experience in designing and implementing the sorts of applications those languages are used for - ideally in teams with less educated and skilled programmers.

At 9:56 AM, Anonymous Anonymous said...

You addressed the reasons why some people might prefer Scheme to Haskell, but failed to address the specific use-case that the article referenced by LtU points to: which language is a better tool for introducing people to programming.

The author of that article explains several areas where Haskell seems to offer advantages over Scheme as an introductory tool (e.g. syntax, strong typing, pattern matching.) The disadvantages are well-known and no one is going to aim to cover monads in any great depth in an introductory course, but it is quite possible that "the ultimate teaching language" was not actually invented when Steele and Sussman came down from the mountain bearing a spool of 9-track magtape...

At 11:25 AM, Anonymous Anonymous said...

I'm a Scheme programmer by choice. In fact, I never use Haskell. Still, I can't help but point out a few flaws in your thinking.

Yes, Haskell is purely functional. There is a reason for this purity -- the people who developed Haskell were interested in it. Both Scheme and Haskell are the product of academia. A purely functional language has some advantages over an impure language: stronger invariants. Presumably, this means that the language can have better compilers (outside of whole-program compilers) and easier analysis by humans. But I'm not going to argue about how useful any of this is. After all, I use Scheme because most of my code is just throwaway code used to express an algorithm or idea. I don't need the formality.

With that being said, I have used monads in Scheme. In fact, continuation-passing style (used to implement backtracking, for example) is monadic. Monads are an inherently useful way to structure sequential code that has some state or effects threaded through it. It's easy to get distracted by category theory, just ignore that stuff unless you are interested in denotational semantics ;)

Call-by-need makes sense in a functional language like Haskell. Since all `impure' computations must be built using monads, there's no reason for call-by-value. And call-by-need (plus pattern matching, of course) lets recursive definitions be written in a style that closely matches their mathematical definition. Call-by-need is really just a technique for implementing call-by-name in a purely functional language; arguments to functions are memoized so that they are evaluated only once. Because the language is referentially transparent, this has the same semantics as call-by-name. In a referentially transparent language, (RANDOM 10) would yield the same value without regard for context. So fun x = x + x would ALWAYS double the value, since the argument expression always yields the same value.

But, all of that aside, I think I understand your underlying concern about Haskell. It doesn't matter whether somebody labels programming as an art, a science, or an engineering discipline. In the end, if it is a commercial project then you are building something with a budget, requirements (hopefully), and a deadline. Is Haskell the best choice for your project? Who knows; it all depends on the task at hand and the technical abilities of the team. After all, good work can be done in Haskell. And good work can be done in Scheme.

At 3:55 PM, Anonymous Anonymous said...

So somebody wants to translate an article to a different language. Why so defensive? Can it be a bad thing to give people a choice in learning programming languages?

At 2:01 AM, Anonymous Anonymous said...

You are certainly, deeply misguided on your assesment of semantics. First, the body of work on cbv, cbn and friends is enormous, I mean, ENORMOUS and dates as far as 60's. It is extremely formal, many times elegant and often very enlightening. That topic is still extensively researched these days and new, important results pop all of the time (see for example recent Wadler's work:

There is *absolutely* totally nothing cheesy in the call-by-name, or any other formal semantics of this sort. Call-by-name and call-by-need have their proper, important place in the PL semantics. Unless you want to overthrow decades worth of deep research which evidently you didn't even skim.

So, it looks like you need to get up to basic facts and even terminology of PL semantics. Any introductory text on lambda calculus will probably do. Also, don't forget to read the uber-influential paper by Hughes: "Why functional programming matters?" ( I am sure you will "catch" it why call-by-name is actually useful and important.

Cross my fingers on your making these things clear to yourself. Don't preach until you do :)

At 4:04 PM, Anonymous Anonymous said...

It sounds like you haven't really given Haskell a good chance. Try it for a while and you might see the benefits of nonstrict semantics, referential transparency, monads, static typing, etc.

Static typing is a really important one. When I write programs in scheme or lisp, I find myself really annoyed with the bugs that end up in my programs which I feel should have been caught by the compiler.

I'd rather find my bugs early than end up looking at my output and saying "Well, that's wrong, I wonder why?" and having to trace through things in order to find something that would have been a type error.

Monads are very cool, and I would think that anyone who loves scheme would really love monads as well. Basically, monads are just a really good way to structure combinator libraries for embedded domain specific languages. As a result of the abstraction, you can write code which will run in every monad (usually control-structure-like things), or a wide class of monads, and accomplish related, but different tasks. I was actually thinking about writing a scheme which handled IO and other side effects monadically and had a similar do-syntax to Haskell's.

Laziness/non-strict semantics is good for composability, which is something that you should know if you watched the SICP lectures. :) It's not just simple stream-processing that it's good for either (though that does capture the general idea rather well). It helps you decompose problems in ways that you just can't do in a strict language.

Referential transparency is something that even most scheme programmers value. Certainly when I learned scheme in university, we were required to write our programs in a maximally referentially-transparent way. It helps with debugging, it helps with program correctness, and just plain thinking about the code, it's just a good idea.

One of the things that really stood out for me while watching the SICP lectures recently was the fact that the discipline used in constructing datastructures is basically exactly the same one imposed by ML and Haskell's algebraic datatypes.

Anyway, I think you'd get more of the idea if you'd actually write some code in Haskell. I don't think anyone's saying that scheme is bad, it's just that Haskell is pretty damn cool, and you should really check it out. :)

At 2:39 PM, Blogger jto said...

Don't listen to these guys. Especially the ones saying, "Basically, monads are just XYZ." No such XYZ exists, I promise.

You are right: there is a problem with not evaluating arguments until the value is needed. Well, two problems. First, because the order in which things are evaluated is not the order things appear in source code, it's hard to imagine a debugger that could possibly be as sweet as debuggers in procedural languages.

More importantly, the unevaluated arguments take up memory. Thus a function like

f x = x + 1

is a ticking time bomb in Haskell. It's only a matter of time until someone calls that sucker in a loop and consumes all your memory with unevaluated thunks that say "((((...) + 1) + 1) + 1)".

I am dead serious. When you run your Haskell program and it goes to 1GB before grinding to a halt, the first thing you need to check is make sure you're not trying to do anything really crazy, like basic arithmetic.

I want to emphasize that I like math, and I like Haskell, and I wish it were all dandelions and body shots. But no one has said anything about this problem that made me feel that using Haskell for a serious project could possibly be classified as sane.

At 2:42 PM, Blogger jto said...

One more thing. Haskell has in fact been used for a serious project. Darcs.

Darcs is a version control system written entirely in Haskell. It's frankly brilliant. It was apparently founded by 16 aircraft engineers, or something. I thought it was so cool I switched from Perforce to darcs after using it only a few times.

The next day I did a merge and darcs hung. I swear, this was, like, the second thing I tried to do. Turns out this is such a typical problem there's a whole mailing list, darcs-conflicts. Certain kinds of conflict cause darcs to go into this explosive combinatorial search. This problem has existed for months, I dunno, maybe years. I bring up this anecdote because the bug really feels like a different kind of bug. A really annoying kind. The kind you would get if you thought of programming as math.

At 9:50 PM, Anonymous Anonymous said...

A crucial benefit of being pure: it enables automatic deforestation in the compiler.

At 10:37 PM, Anonymous Anonymous said... book painting, book complete decorative painting, book oil painting, big book drawing figure painting, book face painting, book painting tole, big book decorative painting, big book in nature painting watercolor, book decorative painting, acrylic book light north painting technique, book glass painting, big book in nature oil painting, artist book material oil painting technique today, big book in nature painting pastel, book hausers painting pattern Priscilla, acrylic beginner book painting project, book book kells painting, book butterfly face painting, book painting watercolor, book club creative painting, book look painting reading text, book craft painting, art book folk painting, book complete drawing painting, book face painting usborne, big book nature painting watercolor, book decorative hausers painting Priscilla, book decorative painting technique, book gourd painting, acrylic book painting dedicated hosting server, hosting server sql, hosting server, dedicated hosting server web, hosting server web, hosting server sql web, game hosting server, hosting managed server, dedicated game hosting server, dedicated hosting linux server, exchange hosting server, cheap dedicated hosting server, canadian dedicated game hosting server, dedicated hosting server virtual web, dedicated hosting server window, asp hosting server sql web, cheap dedicated hosting server web, hosting linux server web window, hosting server unix web, free hosting server web, dedicated hosting server site web, dedicated hosting server virtual, hosting server toronto, hosting linux server web, hosting server virtual web, hosting server virtual, colocation hosting server, hosting server web window, dedicated hosting linux server web, ecommerce hosting server virtual web, domain hosting server web, cheap hosting server services web, hosting private server virtual, 2003 hosting server web window, dedicated hosting server web window, dedicated hosting managed server, design hosting server server virtual web, hosting server toronto web
4dedicated-server-hosting.netdedicated hosting server, hosting server sql, hosting server, dedicated hosting server web, hosting server web, hosting server sql web, game hosting server, hosting managed server, dedicated game hosting server, dedicated hosting linux server, exchange hosting server, cheap dedicated hosting server, canadian dedicated game hosting server, dedicated hosting server virtual web, dedicated hosting server window, asp hosting server sql web, cheap dedicated hosting server web, hosting linux server web window, hosting server unix web, free hosting server web, dedicated hosting server site web, dedicated hosting server virtual, hosting server toronto, hosting linux server web, hosting server virtual web, hosting server virtual, colocation hosting server, hosting server web window, dedicated hosting linux server web, ecommerce hosting server virtual web, domain hosting server web, cheap hosting server services web, hosting private server virtual, 2003 hosting server web window, dedicated hosting server web window, dedicated hosting managed server, design hosting server server virtual web, hosting server toronto web dedicated hosting server, hosting server sql, hosting server, dedicated hosting server web, hosting server web, hosting server sql web, game hosting server, hosting managed server, dedicated game hosting server, dedicated hosting linux server, exchange hosting server, cheap dedicated hosting server, canadian dedicated game hosting server, dedicated hosting server virtual web, dedicated hosting server window, asp hosting server sql web, cheap dedicated hosting server web, hosting linux server web window, hosting server unix web, free hosting server web, dedicated hosting server site web, dedicated hosting server virtual, hosting server toronto, hosting linux server web, hosting server virtual web, hosting server virtual, colocation hosting server, hosting server web window, dedicated hosting linux server web, ecommerce hosting server virtual web, domain hosting server web, cheap hosting server services web, hosting private server virtual, 2003 hosting server web window, dedicated hosting server web window, dedicated hosting managed server, design hosting server server virtual web, hosting server toronto we antique collectible, antique collectible paper vintage, kovels antique and collectible, antique collectible price, antique collectible ebay fortune make sell, shopping antique and collectible, antique amp collectible, antique collectible ebay, antique collectible com ebay, antique and collectible furniture, antique collectible auction, antique and collectible bike, antique collectible game toy, antique and collectible toy, antique marbles and collectible, antique clock collectible watch, antique collectible figurine, antique collectible book, antique button collectible identification values, antique collectible doll, antique collectible jewelry, antique china collectible glass porcelain, 20,000 antique collectible in job leaving make without year, antique and collectible ceramics and pottery, antique coca cola collectible, 1950s antique collectible memorabilia, antique collectible stanley tool, antique collectible insulator, golf collectible and antique, antique and collectible militaria, antique collectible road show, antique and collectible beer steins and glasses, antique auction collectible jewelry, collectible antique clock, antique and collectible stamp, antique art collectible, antique collectible memorabilia, antique collectible web site, antique collectible guide modern price schroeders toy, antique car collectible, antique collectible show, antique collectible glass, antique collectible guide price, collectible antique coin, art collectible hobby antique, antique avon collectible, antique and collectible phone card, antique and collectible clothing, antique collectible fishing rod identification and value guide, antique collectible tennis, antique antique collectible collectible golf golf guide price reference, antique collectible figurine shopping, antique and collectible radio, antique collectible appraisal, selling antique and collectible, antique collectible guide identification office typewriter value, antique collectible dallas, antique collectible country french 4cheap-laptops cheap laptop, cheap laptop computer, cheap new laptop, used laptop for sale cheap, cheap used laptop, cheap dell laptop, cheap refurbished laptop, cheap laptop uk, cheap dell laptop computer, cheap laptop battery, cheap used laptop computer, cheap hp laptop, cheap laptop for sale, cheap gaming laptop, new cheap laptop computer, cheap laptop notebook, cheap apple laptop, cheap notebook computer laptop, buy cheap laptop, cheap acer laptop, cheap sony laptop, cheap laptop memory, cheap toshiba laptop, laptop wholesale cheap, cheap mac laptop, very cheap laptop, laptop deal cheap, cheap laptop hard drive, cheap laptop cases, cheap refurbished laptop computer, cheap discount used notebook laptop, cheap price laptop, cheap alienware laptop, cheap laptop computer sale, cheap laptop for student, 17 cheap laptop notebook toshiba wireless, cheap laptop bag, buy a cheap laptop computer, best cheap laptop, cheap gateway laptop, cheap laptop discount computer, cheap sony vaio laptop, cheap laptop pc, really cheap laptop, cheap wireless laptop, cheap dell laptop battery, cheap computer dell laptop warranty, cheap laptop in the uk, cheap good laptop, cheap used refurbished laptop, dirt cheap laptop, cheap second hand laptop, cheap laptop part, refurbished computer laptop cheap discount, cheap cords laptop power, cheap discount laptop, cheap compaq laptop, cheap laptop online, cheap laptop computer uk, cheap laptop Canada, cheap laptop backpack, cheap ibm laptop, accessory cheap laptop, cheap free laptop computer, cheap dell laptop warranty, acer cheap computer laptop, cheap free laptop desktop computer, dell desktop computer, hp desktop computer, cheap desktop computer, free computer desktop icon, compaq desktop computer, best desktop computer, gateway desktop computer, sony desktop computer, free computer desktop wallpaper, free computer desktop calendar, refurbished desktop computer, computer desktop wallpaper, desktop computer best deal, desktop computer for sale, desktop computer review, ibm desktop computer, used desktop computer, free desktop computer, desktop computer system, custom desktop computer, desktop computer buy, emachines desktop computer, desktop computer cases, discount desktop computer, apple desktop computer, coming computer desktop fab fabrication from personal personal revolution, computer desktop calendar, computer desktop pcs, acer desktop compute diamond jewelry, diamond jewelry store, diamond jewelry journey, black diamond jewelry, diamond jewelry man, diamond jewelry wholesale, diamond discount jewelry, commercial diamond jewelry journey song, designer diamond jewelry, diamond jewelry ring, diamond fine jewelry, diamond estate jewelry, center diamond jewelry, diamond gold jewelry, bargain diamond jewelry jewelry product, body diamond jewelry, diamond jewelry tk tk, diamond forever jewelry, antique diamond jewelry, blue diamond jewelry, diamond fake jewelry, diamond indian jewelry, diamond jewelry watch, design diamond jewelry, custom diamond jewelry, diamond jewelry platinum, diamond jewelry online, diamond jewelry store Whitehall, design diamond indian jewelry, cheap diamond jewelry gold bullion, buy gold bullion, gold bullion coin, gold bullion prices, gold bullion bar, best buy for gold bullion coin, gold bullion for sale, american eagle gold bullion coin, where to buy gold bullion, us gold bullion, gold silver bullion, bullion buy coin gold online, bullion buy gold houston in, gold bullion dealer, buying gold bullion, buy gold coin bullion, board bullion buy coin gold message, eagle gold bullion coin, investing in gold bullion, purchase of gold bullion, bullion demand gold, sell gold bullion, buy and sell gold bullion, gold coin and bullion dealer, gold bullion seller, gold bullion buyer, bullion buying gold selling Virginia, buffalo gold bullion, gold bullion picture, gold bullion spot prices, buy gold bar bullion, gold bullion investment, buy gold bullion online coin gold, coin gold us, buy coin gold, american coin eagle gold, coin gold price, coin dealer gold, hocolate coin gold, bullion coin gold, coin gold title, buffalo coin gold, coin gold sell, coin gold rare, coin gold value, coin eagle gold, coin gold investment, coin gold silver, coin gold Mexican, coin gold world, coin gold jewelry, coin gold panda, canadian coin gold, coin gold values, best bullion buy coin gold, american coin gold, coin gold ring, buying coin gold, american bullion coin eagle gold, coin gold leaf maple, buy coin gold sell, coin gold liberty, coin dollar gold twenty, canadian coin gold leaf maple, american buffalo coin gold jewelry store, online jewelry store, famous jewelry store, jewelry store illinois, diamond jewelry store, kay jewelry store, jewelry store los angeles, fine jewelry store, whitehall jewelry store, tiffany jewelry store, jareds jewelry store, kays jewelry store, gordons jewelry store, zales jewelry store, jared jewelry store, jeweler jewelry rogers store, retail jewelry store, ben bridges jewelry store, riedmans jewelry store, jewelry and watch store, peoples jewelry store, accessory jewelry silverware store, claires in jewelry ohio store, brighton jewelry store, samuels jewelry store, cartier jewelry nyc store, james avery jewelry store, jewelry store Houston, tiffanys jewelry store, crescent jewelry store, discount jewelry store, indian jewelry store, claires or icing jewelry store, claires jewelry store, littman jewelry store antique car, antique car for sale, antique car insurance, antique car part, antique pedal car, antique ford car, antique car prices, antique car values, antique classic car, antique car show, antique classic car for sale, picture of antique car, 1950 antique cadillac car, antique car insurance online quote, antique toy car, antique car value, antique car sales, antique car trader, antique car restoration, antique car auction, antique car rental, antique car appraisal, antique car classic insurance, sell antique car, antique car blue book, antique car pricing, antique car loan, antique car radio, antique car tire, antique car com ebay, antique model car, antique car and truck, antique peddle car, antique car dealer antique and classic, auto antique classic, auto antique classic restoration repair, antique classic car, antique classic car for sale, antique auto classic trader, antique car classic insurance, automobile antique and classic, auto part antique classic, classic and antique trader, antique classic fishing fly tackle, ebay classic antique car, classic antique and interior, antique car classic museum tractor truck vehicle vintage, antique and classic boat society, antique car car classic reference, antique and classic boat, antique car car classic values, antique classic car show, classic antique truck, antique and classic car and truck for sale, antique classic car part, antique and classic auto for sale, car insurance for a antique classic car, classic car antique car part antique furniture, chinese antique furniture, antique reproduction furniture, american antique furniture, asian antique furniture, antique bedroom furniture, antique french furniture, antique oak furniture, antique furniture hardware, antique dining room furniture, antique victorian furniture, antique furniture restoration, antique furniture appraisal, antique and collectible furniture, antique office furniture, antique pine furniture, antique baby furniture, antique wicker furniture, antique furniture refinishing, antique english furniture, antique italian furniture, antique furniture store, antique furniture dealer, european antique furniture, antique white furniture, antique furniture prices, antique furniture Chicago, antique furniture auction, ebay antique furniture, antique reproduction french furniture, antique furniture value lookup, antique furniture repair diamond earring, diamond earring stud, diamond earring hoop, diamond earring man, cut diamond earring princess, cut diamond earring princess stud, black diamond earring, diamond drop earring, chandelier diamond earring, diamond earring pearl, chanel diamond earring, diamond earring sapphire, diamond earring, diamond discount earring, diamond arring yellow, cheap diamond earring, diamond earring gold white, clip diamond earring, diamond earring solitaire, diamond earring pink, diamond earring jacket, diamond earring huggie, blue diamond earring, dangle diamond earring, diamond earring gold, diamond earring fake, diamond earring pave, diamond discount earring stud, 1 carat diamond earring, baby diamond earring, cluster diamond earring, diamond earring stud wholesale, cut diamond earring emerald, diamond earring jewelry, diamond earring leverback, cheap diamond earring stud, diamond earring heart, antique diamond earring, diamond earring gold hoop white, diamond earring platinum, diamond earring gold stud white diamond engagement ring, platinum diamond engagement ring, pink diamond engagement ring, princess cut diamond engagement ring, antique diamond engagement ring, diamond solitaire engagement ring, white gold diamond engagement ring, diamond and sapphire engagement ring, emerald cut diamond engagement ring, cheap diamond engagement ring, pave diamond engagement ring, wholesale diamond engagement ring, yellow diamond engagement ring, diamond engagement ring setting, design own diamond engagement ring, vintage diamond engagement ring, blue diamond engagement ring, zales diamond engagement ring, cushion cut diamond engagement ring, black diamond engagement ring, discount diamond engagement ring, unique diamond engagement ring, diamond ring diamond engagement anniversary, gold diamond engagement ring, asscher cut diamond engagement ring, marquise diamond engagement ring, real diamond engagement ring, emerald diamond engagement ring, diamond and ruby engagement ring, three stone diamond engagement ring, canary diamond engagement ring, ring diamond engagement anniversary, designer diamond engagement ring, diamond engagement wedding ring, antique style diamond engagement ring, heart shaped diamond engagement ring, heart diamond engagement ring, diamond jewelry engagement ring, princess diamond engagement ring diamond ring, diamond engagement ring, diamond ring wedding, diamond man ring, diamond engagement platinum ring, diamond promise ring, antique diamond ring, diamond ring setting, diamond ring solitaire, 3 diamond ring stone, anniversary diamond ring, diamond pink ring, cut diamond princess ring, diamond ring sapphire, diamond hand right ring, blue diamond ring, diamond platinum ring, diamond engagement pink ring, diamond platinum ring wedding, diamond ring set wedding, cut diamond engagement princess ring, diamond ring stone three, black diamond ring, antique diamond engagement ring, diamond engagement ring solitaire, diamond eternity ring, cut diamond emerald ring, diamond gold ring white, buying diamond guide ring, cheap diamond ring, design diamond ring, diamond ring wholesale, diamond ring yellow, diamond pave ring, 3 anniversary diamond ring stone, diamond man ring wedding, diamond gold ring wedding white, diamond ring ruby, diamond ring vintage gold jewelry, black hills gold jewelry, indian gold jewelry, gold body jewelry, white gold jewelry, wholesale gold jewelry, man gold jewelry, 14k gold jewelry, gold hip hop jewelry, silver and gold jewelry, rose gold jewelry, discount gold jewelry, gold jewelry metal other precious silver, italian gold jewelry, 22k gold jewelry, india gold jewelry, gold diamond jewelry, child gold jewelry, gold coin jewelry, 22kt gold jewelry, baby gold jewelry, 18k gold jewelry, gold plated jewelry, cheap gold jewelry, fine gold jewelry, berg jewelry black hills gold, egyptian gold jewelry, sell gold jewelry, jewelry gold charm, celtic gold jewelry, silver and gold designer jewelry, 14k gold body jewelry, gold cross jewelry, cat gold jewelry, gold jewelry manufacturer, 14kt gold jewelry, 24k gold jewelry gold price, current gold price, gold price spot, gold live price, gold price today, current gold market price, gold price silver, coin gold price, current gold price silver, gold kitco price, bullion gold price, gold ounce per price, gold kitco price spot, current gold live price, gold news price, gold in india price, gold price silver spot, gold market price, gold gram per price, chart gold price, daily gold price, gold history price, gold historical price, gold price scrap, gold monex price, gold ounce price, current gold monex price silver, gold live price spot, gold live market price, gold india price, future gold price, current gold price spot, gold index price quote, gold price world, forecast gold price pocket watch, antique pocket watch, elgin pocket watch, from pocket watch, waltham pocket watch, old pocket watch, hamilton pocket watch, pocket watch chain, gold pocket watch, antique elgin pocket watch, vintage pocket watch, illinois pocket watch, railroad pocket watch, digital pocket watch, bahamas man pocket tommy watch, man pocket watch, colibri pocket watch, swiss army pocket watch, fullmetal alchemist pocket watch, finely handcrafted pocket watch, antique waltham pocket watch, mechanical pocket watch, tommy bahamas pocket watch, howard pocket watch, silver pocket watch, pocket watch repair, musical pocket watch, pocket watch display case, hampden pocket watch, swiss pocket watch, pocket watch part, timex pocket watch, from pocket watch watch, bella bella cosa cosa library pocket watch, omega pocket watch, rolex pocket
designer watch, designer watch wrist, designer man watch, designer replica watch, designer discount watch, designer watch womens, designer watch wholesale, designer luxury watch, cheap designer watch, designer fake watch, designer lady watch, designer imitation watch, designer faux watch, designer watch woman, designer knockoff watch, designer inspired watch, designer online watch, designer knock off watch, designer gucci watch, designer unique watch, designer diamond watch, designer replica watch wholesale, designer movado watch, buy designer watch, brand designer watch, clearance designer man watch, brand designer name watch, designer sale watch, designer leather watch, band designer watch, designer diamond sale watch, designer gold sports watch, chronograph designer round watch, concord designer watch, designer find watch, designer poljot watch fashion jewelry, wholesale fashion jewelry, wholesale fashion jewelry from china, premier design high fashion jewelry, wholesale jewelry costume fashion, fashion costume jewelry, indian fashion jewelry, cheap fashion jewelry, cookie lee fine fashion jewelry, fashion high jewelry wholesale, fashion jewelry importer, high fashion jewelry, cookie fashion jewelry lee, discount fashion jewelry, monet fashion jewelry, trendy fashion jewelry, fashion jewelry wholesaler, fashion jewelry style watch, fine fashion jewelry, fashion jewelry manufacturer, fashion jewelry designer, fashion jewelry and accessory, wholesale supplier costume jewelry fashion jewelry, fashion jewelry store, fashion silver jewelry wholesale, custom fashion jewelry, wholesale designer fashion jewelry, chanel fashion jewelry, man fashion jewelry, thug fashion hip hop jewelry, fashion jewelry pendant wholesale, indian wholesale fashion jewelry, fashion jewelry necklace, fashion jewelry set, jewelry fashion bead, cheap wholesale fashion jewelry wholesale jewelry, wholesale costume jewelry, wholesale fashion jewelry, wholesale body jewelry, wholesale silver jewelry, wholesale sterling silver jewelry, wholesale jewelry casting, wholesale jewelry supply, wholesale gold jewelry, wholesale jewelry box, wholesale jewelry display, wholesale fashion jewelry from china, wholesale jewelry finding, wholesale jewelry making supply, wholesale jewelry costume fashion, wholesale diamond jewelry, wholesale rhinestone jewelry, wholesale jewelry bead, stainless steel wholesale jewelry, body piercing jewelry wholesale, wholesale magnetic jewelry, wholesale indian jewelry, cheap wholesale body jewelry, hip hop jewelry wholesale, wholesale cz jewelry, wholesale jewelry supplier, wholesale jewelry gift box, wholesale imitation jewelry, wholesale crystal jewelry, wholesale jewelry distributor, fashion high jewelry wholesal cheap mp3 players, cheap portable mp3 players, cheap creative mp3 player, buy cheap mp3 player, cheap ipod mp3 player, cheap mp3 players for sale, cheap mp3 players uk, best cheap mp3 players, very cheap mp3 player, cheap mp3 player video, cheap sony mp3 players, cheap 1gb mp3 players, cheap cheap mp3 mp3 player player, car mp3 players cheap, cheap sandisk mp3 player, mp3 players for cheap prices, cheap mp3 cd players, samsung chip mp3 player, cheap memory mp3 player, cheap ipod mp3 player used, good mp3 players for cheap, cheap iriver mp3 players, cheap mp3 player 512mb, progressive scan portable dvd player cheap mp3 Search Term mp3 players, myspace mp3 player, cheap mp3 players, flash mp3 player, flash mp3 myspace player, portable mp3 players, sony mp3 player, sandisk mp3 player, creative mp3 player, samsung mp3 player, mp3 digital media players, discount mp3 players, mp3 player review, microsoft mp3 player, download free mp3 music player, iriver mp3 player, creative zen mp3 player, best mp3 player, mp3 cd player, free mp3 players, generator mp3 myspace player, flash generator mp3 myspace player, ipod mp3 player, free mp3 player download, myspace mp3 player code, mp3 video player, mp3 player accessory, music mp3 player, rca mp3 player, mp3 player kid, creative lab mp3 player, download mp3 player, download music to mp3 player, rio mp3 player, buy mp3 player, mp3 player sansa, zen mp3 player, car mp3 player, mp3 player 1gb, coby mp3 player discount laptop, discount laptop computer, discount laptop battery, student discount on laptop, discount dell laptop, discount laptop notebook computer, cheap discount used notebook laptop, dell laptop discount computer, cheap laptop discount computer, discount wireless laptop, battery dell discount laptop, coupon dell discount laptop, laptop and desktop discount dell computer, discount sony laptop, computer discount laptop refurbished, refurbished computer laptop cheap discount, military discount laptop, discount laptop notebook, cheap discount laptop, discount apple laptop, discount laptop toshiba, discount refurbished laptop, discount electronics laptop, discount laptop new, discount laptop cases, cheap computer discount laptop laptop refurbished, discount laptop pc, cheap laptop discount notebook computer, discount laptop bag, laptop memory discount, discount sony vaio laptop, discount laptop wholesale, discount laptop used, discount laptop hard drive, discount hp laptop luxury watch, swiss luxury watch, man luxury watch, replica luxury watch, luxury watch brand, designer luxury watch, luxury watch for sale, discount luxury watch, used luxury watch, luxury wrist watch, authorization luxury return sports watch, luxury swiss watch brand, horlage jaeger lecoultre luxury watch, pre owned luxury watch, fine luxury watch, luxury limited edition watch, luxury return sports watch, luxury diamond watch, gold luxury watch, horlage jeager lecoultre luxury watch, lady luxury watch, womens luxury watch, wholesale luxury watch, luxury replica swiss watch, luxury watch woman, buy luxury watch, discontinued discounted luxury man watch, constantin horlage luxury vacheron watch, luxury watch review, horlage jaegerlecoultre luxury watch, luxury rolex watch, luxury watch store dvd player software, free dvd player software, free dvd player software download, dvd player software download, free dvd movie player software, pc dvd player software, best dvd player software, dvd dvd player player software software, dvd player software free ware, dvd dvd free player software win, free dvd player software for pc, computer dvd player software, computer dvd free player software, dvd player software review window dvd player software, totally free software dvd player, dvd free player region software, dvd player software for mac, dvd movie player software, dvd free player power software, dell dvd player software, free dvd player software window, buy software dvd player, power dvd player software, free trial dvd player software, sony dvd player software, buy cheap dvd player software, dvd player software window xp, linux dvd player software, dell free software dvd player, free dvd player software for window 98, dvd free player software windvd, decoder dvd free player software, dvd free nec player software, decss dvd player software, window media player dvd software, downloadable dvd free player software, dvd free player software video, share ware dvd player software, codec dvd media player software window, dvd player software video, decoder dvd player software, best dvd free player software, dvd audio player software, dvd media player software, free dvd and cd software players 4used-laptops used laptop, used laptop computer, used laptop for sale cheap, cheap used laptop, used dell laptop, used laptop for sale, cheap used laptop computer, used laptop free, used laptop computer for sale, used apple laptop, giga laptop new used Zealand, used laptop part, used ibm laptop, used laptop notebook, used refurbished laptop, buy used laptop, used dell laptop computer, used mac laptop, used toshiba laptop, used compaq laptop, used apple laptop computer, free laptop notebook used, used laptop montreal, wholesale used laptop, cheap discount used notebook laptop, used laptop hard drive, used notebook laptop computer, used sony laptop, used gateway laptop, used and refurbished laptop computer, used ibm laptop computer, sell used laptop, used pc and laptop, used hp laptop, cheap used refurbished laptop, used laptop battery, used laptop Canada, used laptop uk, best used laptop apply online for credit card, apply for a credit card, apply canada card columbia credit district, apply for a credit card Canada, apply for student credit card, apply for visa credit card, apply credit card bad credit, apply for wal mart credit card, apply for a business credit card, apply card credit kmart, apply for secured credit card, apply for capital one credit card, apply for gas credit card, apply business card credit online, apply for jc penney credit card, apply business card credit small, apply canada card credit dakota north, apply canada card carolina credit north, apply online credit card application, apply for sears credit card, apply card credit department store, apply for juniper credit card, apply canada card credit dakota south, apply canada card credit island rhode, apply canada card carolina credit south, apply canada card credit new york, apply for easy credit card, apply canada card credit hampshire new, apply canada card credit jersey new, apply card college credit student, fashion bug credit card to apply for, apply card credit kohls, student credit card apply online, apply for discover credit card, apply for credit card instant approval

At 7:34 AM, Anonymous Anonymous said...


"...Any introductory text on lambda calculus will probably do..."

What are people using these days to fit this need? The only good intro. I have is an excellent but out of print one by Greg Michaelson (and there's an updated one in the works I hear).

Would appreciate other recommendations...

At 1:27 AM, Blogger qqqqqq said...

8-28jejecoach outlet online
coach outlet store online
coach outlet
coach factory outlet
coach outlet
coach factory outlet
coach outlet online
coach outlet online
coach outlet online
coach outlet store online


Post a Comment

<< Home