Saturday, July 30, 2011

A Survey of Syntactic Extension Techniques in the Lisp Family of Languages (Part 1)

Lisp is famous for, and in some sense, defined by (see this), syntactic extension. Syntactic extension is Lisp is a great example of a design trade off - Lisp picks a relatively high level representation of its base syntax (lists of lists and atoms), and then writing syntactic extensions is greatly simplified, because they simply transform that high level representation. Syntax extensions don't have to worry about the nitty-gritty details of turning character streams into some kind of program representation (that is done for you, by the reader), and the code representation is simple enough to modify with the language itself, so extensions are easy to write. The trade off is that you have to stick to Lisp's baseline syntax (unless you get really tricky). What this means, in practice, is that even extended Lisp syntax will still be a list of lists and atoms (and chock full of parentheses, for which the language family is famous).

Transformation.

Despite the simplicity of this scheme, wherein the reader transforms text into a code-representation, which is then transformed by macros, and then finally converted to machine code or bytecode or interpreted, various Lisp dialects have approached the question of syntactic extension differently. Since I've recently gotten interested in macro hygiene, I thought it would be nice to write a series of posts about the different kinds of macro transformations available in various Lisp dialects.

picoLisp

picoLisp is a pretty bizarre Lisp variant which doesn't enjoy wide use, and has a pretty amazing set of philosophical underpinnings. PicoLisp is sufficiently different from other Lisps that I hesitated to cover it here, but it turns out to be extremely useful from a pedagogical point of view. How come? Because the code/data relationship, which is important in all Lisps, plays an even more central role in picoLisp. We are going to end this post talking about hygienic macros in Scheme, and picoLisp, in a sense, represents the polar opposite approach, with other Lisps occupying an arguably uncomfortable or impure middle ground. Code and data are so tightly coupled in picoLisp that the above picture of how syntactic extension works doesn't even really apply.

Smaller is Better

Smaller is Better

Code is Data

So what do we really mean when we say code is data? This is a bit fatuous, in a way - code is text, after all. All Lisp variants I know still require the user to write text out into a file, which is then read by the Lisp environment and acted upon. As suggested above, "code is data" really means that code is transformed from text into an intermediate form which is represented in terms of Lisp data types. We can then use the Lisp itself to transform that data or to execute it or interpret it.

What is the simplest thing we can do with Lisp data that may represent some code? This one is easy: the simplest thing we can do is nothing. Doing nothing to piece of code/data is called "quotation" in Lisp. It is represented by preceding an expression with the ' character. Quoted expressions aren't evaluated - when the interpreter hits one, it just returns the data stored in the quotation. A quoted expression is read by the reader, but not evaluated. It is just data.

'a ;-> a
'(this is some data) ;-> (this is some data)
'(if T "True" "False") ;-> (if T "True" "False")
(if T "True" "False") ;-> "True"

(N.B. You could download picoLisp and try these examples.)

Every line above except the last is quoted, and evaluates to just the quoted data. The last expression isn't quoted, and so it is actually evaluated by the interpreter. t is the true value, so the expression evaluates to the first clause, which is the "string" "True" (technically "True" is a symbol, since picoLisp only has one type which encompasses both strings and symbols). The opposite of quotation is evaluation. This is represented as the function eval in picoLisp:

