Fun with call/cc (was RE: [Python-Dev] Stackless Python - Pros and Cons)

Tim Peters tim_one@email.msn.com
Mon, 7 Aug 2000 17:52:18 -0400


[Tim]
> On the one hand, I don't think I know of a language *not* based
> on Scheme that has call/cc (or a moral equivalent).

[Jeremy Hylton]
> ML also has call/cc, at least the Concurrent ML variant.

So it does!  I've found 3 language lines that have full-blown call/cc (not
counting the early versions of REBOL, since they took it out later), and at
least one web page claiming "that's all, folks":

1. Scheme + derivatives (but not including most Lisps).

2. Standard ML + derivatives (but almost unique among truly
   functional languages):

   http://cm.bell-labs.com/cm/cs/what/smlnj/doc/SMLofNJ/pages/cont.html

   That page is pretty much incomprehensible on its own.  Besides
   callcc (no "/"), SML-NJ also has related "throw", "isolate",
   "capture" and "escape" functions.  At least some of them *appear*
   to be addressing Kent Pitman's specific complaints about the
   excruciating interactions between call/cc and unwind-protect in
   Scheme.

3. Unlambda.  This one is a hoot!  Don't know why I haven't bumped
   into it before:

   http://www.eleves.ens.fr:8080/home/madore/programs/unlambda/
   "Your Functional Programming Language Nightmares Come True"

   Unlambda is a deliberately obfuscated functional programming
   language, whose only data type is function and whose only
   syntax is function application:  no lambdas (or other "special
   forms"), no integers, no lists, no variables, no if/then/else,
   ...  call/cc is spelled with the single letter "c" in Unlambda,
   and the docs note "expressions including c function calls tend
   to be hopelessly difficult to track down.  This was, of course,
   the reason for including it in the language in the first place".

   Not all frivolous, though!  The page goes on to point out that
   writing an interpreter for Unlambda in something other than Scheme
   exposes many of the difficult issues (like implementing call/cc
   in a language that doesn't have any such notion -- which is,
   after all, almost all languages), in a language that's otherwise
   relentlessly simple-minded so doesn't bog you down with
   accidental complexities.

Doesn't mean call/cc sucks, but language designers *have* been avoiding it
in vast numbers -- despite that the Scheme folks have been pushing it (&
pushing it, & pushing it) in every real language they flee to <wink>.

BTW, lest anyone get the wrong idea, I'm (mostly) in favor of it!  It can't
possibly be sold on any grounds other than that "it works, for real Python
programmers with real programming problems they can't solve in other ways",
though.  Christian has been doing a wonderful (if slow-motion <wink>) job of
building that critical base of real-life users.