(eval '(if T "True" "False")) ;-> "True"

A slightly less trivial example:

(setq x 10)
(setq q '(+ x 1))
(eval q) ;-> 11

When eval encounters a symbol, like x, above, it just replaces it with the current value of that symbol wherever eval is called. So, if we run the above code and then say:

(let x 0 (eval q)) ;-> 1

We get 1.

This is one of the ways the picoLisp differs from most other Lisps. This behavior is called "dynamic scope," and while most Lisps (even those that have this behavior) look upon it as a historical relic better thrown off or worked around, picoLisp embraces this behavior. This is because picoLisp is aiming for simplicity in its interpreter, and nothing is simpler than a symbol just meaning "get what the value of this symbol is right here, right now." As we'll see, eval in newer Lisp dialects won't work this way.

Ok, ok, we are sort of drifting. We were talking about Macros. Rather surprisingly, picoLisp's documentation says that:

Yes, there is a macro mechanism in picoLisp, to build and immediately execute a list of expressions. But it is seldom used. Macros are a kludge. Most things where you need macros in other Lisps are directly expressible as functions in picoLisp, which (as opposed to macros) can be applied, passed around, and debugged.

How can this be? Well, functions in picoLisp have the option of not evaluating their arguments. In most languages, function calls proceed by first evaluating all of their arguments, then binding those values to the variable names and then executing the body of the function. This is how it works in picoLisp too, if you say:

(de fun (A)
  (print "Inside")
  (print A))
(fun (prog (print "Argument evaluated.") 10))

You get:

"Argument evaluated.""Inside" 10-> 10

For non-Lispers, prog is just a form which evaluates each of its sub-forms in order and returns the last value. We are using it here to demonstrate when the argument expression is evaluated.

So when a function is called, its arguments are evaluated. This is true in every Lisp I know (except for exotica like Lazy Lisp, in Racket). This property is usually called, by the way, eagerness: the function is eager to know its argument's values before evaluating the body.

Unlike other Lisps, picoLisp lets you define functions which don't evaluate their arguments immediately. This is done by providing a single symbol instead of an argument list:

(de fun2 A
  (print "Inside")
  (print (eval (car A))))
(fun2 (prog (print "Argument evaluated.") 10))

(car returns the first element of a list).

Results in:

"Inside""Argument evaluated."10-> 10

The argument expression is not evaluated until we (unpack it and then) call eval on it. Using this feature, we can do something which is usually impossible in other languages: write if as a function. In most languages you can't write if in any nice way. In most Lisps, you've got to write a macro. In picoLisp you can just write if as an "ordinary" function:

(de my-if A
 (if (eval (car A))
     (eval (cadr A))
     (eval (caddr A))))

(my-if (< 1 0) 
  (prog (print "True Branch Evaled") T) 
  (prog (print "False Branch Evaled") NIL))

"False Branch Evaled"-> NIL

Note that "True Branch Evaled" is never printed. The true branch is never evaluated.

(Obviously we have to use the primitive if - the example is meant to highlight optional evaluation of arguments, not how a primitive like if makes it into a language).

Because functions can do this kind of thing, you can do some surprising things with picoLisp, like map if over lists of branches. I find it astonishing that the picoLisp docs provide this example and then say picoLisp goes for "The principle of least astonishment."

Variables, Scope, Eval, Quote and Lambda

If you are used to other programming languages, picoLisp probably seems pretty bizarre. But, if you're a little more open minded, you might think: wait a minute, this optional evaluation of input expressions is actually pretty handy! I can write all my special forms as regular functions, and then they too can be first class values! Why isn't every Lisp like this?

Well, I can't claim to understand the entire historical development of the Lisp family of languages, but I'm pretty sure that the main reason other Lisps moved away from this model is that they wanted to support lexical scope (to be discussed below). The watchword of picoLisp is simplicity: simplicity is why it is an interpreted language, rather than a compiled one, and simplicity shaped the design of the interpreter. Dynamic variable scope is the simplest thing, as far as an interpreter is concerned, and so picoLisp runs with it. Because code is always evaluated with respect to a dynamic environment, the code itself doesn't need to remember anything like "Which x did the programmer mean in the peice of code (+ x 1)." It is simply assumed that, by default, x refers to the x in the current dynamic environment. Under these semantic assumptions, a quotation is just a lambda expression without any arguments. Eval is just funcall for functions that take no arguments.

This is, in fact, literally true in picoLisp, even for functions with arguments.. There is no lambda. Anonymous functions are created with quoteation.

(mapcar '((X) (+ X 1)) (list 1 2 3 4))
; -> (2 3 4 5)

Because variable binding is assumed to be handled by eval and is assumed to be related only to where eval is called, not to anything about where the lambda was defined, code in picoLisp need have no additional information associated with it. It literally is just data.

In short, buzzword packed language: Restricting intepretation of variable binding to dynamic scope, picoLisp unifies function application and regular evaluation, and quote and lambda. With minimal convention, the distinction between functions and special forms nearly vanishes!

Lexical Scope?

I keep going on about dynamic scope above, and I even mentioned lexical scope above, but what is lexical scope and how does it impact upon the relationship between function application and evaluation and between quotation and lambda?

We are going to switch to Emacs Lisp for some examples now, because Emacs Lisp supports both lexical and dynamic scope and forces us to say explicitly which scoping rules we want to use. This helps make the discussion of scope clearer.

(If you want to follow along, Download the latest emacs, fire it up, and then press "Alt-x ielm *ENTER*". This will start up an Emacs Lisp read-eval-print loop. There are better ways to interact with the Emacs Lisp interpreter, but this is the most familiar for non-emacs users.)

Vi propaganda!

Vi propaganda! (borrowed from here).

Emacs Lisp is a relatively old Lisp dialect, and by default it is dynamically scoped. There is a library that comes with Emacs that adds a lot of features from Common Lisp, including simulation of lexical-scope rules, so the first thing you need to do is require this package:

*** Welcome to IELM ***  Type (describe-mode) for help.
ELISP> (require 'cl)

A quick dynamic scope example:

(let ((x 10))
 (defun get-value-of-x () x)
 (get-value-of-x))

Obviously evaluates to 10. get-value-of-x just returns the value of x, whatever it is, when it is called. Hence:

(let ((x 11))
  (get-value-of-x))

Is 11. If we call get-value-of-x outside of a let which binds x, we'll get an error. x, at that point, has no value at all.

What if we use lexical-let instead?

(lexical-let ((x 10))
 (defun get-value-of-x () x)
 (get-value-of-x))

This is still 10.

But, perhaps surprisingly, we can now say:

(get-value-of-x)

Outside of any let expression which binds x and get 10 as the answer. Perhaps even more surprisingly:

(let ((x 11))
  (get-value-of-x))

Is still 10. Even:

(lexical-let ((x 11))
  (get-value-of-x))

Is still 10. In the context of a lexical-let, symbols bound by that lexical-let don't refer to whatever value is bound to that symbol "right now" in the dynamical environment, they refer to the particular lexical environment of the lexical-let expression. Conceptually, any lambda expression appearing in a lexical-let has to store more than just the list of symbols and lists that makes up its body; it also has to store the lexical environment to which those symbols refer.

(Lexical scope is called lexical scope because variables are interpreted by virtue of their lexical context, literally where they appear in the source code, rather than where they are evaluated when the program is executed.)

Code might still be represented as a list of symbols and lists and atoms, but that representation leaves out information about lexical context. When we finally reach hygienic macros, when we talk about Scheme, we'll see that decorating the list-of-things representation of source code with lexical information will be a key feature.

Let's drive this home before we adjourn part 1. Consider:

(let ((x 10))
  (setq code 'x)
  (eval code))

That is definitely 10.

What about if we say:

(eval code)

We get an error: "void variable x". Also expected.

Now:

(lexical-let ((x 10))
  (setq code 'x)
  (eval code))

This, maybe surprisingly, gives an error too. The real reason is that Emacs Lisp does some tricky things to simulate lexical scope, but it isn't totally obvious that eval should use the current lexical scope to evaluate terms. The meaning of symbols passed to eval in the context of lexical scope is suddenly non-trivial. We can't execute the above, but lets try:

(lexical-let ((x 10))
  (setq code 'x))

(let ((x 11))
  (eval code))

This evaluates to 11. The variable code really just contains a piece of symbolic data. That data doesn't remember anything about where it was defined - it forgets its lexical context - and so it can't evaluate correctly. The addition of lexical scope breaks the symmetry between quoteation and lambda expressions! We didn't need lambda in picoLisp because there was no lexical context to keep track of. In other Lisps we need defun and lambda to function as "smart quotations," which remember their lexical environment so that, upon invokation, they can behave correctly!

Because of the breakdown of this symmetry, and because Emacs Lisp doesn't provide picoLisp style functions, we need a whole new special form in Emacs Lisp to declare syntactic extension.

Conclusions of Part 1

Lexical scope is widely agreed to be the superior semantic mode for programming languages, principally because it makes reasoning about a piece of code mostly about looking at the text that defines the code, not at when the code is executed. But now we can see that lexical scope comes at a price: it breaks the symmetry between code and data. We get the simplicity, as programmers, of being able to understand our code based on its lexical environment "on the page". But the compiler/interpreter now has to do extra work to execute code correctly. Futhermore, naive modes of representing code as data are no longer complete: lists of lists and atoms don't contain lexical information.

Next time we'll talk about macros in Emacs/Common Lisp and Clojure (and maybe Arc (why the hell not?)). With today's lessons in mind, we'll see most of the conceptual problems with macros in these systems are associated with the fact that macros manipulate an impoverished code representation.

In subsequent posts, we'll look at macros in Scheme, and we'll see that the representation of code in that language is decorated with lexical information. This makes writing "well behaved" macros easier, but makes writing macros a little more abstract and, arguably, difficult to understand.

Thanks for reading!


Saturday, July 16, 2011

Duckspeak Vs Smalltalk

Duckspeak Vs Smalltalk

The Decline of the Xerox PARC Philosophy at Apple Computers

Malcolm Gladwell's recent piece, "Creation Myth", in the New Yorker, about innovation and implementation via Xerox PARC, academia and Apple Computers, tells one interesting story about that surprising time in our modern history. But the story of the tensions and synergies between visionaries and businessmen elides a few interesting details about what was going on, and why, at Xerox PARC at the time. Gladwell's version of history features a nimble entrepreneur, Steve Jobs, capitalizing on an idea the value of which a monolithic company, Xerox, can't see. But the story of Apple and Xerox PARC is also that of a design philosophy meant to empower people diverging into one meant to entertain them or to sell them things.

When Steve Jobs visited Xerox PARC and saw the first mouse, the system he was looking at, the Alto, was running a programming environment and language called Smalltalk. While the details of this system are glossed over in the Gladwell piece, they deserve more careful attention. Although The Alto bears a superficial resemblance to modern computers, it differed in one major area: the relationship between software developers and users.

For most people software is a solid edifice - it presents a few modes of interaction to the user, maybe a special panel of customization options somewhere, but is otherwise as opaque and unmodifiable as a modern car. If users bother to think about software at all, they think of it as a product, constructed somewhere by people called "programmers" and distributed to the user. If that software doesn't do what the user wants, he might send a hopeful technical support email, or he might just shop around for something else.

Of course, there is consumer software that includes more powerful extension features, so that, in principal, the user can add their own functionality, but these features don't seem to be popularly used. Firefox is an example of user-extensible software, but the vast majority of users don't use this capacity except to download what a small percentage of computer literate users write.

In other words, it is reasonably safe to say that most people who use computers have never written software.

Why should this be, and what does it have to do with Xerox PARC, Smalltalk and Steve Jobs? Well, an integral part of the Xerox PARC Philosophy was to dismantle the wall between software developers and computer users, to develop systems so easy to program that doing so would be a natural, simple aspect of computer use.

The early years of computing technology naturally produced a division between users and programmers - programming early computers was a highly technical discipline which required specific knowledge of the way the idiosyncratic hardware systems in those days worked. But while computers rapidly increased in power, the tools that programmers used to program them developed relatively conservatively. It is easy to imagine a world where those tools developed along with the computers, until programming itself became so easy that the average user would feel comfortable doing it. After all, the point of any program is to automate or facilitate tedious work, and in this respect programming itself is no different than a word processor.

That wasn't exactly how things happened, and the reason why is a fascinating and arguably still unresolved story in and of itself. Part of that story takes place at Xerox PARC.

The Xerox PARC Philosophy

I mentioned above that the computer Steve Jobs saw on his visit to to Xerox PARC, the Alto, was running something called a Smalltalk System. Smalltalk is still around, and you can even download a self-contained Smalltalk System called Squeak and play around with one yourself. What you'll see, if you do, is something which is probably very similar to what Steve Jobs saw on that day - a desktop-ish interface, with dragable windows and clickable buttons. And of course, you interact with the mouse.

Pharo Smalltalk

The Graphical Programming Environment of Pharo Smalltalk.

Both systems also share a fascinating property which "Creation Myth" leaves unmentioned. In Smalltalk, you can, using something called "The Browser," pull up the "source code" for any object in the system. "Object" in this case means anything in the system whatsoever, including windows, widgets, numbers. "Source code" is the stuff that a compiler translates into machine code so the computer can do something with it. If you want, you can modify that code right there, or copy it and create a new object with user-customized behavior. The entire system is transparent and modifiable.

Most of the programming languages people used in 1979 would have looked very nearly like gibberish to a lay person. Early computers were slow, which meant that compilers took a long time to work unless they were very simple. This meant that most early programming languages were just thin shells on top of the numbers-as-command codes of machine language. Even by 1979, languages hadn't developed much further in public use - corporate and government users (pretty much the only users before personal computing) were interested in cost-effectiveness and systems their programmers already knew, so language and system design was very conservative. New languages came along, but often they were incremental improvements on previous designs.

The designers of Smalltalk (Alan Kay, Dan Ingalls, and Adele Goldberg principally, and others), given the resources and freedom of Xerox PARC, worked actively to reverse this trend. Whereas a hodgepodge of cultural and technical realities constrained the way most other programming languages looked and felt, both Smalltalk the language and the system were written from the ground up to be so easy that a child could use them (hence the name). It was much more ambitious than just that, however. Kay saw Xerox PARC as being on the vanguard of a real revolution in human/computer interaction. In "The Early History of Smalltalk," Alan Kay writes of this "Xerox PARC" vision of personal computing:

... the user interface would have to become a learning environment along the lines of Montessori and Bruner; and [the] needs for large scope, reduction in complexity, and end-user literacy would require that data and control structures be done away with in favor of a more biological scheme of protected universal cells interacting only through messages that could mimic desired behavior.

... we were actually trying for a for a qualitative paradigm shift in belief structures -- a new Kuhnian paradigm in the same spirit as the invention of the printing press...

It is obvious from the "The Early History of Smalltalk" that Alan Kay has a direct, emotional involvement in his subject matter (he says so in fact). What is equally obvious is that Kay's retrospective must be bittersweet at best. Smalltalk and the Alto were, at the time, the avatar of "The Xerox PARC Design Philosophy". The systems Apple went on to produce would imperfectly capture this philosophy, and arguably, later, jettison it altogether.

In one anecdote, Kay relates showing a custom system (built in Smalltalk) meant to facilitate non-expert "programming," to executives from Xerox PARC. This system was a kind of highly advanced programming language meant to make human-machine interaction at a very high level intuitive for non-expert users. At one point during a demonstration, a vice president, after an hour of working with the system, realized he was programming. What they accomplished, then, was a keystone for a software system which Kay felt bridged the gap between the numbers coursing through a CPU somewhere, and human intuitive reasoning.

Kay viewed programming as a natural aspect of human computer interaction, and he designed his systems to make programming the computer as easy and intuitive as creating a new Word Document or browsing the web is on modern computers. When Steve Jobs visited Xerox PARC and saw the Alto, he brought more than just the user interface to Apple Computers, he brought an entire philosophy of personal computing.

HyperCard

The Xerox PARC philosophy can be seen in a variety of technological lineages still discernible in the Apple universe. Objective C, a variant of the Smallktalk language, though without its attendant environment (the SmallTalk system), is still in use. Kay himself is quick to point out HyperCard, an early and still incredibly popular application environment, which encouraged user extension and programmability in a language called "HyperTalk," which was inspired by Smalltalk and the Alto, was a good realization of the Xeroc PARC philosophy on the Mac.

Hypercard
 Screenshot

A screenshot of Hypercard in action. Linked from here.

HyperCard, like much of the work from this period, defies comparison to modern software. Although often described as a kind of hypertexual rolodex, its "cards" could contain more than static information - they could also contain user-created multimedia and interactive components. Users would begin by adding cards for various pieces of information, but then, say as a card representing sales data grew to require a calculator, an interactive component for that purpose could be added. These components were themselves added interactively from within HyperCard.

HyperCard, and the people using it, organically grew many applications which left a permanent mark on computer history. A particularly telling fact is that the original version of the game Myst, a fantasy adventure game, was a HyperCard App. On the other side of the Atlantic, figuratively and literally, Renault, a french car manufacturer, used HyperCard to maintain its business inventory. HyperCard became the program its users needed it to be because it was open, extensible and encouraged user programming and interaction as a fundamental use-case. Even modern extensible software like Firefox tends to separate use from extension development - the average user might have no idea that Firefox supports user extension. In Hypercard, these features were "on the surface" of the design.

HyperCard also illustrates some of the difficulties that might be responsible for the gradual shift away from Xerox PARC-like open models of personal computing. According to rumor, the developer of HyperCard, Bill Atkinson, allegedly1 gave the product to Apple in 1987, with the understanding that it would be distributed for free with each Mac. The program was an immediate success. HyperCard produced a tremendous amount of feedback from the community, but since it was a free product, Apple wasn't sure how much internal resources should be devoted to handling HyperCard development.

Perhaps seeking a way of turning the HyperCard phenomenon into a revenue stream, Apple eventually transferred HyperCard development to a subsidiary company, which attempted to transform it into a profitable business model. HyperCard was no longer released for free, but a locked down version, capable of playing, but not developing, HyperCard Applications was freely available. The "developer's edition," recognizable as just Hypercard, was available for purchase. In an effort to make HyperCard into a business model, Apple inadvertantly had separated users into "developers" and "users." This, combined with the development of work-alikes with more features, seemed to destroy HyperCard's momentum, and, despite later attempts at revival at Apple, the system fell out of use2.

Waiting for the Dynabook

Alan Kay invented the laptop computer - at least he developed a concept computer called The Dynabook which for all intents and purposes was a modern laptop and more. He envisioned that such a system, directed mostly at children (but usable by adults) would run Smalltalk, and while its possible to build the conceptual system Kay imagined in 1968 today, he still believes that the Dynabook doesn't exist. Although tablet computers resemble the Dynabook superficially, and the One Laptop Per Child project comes close, Kay believes that his essential vision is unfulfilled. Kay points out, when asked about this, that the necessary technologies for a Dynabook device are quite old, but that corporate and cultural practices simply haven't caught up to using them appropriately.

The Dynabook

Sketch of the Dynabook design (from Wikipedia.)

Consider by contrast any one of Apple's iDevices. The touch screen, networking capability and user friendly design are reminiscent of the Dynabook, but, whereas on a Smalltalk system one could click on any widget and see and modify the source code, an iPad is essentially completely locked down. Not only does Apple require a license to develop and sell software for the iDevices in their "App Store," but to even develop, for personal use, software for your own device, a separate "Developer's Kit" (and the Apple Computer to run it on) must be acquired. Whereas Smalltalk was designed from the bottom up to facilitate programming for young and inexperienced users, the iPad targets its development tools, which are arguably byzantine by the standards of Smalltalk, to a relatively small group of developers. On top of that, software is only distributable after passing through an often arbitrary and, in any case, secretive Apple review process.

While the Dynabook was meant to be a device deeply rooted in the ethos of active education and human enhancement, the iDevices are essentially glorified entertainment and social interaction (and tracking) devices, and Apple controlled revenue stream generators for developers. The entire "App Store" model, then works to divide the world into developers and software users, whereas the Xerox PARC philosophy was for there to be a continuum between these two states. The Dynabook's design was meant to recruit the user into the system as a fully active participant. The iDevice is meant to show you things, and to accept a limited kind of input - useful for 250 character Tweets and Facebook status updates, all without giving you the power to upset Content Creators, upon whom Apple depends for its business model. Smalltalk was created with the education of adolescents in mind - the iPad thinks of this group as a market segment.

HyperCard was, by comparison, much closer to the Dynabook ethos. In a sense, the iPad is the failed "HyperCard Player" brought to corporate fruition, able to run applications but completely unsuited for developing them, both in its basic design (which prioritizes pointing and clicking as the mechanism of interaction), in the conceptual design of its software, and in the social and legal organization of its software distribution system.

It is interesting that at one point, Jobs (who could not be reached for comment) described his vision of computers as "interpersonal computing," and by that standard, his machines are a success. It is just a shame that in an effort to make interpersonal engagement over computers easy and ubiquitous, the goal of making the computer itself easily engaging has become obscured. In a world where centralized technology like Google can literally give you a good guess at any piece of human knowledge in milliseconds, its a real tragedy that the immense power of cheap, freely available computational systems remains locked behind opaque interfaces, obscure programming languages, and expensive licensing agreements.

The last 30 years have accustomed us to breakneck advancements in the technology we use every day, and yet at the personal level these advancements have been limited almost exclusively to communication and entertainment - so much so that arguably the public lacks even the the vocabulary to express what it is that modern computing could be doing for them or what they could be doing with modern computing. Spreadsheets are the closest most people get to "computing" with their personal computers. The electronic spreadsheet, which is itself an adaptation of an analog technology, was conceptualized in 1961.

If you ask Alan Kay about personal computing now, he is remarkably upbeat. In his view, the rapid development of technology simply outpaces the ability of corporate and educational systems to adapt, and this leads to a "pop culture" of sorts which dominates the culture of computer use. In other words, the divide between users and programmers, or at least between the truly computer literate and the merely casual computer user, isn't a top down phenomena imposed upon the people by those in control of technology. It is an inevitable result of the rapid pace of development.

I think one of the main consequences of the inventions of personal computing and the world wide Internet is that everyone gets to be a potential participant, and this means that we now have the entire bell curve of humanity trying to be part of the action. This will dilute good design (almost stamp it out) until mass education can help most people get more savvy about what the new medium is all about. (This is not a fast process). What we have now is not dissimilar to the pop music scene vs the developed music culture (the former has almost driven out the latter -- and this is only possible where there is too little knowledge and taste to prevent it). Not a pretty sight.

Alan Kay is still pushing for more symbiotic conceptualization of human/computer interaction, although he describes Smalltalk as part of his "distant past". He presently heads a non-profit organization he co-founded called "Viewpoints Research Institute," whose purpose is to continue to consider the questions of educational and personal computing. We'd never have gotten the iPhone if it hadn't been for his influence at Xerox PARC. Maybe one day we'll be lucky enough to get the Dynabook.


1 Bill Atkinson is presently a nature photographer and couldn't be reached for comment.

2 However, HyperCard's influence is still felt today. Last year, Dale Dougherty, editor of Make Magazine, wrote in wired that the iPad needed a HyperCard-type application. Tilestack, a web based, HyperCard-a-like with a pay-to-distribute model, recently went bust. Squeak Smalltalk includes a "Morph," a kind of extendable program, which is loosely based on HyperCard. Although from a parallel technological lineage altogether, Emacs, which is still in wide use, and which the author used to write this article, resembles HyperCard in many respects.


Copyright J. Vincent Toups 2011