Skip to content

Instantly share code, notes, and snippets.

@nfunato
Last active November 25, 2016 08:41
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nfunato/1ae3ed29bc7023004401 to your computer and use it in GitHub Desktop.
Save nfunato/1ae3ed29bc7023004401 to your computer and use it in GitHub Desktop.
* _readme.txt
** 履歴 (作業日付 / rev on gist / memo)
- 2015-11-27 rev10
これまでに得られた知見をもとに、WiLiKi本体を書き換え
記録を本gistの_WiLiKi.txtに残した
- 2015-11-24  rev6--rev9 いろいろ修正
残課題
- which said all over it 辺りが ?
- and what a help that turned out to be 辺りが ?
- and the chain would continue 辺りが ?
- 2015-11-23 〜rev 5 初版
** lwba-bbnexcerpts.org -- その経緯 (@nfunato 2015-11-23)
- このエッセイ(Lisp for Web-based Applications)は
Incremental Development, Interactive Toplevelの辺りが
基本的かつ短いものの Lispの特性をよく表しており、個人的に以前からお気に入りだった。
また、この辺りは、Lispに慣れていない人に *もっと読まれてもよいと思っていた*
もっとも、この小文の本来の主眼は そこから後ろの
Embedded Languages, Closures Simulating Subroutines
Viaweb固有の部分にあることは明らかなんですが。
- 邦訳は以前から 以下のWiLiKi
http://practical-scheme.net/wiliki/wiliki.cgi?%E3%82%A6%E3%82%A7%E3%83%96%E3%83%99%E3%83%BC%E3%82%B9%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AELisp
にあるが、明らかな誤訳も残っているように見えた。
が、文体等まで修正することを考えると根本的に手を入れる気にはなれず、放置していた。
複数の方が既に直されているようで、しかも誰が直したかが分からないということもある。
(historyを見ると、元は機械翻訳ということですね
あと、すっかり忘れていましたが(><) 、2007/3/4 と 3/7 に修正したのはたぶん私です)
- 最近「はしれ!コード学園」にLispの話とか出ていたので、
なんとなく、勢いで訳してしまった。
あまり練っていないので、文体以前に色々と誤りがありそうです。
もちろん、誤訳とかあれば修正しますが、いろいろ大目に見てあげてください ^^);
- 正直、最近は、多くのことがLispに固有のものではなくなっているし、
Node.js 等々 変遷しているご時世に、この内容は今さら感は否めない。
それでも、確認したところ、Lisp for Web-based Applicationsの訳は、
上述のWiLiKi以外にはないらしい。で、とりあえずここに貼り付けた。
(Emacsのorg-modeで書いたので、そのままの状態です)
もう少し枯れたら WiLiKi にも置くかもしれません。
(とりあえず、このgistへのリンクだけ
http://practical-scheme.net/wiliki/wiliki.cgi?naoya_t%3A%E3%83%9D%E3%83%BC%E3%83%AB%E3%83%BB%E3%82%B0%E3%83%AC%E3%82%A2%E3%83%A0%E3%81%AE%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4%E3%81%A8%E5%92%8C%E8%A8%B3%E4%B8%80%E8%A6%A7
に加えておきます)
原文:[http://www.paulgraham.com/lwba.html Lisp for Web-Based Applications]
;; updated by nfunato on 2015-11-27
----
[http://practical-scheme.net/trans/beating-the-averages-j.html 普通のやつらの上を行け]へのリンクがslashdotにアップされた後に、何人かの読者は、私たちがViawebでLispを使ったことで得られた固有の技術的なアドバンテージについて、さらに詳しく聞きたがった。
興味を持つ人のために、私が2001年4月にマサチューセッツ州ケンブリッジのBBN研究所で行った講演の要約を以下に示す。
----
* ウェブベースアプリケーションのためのLisp
ポール グレアム
(このエッセイは2001年4月にマサチューセッツ州ケンブリッジのBBN研究所で行った講演の要約である)
** お望みのどんな言語でも
ウェブベースのアプリケーションを書く際にLispを使う理由の一つは、Lispを'''使える'''ってことだ。
自分のサーバだけで動くソフトウェアを書いているなら、どんな言語を使うことだってできる。
長い間、アプリケーションを書くのにどんな言語を使用したらよいか、その選択の余地がプログラマにはたいしてなかった。
最近まで、アプリケーションプログラムを書くということはデスクトップコンピュータで動くソフトウェアを書くことだった。
デスクトップソフトウェアでは、オペレーティングシステムと同じ言語でアプリケーションを書くように仕向けられる強い傾向があった。
10年前は、あらゆる実用目的に対して、アプリケーションはC言語で書かれていた。
ウェブベースのアプリケーションでは、それが変わる。
あなたはサーバを支配することができ、あなたが望む言語でソフトウェアを書いていい。
現在ではオペレーティングシステムとコンパイラの両方のソースコードがあるのを当然と考えることができる。
言語とオペレーティングシステムの間に何か問題があったら、自分でそれを修正できる。
だが、この新しい自由は諸刃の剣だ。
多くの選択肢があるってことは、どの選択をしたらよいかを考える必要がある、ということだからだ。
昔はもっと単純だった。
あなたがソフトウェアのプロジェクトを担当していて、ある問題児が「今までのとは違う言語でソフトを書こう」って言い出したら、単に「実用的じゃない」って言って、それでおしまい。
現在のサーバベースのアプリケーションでは、すべてが変わった。
どんな言語を選ぶかが、市場の力に影響されることがある。
大多数の競争相手がしているように、単にCとC++を使い、何も変化していないふりをしてしたら、あなたは自分自身が落ちぶれるための準備をしている。
より強力な言語を使用する小さいベンチャーが、あなたのおまんまを食べてしまうことだろう。
** インクリメンタルな開発
Lispでのソフトウェア開発には、あるスタイルがある。
そのような伝統の一つがインクリメンタル(漸進的)な開発だ。
ほとんど何もしないようなプログラムをできるだけ速く書くことから始める。
その後、少しずつ特徴を加えていくが、どの段階でも動くコードがある。
私はこの方法は、よりよいソフトウェアをすばやく手に入れることができると思う。
Lispのあらゆることがこのプログラミングスタイル向けにチューンされている。
なぜってLispプログラマはこの方法で、少なくとも30年以上はうまくいっているからだ。
Viawebエディタはインクリメンタルな開発の最も極端なケースの一つにちがいない。
それは[https://en.wikipedia.org/wiki/Viaweb Viaweb社]を始める直前に私が書いた本の中でサンプルとして使用した、ウェブサイトを生成する120行のプログラムから始まった。
Viawebエディタはこのプログラムからインクリメンタルに成長していって、最終的におよそ2万5000行のコードになった。
私はけっして仕切りなおして、全体を書き直したりはしなかった。
1日や2日でも動くコードがなかったら、今のように大きくなっていたとは思わない。
開発過程全体は、ひとつの長いゆるやかな変化の連続だった。
この開発スタイルは、ウェブベースのソフトウェアで可能な[https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%83%BB%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9 ローリングリリース]にうまくフィットする。
またそれは一般的に、ソフトウェアをより速く書く方法の一つでもある。
** 対話的トップレベル
Lispの対話的トップレベルは、ソフトウェアをすばやく開発するためにとても役立つ。
だが最大のアドバンテージは、たぶんバグを見つけることに関してだ。
前に述べたように、ウェブベースのアプリケーションでは、ユーザのデータはあなたのサーバにあるので、たいていの場合バグを再現できるのである。
カスタマサポートがViawebエディタのバグレポートを持ってくると、私はコードをLispインタプリタにロードし(訳注1.)、そのユーザのアカウントにログインする。
もし、そのバグを再現できたなら、私は現実のブレークループ(訳注2.)に到達しており、何が失敗しようとしていたのかを正確に知ることができる。コードを修正して即座にリリースできることも多いだろう。
ここで「即座に」というのは、ユーザがまだカスタマサポートに電話している間にということである。
そのようにすばやくバグフィックスを行うことで、私たちの立場はありえないほど有利になった。まだ電話している間にバグを捕まえて修正できたなら、カスタマサポートに勘違いと考えられているという印象をユーザに与えることができたのだ。
ときには、(カスタマサポートにとっては喜ばしいことに)「もう一度ログインしてみて、まだ問題が起こるかどうか調べてください」とユーザに伝えてもらえた。
もちろん、ユーザがログインしなおすと、バグが修正された新しいバージョンのソフトウェアがあり、全てはうまく動作するのだ。
これは少しズルいとは思うが、すごく面白かった。
** HTMLのためのマクロ
Lispのマクロは私たちにとって別の大きな幸運だった。
Viawebエディタの中では、非常に広範囲にわたってマクロを使った。
正確には、Viawebエディタが一つの大きなマクロと言えるかもしれない。
このことで、Lispがどれほと頼りになったか分かるだろう。
Lispと同じようなマクロを持っている言語は他にないのだから。
マクロの用途一つは、HTMLを生成することだった。
マクロとHTMLにはとても自然な親和性がある。
HTMLはLispのように前置記法だし、Lispのように再帰的だからだ。
私たちは、最も複雑で込み入ったHTMLを生成する際に、マクロを定義するマクロを使っているが、それでいてそのマクロは、とても扱いやすかった。
** 埋め込み言語
マクロのもう一つの大きな用途は、[https://en.wikipedia.org/wiki/RTML Rtml]と呼ばれるページ記述用の埋込み言語だった。
(私たちはRtmlが何を表すかについて様々な説明をしたが、本当は私がViawebのもう一人の創業者である[https://en.wikipedia.org/wiki/Robert_Tappan_Morris ロバートモリス]にちなんで名付けた。彼のログイン名がRtmなのだ。)
私たちのソフトウェアによって作られたあらゆるページがRtmlで書かれたプログラムによって生成された。
誰かを脅かすことのないように、これらのプログラムをテンプレートと呼んでいたが、これらは正真正銘のプログラムだ。
実際、これらはLispのプログラムだった。
RtmlはマクロとLispの組み込みオペレータでできていた。
ユーザは、自分のページをどう見せたいかを記述するために、独自のRtmlテンプレートを書くことができた。
私たちには、Interlispの構造エディタによく似たテンプレートを操作するためのエディタがあって、ユーザは自由形式のテキストをタイプする代わりに、コードの断片をカットしたりペーストしたりする。
これは構文エラーを起こさなくなることを意図したものだ。
また、S式の背後にあるカッコを表示する必要がなくなることも意図していた。
構造をインデントで見せることができたからだ。
このようにして、私たちは言語があまりユーザを脅かさないようにしていた。
また、私たちはRtmlが実行時にエラーを起こさないように設計した:
あらゆるRtmlプログラムは何らかのウェブページを出力するのだ。
そうすることで、所望のページが出力されるまで、ユーザはRtmlプログラムを修正してデバッグできる。
私たちは当初、ユーザがウェブコンサルタントになる予想し、彼らがRtmlを大いに使うことを期待していた。
私たちはセクションページやアイテムページなどにデフォルトのテンプレートをいくつか用意して、ユーザがそれらを手に取り修正して、所望のページを作成できるように考えていた。
実際には、ウェブコンサルタントはViawebを好まないことが判った。
一般にコンサルタントとは、クライアントが使うには難しすぎる製品を使うことを好む。
それが彼らの継続的雇用を保障するからだ。
コンサルタントが私たちのウェブサイトに来ると、このソフトウェアはとても使うのが簡単で、誰でも5分でオンラインストアを作れると言い、それからこのソフトウェアを使っていくことはできないと言うだろう。
それで、私たちはウェブコンサルタントからあまり関心を得ることがなかった。
代わりとなるユーザは皆エンドユーザ、すなわち実際の商売人である傾向があった。
彼らは自分のウェブサイトをコントロールできるという考え方を好んだ。
そして、この手のユーザはプログラミングをしたいとはまったく思っていなかった。
彼らはただデフォルトの内蔵テンプレートを使用した。
結局、Rtmlはプログラムのメインのインタフェースにはならなかった。
Rtmlは二つの役割を果たすことになった。
まず第一に、それは本当に洗練されたユーザのための抜け道になった。
彼らは内蔵テンプレートが提供できなかった何かを望むのだ。
Viawebをやっている間のどこかで、誰かが私に非常に有益な忠告をくれた: ユーザはたとえ採用することがなくても常にアップグレードパスを欲しがるものだと。
Rtmlは私たちが提供するアップグレードパスになった。
もしユーザが望むのならば、彼らは自分のページのあらゆることを絶対的にコントロールできる。
数百人のユーザのうちのたった一人が、実際に自分自身でテンプレートを書いた。
そして、それがRtmlの2番目のアドバンテージにつながった。
こうしたユーザが内蔵テンプレートを変更する方法を観察することで、我々が何を追加しなければならないかが分かったのだ。
私たちは最終的に、誰もRtmlを使わないですむようにすることを目標にした。
私たちの内蔵テンプレートは、人々が望む全てのことをするべきなのだ。
この新しいアプローチの中では、Rtmlは私たちのソフトウェアに何か欠けているという警告を出してくれた。
Rtmlを使うことで得た3番目の、そして一番の幸運は、私たち自身がRtmlから得たアドバンテージだった。
たとえ私たちがRtmlの唯一のユーザだったとしても、そのようにソフトウェアを書くことには、とても価値があったのだ。
自分たちのソフトウェアの中に追加の抽象レイヤを持つことは、競争相手に対する大きなアドバンテージをもたらした。
一つには、私たちのソフトウェアは、かなりすっきりした設計になった。
競争相手のように、単にウェブページを生成するC言語やPerlの実際のちょっとしたコードを持つのででなく、私たちはウェブページを生成するための非常に高級な言語と、その言語で記述されたページスタイル集を持つことになった。
そして、実際のコードもずっとすっきりとして、変更も容易になった。
ウェブベースのアプリケーションは多くの小さな変更の連続としてリリースされることは既に述べたが、そのようなリリースを行う場合に、ある変更がいかに重大なのかを知りたくなる。
コードを複数のレイヤに分割することで、この問題をうまく扱うことができる。
下位のレイヤー(Rtml自身)の変更は、滅多に行われない重大な問題になる。
一方で、最上位のレイヤ(テンプレートコード)の変更は、結果をあまり心配することなく、すばやく行うことができるのだ。
RtmlはとてもLisp的な仕事だった。
まず第一に、それは大部分がLispのマクロだった。
オンラインエディタは舞台裏でS式を操作した。
そして、ユーザがテンプレートを操作すると、compile関数が呼び出されてテンプレートをLispの関数にコンパイルした。
Rtmlは、キーワードパラメータにも大きく依存していた。それまでは私が常々 Common Lisp のうさんくさい特徴と考えていた機能にである。
ウェブベースのソフトウェアは、それがリリースされる方法のせいで、変更が容易なように設計しなければならない。
それで、Rtml自身も、ソフトウェアの他の部分と同様に、変更が容易でなければならなかった。
Rtmlのオペレータの大部分はキーワードパラメータをとるように設計されており、どれほどそれで助けられたと判っただろう。
もし、Rtmlオペレータの一つの振舞いに別の次元を加えたくなったら、単に新しいキーワードパラメータを追加すればよく、みんなの既存のテンプレートは引き続き動作するだろう。
Rtmlのいくつかのオペレータがキーワードパラメータをとらないのは、今後変更が必要になると全く思わなかったからなのだが、その殆ど全てに対して、後に自分に腹を立てることになった。
もし、元に戻って最初からやり直すことができるのならば、変更することの一つは、全てのRtmlオペレータがキーワードパラメータをとることにするだろう。
Viawebエディタの中には、実際には二つの埋め込み言語があった。
もう一つの言語とは、利用者には直接見せられてはいなかったが、画像を記述するためのものである。
ViawebはC言語で記述された画像ジェネレータを備えていて、このジェネレータは画像の記述を受け取って画像データの生成を行い、そのデータへのURLを返すことができた。
このような画像の記述も、S式を用いて行った。
** サブルーチンをシミュレートするクロージャ
ウェブページをUIとして使用することの問題の一つは、ウェブセッションが本来ステートレスということだ。
私たちは、レキシカルクロージャを使ってサブルーチンのような振舞いをシミュレートすることで、この問題を回避した。
あなたが継続(continuation)について理解しているなら、私たちがやったことを説明する一つの方法は、私たちは[https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E6%B8%A1%E3%81%97%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB 継続渡し形式(continuation-passing style)]でソフトウェアを書いたということだ。
ほとんどのウェブベースのソフトウェアでは、リンクを生成するとき「ユーザがこのリンクをクリックしたら、このcgiをこの引数で呼び出してほしい」と考えることが多い。
私たちのソフトウェアでは、リンクを生成するとき「ユーザがこのリンクをクリックしたら、この一片のコードを実行してほしい」と考えることができる。ここでいう一片のコードは、値が周辺の環境から定まる自由変数を含むかもしれない任意のコードだ(そして実際はたいていそのような自由変数を含む)。
これを実現する方法として、クロージャであることを想定する第1の引数をとり、コードの本体が続くマクロを書いた(訳注3.)。
そのコードはグローバルなハッシュ表にユニークなIDをキーとして格納され、コードが生成するあらゆる出力は、そのハッシュキーをURLに含んだリンクの中身に現れる。
そのリンクが次にクリックされたなら、私たちのソフトウェアはハッシュ表から対応するコードの断片を探し出し、呼び出して実行する。そして、実行により生成されたページが継続していく。
事実上、私たちはcgiスクリプトを実行時に生成している(このスクリプトが周辺の環境を参照するかもしれないクロージャであることを除けば)。
ここまでだと理屈にすぎないように思われるので、このテクニックが明らかな違いを生み出す例を示そう。
ウェブベースのアプリケーションの中でたびたび行いたいことの一つに、様々な種類のプロパティを持ったオブジェクトの編集をすることがある。
オブジェクトのいくつものプロパティはフォームのフィールドやメニューで表すことができる。
例えば人を表すオブジェクトを編集するときは、まずその人の名前に対応するフィールドを取得し、メニューから役職を選択して、という具合になる。
ここで、あるオブジェクトに色のプロパティがあると、どうなるだろうか?
もし、ページの下側にある更新ボタン使って、すべてのことを一つのフォームで行わないといけない普通のcgiスクリプトを使うとしたら、苦労することだろう。
テキストフィールドを使ってユーザーにRGBの数値をタイプさせることもできるが、エンドユーザはそれが好きではない。
可能な色のメニューを持つこともできるが、そうすると可能な色を制限しなければならない。
さもなければ、標準のウェブのカラーマップを提供するためだけにさえ、256個のほとんど区別できない名前のメニュー項目が必要になる。
私たちはViawebで、現在の値を表す色の見本と「変更」と書かれたボタンを表示した。
ユーザが変更ボタンをクリックすると、選択可能な色のイメージマップのページに移動する。
色を選ぶと、オブジェクトの色が変わってプロパティの編集画面に戻ってくる。
これが私がサブルーチンのような振舞いをシミュレートする、という意味だ。
私たちのソフトウェアは、まるで色を選んだところから戻るかのように振舞うことができた。
もちろんそうではない;
それはスタックを戻るように見える、新しいcgi呼び出しである。
しかしクロージャを使うことで、ユーザに、また私たちにも、単にサブルーチンコールをしているように見せることが出来た。
私たちは、「ユーザがこのリンクをクリックしたら、色選択ページに行き、それからここに戻って来い」というコードを書くことができた。
これは、サブルーチンをシミュレートできるという可能性を活かした複数の個所の一つにすぎない。
それにより、私たちのソフトウェアは競争相手のものよりも明らかに洗練されるようになった。
----
** 訳注:
# Viawebシステムは、Common Lisp処理系としてCLISPを利用していたそうだ。~%
ユーザ向けにはRtmlはランタイムエラーを起こさないように設計されていたことと、CLISPではコンパイルコード実行時よりはインタプリタ実行時の方がデバッグし易いことから、ここでインタプリタにコードをロードし直しているのだろう。
# ブレークループとは、error, cerror, break等の関数が呼ばれた後に到達するCommon Lisp処理系が提供するデバッガのコマンドループ(に入っている状態)を指す。
# この文では、continuation-passing style(CPS)そのものについては あまり説明していないが、一例として CPS形式のマクロfooの定義を以下のように書くことができる。 ~%~%
(defmacro foo ((k . rest-args) &body body) <マクロ展開形の定義> ) ~%~%
ここで、第1引数 kがcontinuationに、<マクロ展開形の定義>がコードの本体に対応する。コード本体は、k, rest-args, body等のマクロの引数を使って記述される。CPSでは、本体からリターンする代わりに、返り値に相当する値 v を用いて、continuation k を(funcall k v)と呼び出すことで処理を継続させる。 ~%
fooの呼び出し側は、第1引数を (lambda (v) ... ) のようにクロージャとして与えることが想定されており、... の部分に lambda式の外側にある 呼び出し側環境で参照可能な変数を利用して、呼び出されたfooから戻った後(としてシミュレートされる部分)の処理を記述できる。
* 対訳 Lisp for Web-Based Applications (ウェブベースのアプリケーションのためのLisp)
Original: http://www.paulgraham.com/lwba.html
After a link to Beating the Averages was posted on slashdot, some
readers wanted to hear in more detail about the specific technical
advantages we got from using Lisp in Viaweb. For those who are
interested, here are some excerpts from a talk I gave in April 2001 at
BBN Labs in Cambridge, MA.
スラッシュドットに「普通の奴らの上を行け」のリンクが掲載されてから、
ViawebでLispを使ったことで得られた固有の技術的なアドバンテージについて、
もう少し詳細を知りたいという読者の声が寄せられた。
そうした関心を持った人のために、ここに私が2001年4月にマサチューセッツ州の
BBN研究所で行った講演の抄録を掲載する。
** Lisp in Web-Based Applications (ウェブベースのアプリケーションにおけるLisp)
Paul Graham
(This is an excerpt of a talk given at BBN Labs in Cambridge, MA, in April 2001.)
ポール・グレアム
(これは 2001年4月にマサチューセッツ州のBBN研究所行われた講演の抄録である。)
*** Any Language You Want (お望みのどんな言語でも)
One of the reasons to use Lisp in writing Web-based applications
is that you *can* use Lisp. When you're writing software that is
only going to run on your own servers, you can use whatever language
you want.
ウェブベースのアプリケーションをLispで書く理由の一つは、Lispを *使える*
ということだ。サーバー上でしか走らないことが分かっているソフトウェアを書く場合
には、どんな言語でも使いたいものを使うことができるのだ。
For a long time programmers didn't have a lot of choice about what
language to use for writing application programs. Until recently,
writing application programs meant writing software to run on
desktop computers. In desktop software there was a strong bias
toward writing the application in the same language as the operating
system. Ten years ago, for all practical purposes, applications
were written in C.
長い間、アプリケーションプログラムを書くためにどのプログラミング言語を
使うかということについて、プログラマにはあまり選択の余地がなかった。最
近まで、アプリケーションプログラムを書くということは、デスクトップコン
ピュータで動くソフトウェアを書くということだったのだ。デスクトップのソ
フトウェアでは、特定のオペレーティングシステム上で同じ言語を使ってアプ
リケーションを書くという強いバイアスが働く。10年前は、あらゆる実用目的
に対して、アプリケーションはC言語で書かれていた。
With Web-based applications, that changes. You control the servers,
and you can write your software in any language you want. You can
take it for granted now that you have the source code of both your
operating system and your compilers. If there does turn out to be
any kind of problem between the language and the OS, you can fix
it yourself.
ウェブベースのアプリケーションについては事情が変わる。サーバーを操作す
るのに、どれでも好きな言語を使ってソフトウェアを書くことができる。そし
て、いまや、オペレーティング・システムとコンパイラのソースコードがある
ことを当然と考えることができる。言語とOSにかかわるどんな問題があること
が分かっても、自分自身で直すことができる。
This new freedom is a double-edged sword, however. Having more
choices means that you now have to think about which choice to
make. It was easier in the old days. If you were in charge of a
software project, and some troublesome person suggested writing
the software in a different language from whatever you usually
used, you could just tell them that it would be impractical, and
that would be the end of it.
この新しく得られた自由は、しかしながら諸刃の剣でもある。選択の余地があ
るということは、いまは自分自身でどう選択をするかを考えなければならない
ということだ。
以前はもっと簡単だった。もしソフトウェアプロジェクトを管理することになっ
たときに、誰か面倒な奴が、あなたがいつも使っている言語とは異なる何か別の
言語でソフトウェアを書くことを提案してきたとしたら、単にそんなことは現
実的ではないと云ってしまえば、それまでだったからだ。
Now, with server-based applications, everything is changed. You're
now subject to market forces in what language you choose. If you
try to pretend that nothing has changed, and just use C and C++,
like most of our competitors did, you are setting yourself up for
a fall. A little startup using a more powerful language will eat
your lunch.
サーバーベースのアプリケーションになって、全ては変わっている。いまや
あなたはどの言語を選択するかということについて市場動向の影響を受ける。
もし何も変わっていないとうそぶいて、単にCやC++を使い続けるとしよう。
他の多くの競合企業がそうしたように、あなたは自分の墓穴を掘っているのだ。
小さなスタートアップが、もっとパワフルな言語を使って美味しいところを
かっさらって行くことだろう。
*** Incremental Development (インクリメンタルな開発)
There is a certain style of software development associated with
Lisp. One of its traditions is incremental development: you start
by writing, as quickly as possible, a program that does almost
nothing. Then you gradually add features to it, but at every step
you have working code.
Lispを使ったソフトウェア開発には、特有のスタイルがある。そういう伝統の
一つが、インクリメンタル(漸進的)な開発だ: 最初、できるだけ速く殆ど何も
しないようなプログラムを書くことから始める。それから徐々にそのプログラムに
機能を足していくが、どの段階でも動くコードがあるようにする。
I think this way you get better software, written faster.
Everything about Lisp is tuned to this style of programming, because
Lisp programmers have worked this way for at least thirty years.
私はこの方法で、よりよいソフトウェアをより速く手に入れることができると思う。
Lispプログラマは、この方法を少なくとも30年以上やってきているから、Lisp
のあらゆることが、このプログラミングスタイル向けに調整されている。
The Viaweb editor must be one of the most extreme cases of incremental
development. It began with a 120-line program for generating Web
sites that I had used in an example in a book that I finished just
before we started Viaweb. The Viaweb editor, which eventually grew
to be about 25,000 lines of code, grew incrementally from this
program. I never once sat down and rewrote the whole thing. I
don't think I was ever more than a day or two without running code.
The whole development process was one long series of gradual changes.
Viawebエディタは、インクリメンタルな開発のもっとも極端な事例の一つにち
がいない。それは最初、Viawebを始める直前に私が書いた本でサンプルとして
使用したウェブサイトを生成する120行のプログラムから始まった。Viawebエ
ディタは、このプログラムからインクリメンタルに成長していって、最終的に
約25,000行のコードになった。私は一度たりとも腰をすえて全体を書き直すこ
とはなかった。1日とか2日を超えてコードが動かない状態だったことはないと
思う。開発過程全体は、一つの長い緩やかな変更の連続になっていた。
This style of development fits well with the rolling releases that
are possible with Web-based software. It's also a faster way to
get software written generally.
この開発スタイルは、ウェブベースのソフトウェアにおいて可能なローリング
リリースにうまく適合している。また、一般にソフトウェアを書くためのより
速い方法の一つでもある。
*** Interactive Toplevel (対話的なトップレベル)
Lisp's interactive toplevel is a great help in developing software
rapidly. But the biggest advantage for us was probably in finding
bugs. As I mentioned before, with Web-based applications you have
the users' data on your servers and can usually reproduce bugs.
Lispの対話的なトップレベルは、ソフトウェアを迅速に開発するために非常に
役立つ。しかし最大のアドバンテージは、おそらくバグを見つける際に得られた。
前述したように、ウェブベースのアプリケーションでは、
ユーザのデータがサーバ上にあるから、多くの場合はバグを再現できるのである。
When one of the customer support people came to me with a report
of a bug in the editor, I would load the code into the Lisp
interpreter and log into the user's account. If I was able to
reproduce the bug I'd get an actual break loop, telling me exactly
what was going wrong. Often I could fix the code and release a
fix right away. And when I say right away, I mean while the user
was still on the phone.
カスタマサポートの一人が私のところにエディタのバグレポートを持ってくれ
ば、私はLispインタプリタ(訳注2.)にコードをロードして、そのユーザのアカ
ウントにログインする。そして、そのバグを再現することができれば、
私は現実のブレークループに到達することになり(訳注3.)、何が悪かったかが正確に分かる。
そのコードを修正して即座にリリースできることも多いだろう。ここで、即座
にというのは、ユーザがまだカスタマサポートに電話している間にということ
である。
Such fast turnaround on bug fixes put us into an impossibly tempting
position. If we could catch and fix a bug while the user was still
on the phone, it was very tempting for us to give the user the
impression that they were imagining it. And so we sometimes (to
their delight) had the customer support people tell the user to
just try logging in again and see if they still had the problem.
And of course when the user logged back in they'd get the newly
released version of the software with the bug fixed, and everything
would work fine. I realize this was a bit sneaky of us, but it
was also a lot of fun.
そのように素速くバグフィックスを行うことで、私たちは非常においしい
立場に立つことになる。まだユーザが電話している間にバグを捕まえて
修正できたなら、カスタマサポートが問題をユーザの思い違いと捉えている
という印象を与えるという点でおいしいのである。
ときには、(カスタマサポートにとっては喜ばしいことに)ユーザにもう
一度ログインして問題が起こるかどうか確かめるよう伝えてもらえた。すると、
もちろんユーザがログインしなおすのは、バグが修正されたソフトウェアの
新たにリリースされたバージョンなので、全てはうまく動作するのである。
これは少しずるいとは思ったが、同時に非常に楽しくもあった。
*** Macros for Html (HTMLのためのマクロ)
Lisp macros were another big win for us. We used them very
extensively in the Viaweb editor. It could accurately be described
as one big macro. And that gives you an idea of how much we depended
on Lisp, because no other language has macros in the sense that
Lisp does.
Lispのマクロは、私たちにとってはもう一つの大当たりだった。Viawebエディタの
中では非常に広範囲にわたってマクロを使った。正確には、Viawebエディタが
一つの大きなマクロと言えそうだ。そのことで私たちがいかにLispをあてにし
ていたかが分かるだろう。なぜなら、Lispが持っているマクロと同じ意味のマ
クロを持っている言語は他には無いからだ。
One way we used macros was to generate Html. There is a very
natural fit between macros and Html, because Html is a prefix
notation like Lisp, and Html is recursive like Lisp. So we had
macro calls within macro calls, generating the most complicated
Html, and it was all still very manageable.
マクロの用途の一つは、HTMLを生成することだった。マクロはHTMLにとても
自然にフィットした。というのは、HTMLはLispのように前置記法だし、HTMLは
Lispのように再帰的だからだ。最も複雑で込み入ったHTMLを生成する際に、
私たちはマクロ呼出しの中でマクロ呼出しを行うようにしたが、それは依然と
してとても扱い易いものだった。
*** Embedded Languages (埋め込み言語)
Another big use for macros was the embedded language we had for
describing pages, called Rtml. (We made up various explanations
for what Rtml was supposed to stand for, but actually I named it
after Robert Morris, the other founder of Viaweb, whose username
is Rtm.)
マクロの別の大きな用途は、RTMLと呼ばれるページ記述用の埋込み言語だった。
(私たちはRtmlが何を表すかについて色々な説明をしたが、本当は私がViaweb
のもう一人の創業者であるロバートモリスにちなんで名付けた -- 彼のログイ
ン名がRtmなのだ)
Every page made by our software was generated by a program written
in Rtml. We called these programs templates to make them less
frightening, but they were real programs. In fact, they were Lisp
programs. Rtml was a combination of macros and the built-in Lisp
operators.
私たちのソフトウェアが生成するあらゆるページがRtmlで書かれたプログラム
によって生成された。誰かを脅かすことのないように、これらのプログラムの
ことをテンプレートと呼んでいたが、これらは正真正銘のプログラムだ。実際、
これらはLispのプログラムだった。RtmlはマクロとLispの組み込みオペレータ
の組み合わせだった。
Users could write their own Rtml templates to describe what they
wanted their pages to look like. We had a structure editor for
manipulating these templates, a lot like the structure editor they
had in Interlisp. Instead of typing free-form text, you cut and
pasted bits of code together. This meant that it was impossible
to get syntax errors. It also meant that we didn't have to display
the parentheses in the underlying s-expressions: we could show
structure by indentation. By this means we made the language look
a lot less threatening.
ユーザは自分のページをどのように見せたいかを記述するために、自分自身の
RTMLテンプレートを書くことができた。私たちには、Interlispの構造エディ
タによく似たこれらのテンプレートを操作するための構造エディタがあって、
ユーザは自由形式のテキストをタイプする代わりに、コードの断片をカットし
たりペーストしたりする。これは構文エラーを起こさなくなることを意図した
ものだ。また、S式の背後にあるカッコを表示する必要がなくなることも意図
していた。構造をインデントで見せることができたからだ。
このようにして、私たちは言語がユーザを脅かさないようにしていた。
We also designed Rtml so that there could be no errors at runtime:
every Rtml program yielded some kind of Web page, and you could
debug it by hacking it until it produced the page you meant it to.
また、私たちはRTMLが実行時にエラーを起こさないように設計した: あらゆるRTML
プログラムは何らかのウェブページを出力するのだ。そうすることで、所望のページが
出力されるまで、ユーザはRTMLプログラムを修正してデバッグすることができる。
Initially we expected our users to be Web consultants, and we
expected them to use Rtml a lot. We provided some default templates
for section pages and item pages and so on, and the idea was that
the users could take them and modify them to make whatever pages
they wanted.
私たちは当初、ユーザがウェブコンサルタントになると予想し、彼らがRTMLを
よく使うことを期待していた。それで、セクションページやアイテムページ等
にデフォルトのテンプレートをそこそこ用意した。ユーザがそれらを使ったり
修正したりして、所望のページを作成すると考えていたのだ。
In fact it turned out that Web consultants didn't like Viaweb.
Consultants, as a general rule, like to use products that are too
hard for their clients to use, because it guarantees them ongoing
employment. Consultants would come to our Web site, which said
all over it that our software was so easy to use that it would let
anyone make an online store in five minutes, and they'd say, there's
no way we're using that. So we didn't get a lot of interest from
Web consultants. Instead the users all tended to be end-users,
the actual merchants themselves. They loved the idea of being in
control of their own Web sites. And this kind of user did not want
to do any kind of programming. They just used the default templates.
実際には、ウェブコンサルタントはViawebを好まないことが判った。一般にコ
ンサルタントとは、クライアントが使うには難しいプロダクトを使うことを好
む。なぜなら、それが彼らの継続的雇用を保障するからだ。コンサルタントは
私たちのウェブサイトに来ると、全般にわたって、ソフトウェアが非常に使い易
いので、誰でもオンラインストアを5分で作れるだろうと言い、それからこのソ
フトウェアを使うことはできないというのである。それで、私たちはウェブコ
ンサルタントから十分な関心を得ることができなかった。代わりとなるユーザ
は皆エンドユーザ、すなわち実際の商売人自身である傾向があった。彼らは
自分のウェブサイトをコントロールできるという考え方を好んだ。そして、
この種のユーザはいかなる種類のプログラミングも望まなかった。
彼らはただデフォルトのテンプレートを使ったのである。
So Rtml didn't end up being the main interface to the program. It
ended up playing two roles. First of all, it was an escape valve
for the really sophisticated users, who wanted something our built-in
templates couldn't provide. Somewhere in the course of doing
Viaweb, someone gave me a very useful piece of advice: users always
want an upgrade path, even though as a rule they'll never take it.
Rtml was our upgrade path. If you wanted to, you could get absolute
control over everything on your pages.
それで、RTMLは私たちのプログラムのメインのインタフェースにはならなかっ
た。RTMLは、結局二つの役割を果たすことが判った。まず第一に、それは本当に
洗練されたユーザのための抜け道になる -- 彼らは私たちの組込みテンプレート
が提供しない何かを望むのだ。Viawebをやっている過程のどこかで、誰かが私
に非常に有益な助言を一言くれた: ユーザはたとえ採用することがなく
ても常にアップグレードパスを欲しがるものだと。RTMLは私たちが提供するアッ
プグレードパスになる。もしユーザが望むならば、彼らのページのあらゆることを
絶対的にコントロールできるのだ。
Only one out of every couple hundred users actually wrote their
own templates. And this led to the second advantage of Rtml. By
looking at the way these users modified our built-in templates, we
knew what we needed to add to them. Eventually we made it our goal
that no one should ever have to use Rtml. Our built-in templates
should do everything people wanted. In this new approach, Rtml
served us as a warning sign that something was missing in our
software.
200〜300人のユーザの中のたった一人が、実際に自分自身でテンプレートを書いた。
そして、このことはRTMLの2番目のアドバンテージにつながった。こうした
ユーザが私たちの組込みテンプレートを変更する方法を観察することで、
我々が何を追加しなければならないかが分かったのだ。結果として、私たちは
自分たちの目標を、誰もRTMLを使う必要がないようにすべき、ということに
した。私たちの組込みテンプレートは、人々が望む全てのことをすべき
なのだ。この新しいやり方では、RTMLは私たちのソフトウェアに何かが
欠けているという警告信号を出してくれたのである。
The third and biggest win from using Rtml was the advantage we
ourselves got from it. Even if we had been the only people who
used Rtml, it would have been very much worth while writing the
software that way. Having that extra layer of abstraction in our
software gave us a big advantage over competitors. It made the
design of our software much cleaner, for one thing. Instead of
just having bits of actual C or Perl code that generated our Web
pages, like our competitors, we had a very high-level language for
generating Web pages, and our page styles specified in that. It
made the code much cleaner and easier to modify. I've already
mentioned that Web-based applications get released as a series of
many small modifications. When you do that you want to be able to
know how serious any given modification is. By dividing your code
into layers, you get a better handle on this. Modifying stuff in
lower layers (Rtml itself) was a serious matter to be done rarely,
and after much thought. Whereas modifying the top layers (template
code) was something you could do quickly without worrying too much
about the consequences.
RTMLを使うことで得た3番目の、そして一番の大当たりは、私たち自身
がRTMLから得たアドバンテージだった。たとえ私たちが唯一のRTMLのユーザだっ
たとしても、ソフトウェアをそのやり方で記述することには、とても価値があっ
たのだ。自分たちのソフトウェアの中に追加の抽象レイヤを持つことは、競合
他社に対する大きなアドバンテージをもたらした。
一例を挙げると、そうすることで、私たちのソフトウェアの設計はずっと綺麗になっ
た。競合他社のように、単にウェブページを生成する実際のC言語やPerlのコー
ド片を持つだけでなく、私たちはウェブページを生成するための非常に高級な
言語と、その言語で記述された複数のページスタイルを持つことになった。
そして、実際のコードもずっと綺麗になり、変更も容易になった。
ウェブベースのアプリケーションは沢山の小さな変更の連続としてリリースさ
れることは既に述べたが、そのようなリリースを行う場合に、ある変更がいか
に重大なのかを知りたくなる。コードを複数のレイヤに分割することで、この
問題をうまく扱うことができる。下位のレイヤー(RTMLそれ自体)の変更は、
滅多に行われない重大な問題だった。一方で、上位のレイヤ(テンプレートコー
ド)の変更は、結果をあまり心配することなく、素早く行うことができた。
Rtml was a very Lispy proposition. It was mostly Lisp macros, to
start with. The online editor was, behind the scenes, manipulating
s-expressions. And when people ran templates, they got compiled
into Lisp functions by calling compile at runtime.
RTMLはとてもLisp的な仕事だった。まず第一に、それは大部分がLispのマクロ
だった。オンラインエディタは舞台裏でS式を操作した。そして、ユーザが
テンプレートを操作すると、compile関数が呼び出されてテンプレートをLispの
関数にコンパイルした。
Rtml even depended heavily on keyword parameters, which up to that
time I had always considered one of the more dubious features of
Common Lisp. Because of the way Web-based software gets released,
you have to design the software so that it's easy to change. And
Rtml itself had to be easy to change, just like any other part of
the software. Most of the operators in Rtml were designed to take
keyword parameters, and what a help that turned out to be. If I
wanted to add another dimension to the behavior of one of the
operators, I could just add a new keyword parameter, and everyone's
existing templates would continue to work. A few of the Rtml
operators didn't take keyword parameters, because I didn't think
I'd ever need to change them, and almost every one I ended up
kicking myself about later. If I could go back and start over from
scratch, one of the things I'd change would be that I'd make every
Rtml operator take keyword parameters.
RTMLは、実にキーワードパラメータにも大きく依存していていた -- その頃ま
では Common Lispのかなり疑わしい機能の一つと私が日頃考えていた機能に
である。
ウェブベースのソフトは、そのリリース手法のせいで、変更し易いように設計
されている必要がある。それで、RTMLそれ自体も、このソフトウェアの他の部分と
同様に、変更し易くなっている必要があった。
RTMLの大部分のオペレータはキーワードパラメータをとるように設計されており、
それでどれほど助けられたと判っただろう。
もし、RTLオペレータの一つの振舞いに別の次元を加えたくなったら、単に新し
いキーワードパラメータを追加すればよく(訳注4.)、全ての人の既存のテンプ
レートは引き続き動作する。
RTMLの幾つかのオペレータがキーワードパラメータをとらないのは、今後変更
が必要になると全く思わなかったからなのだが、その殆ど全てに対して、後に
自分に腹を立てることになった。もし、元に戻って最初からやり直すことがで
きるのであれば、変更することの一つは、全てのRTMLオペレータがキーワード
パラメータをとるようにすることだろう。
We had a couple embedded languages within the editor, in fact.
Another one, which we didn't expose directly to the users, was for
describing images. Viaweb included an image generator, written in
C, that could take a description of an image, create that image,
and return its url. We used s-expressions to describe these images
as well.
Viawebエディタの中には、実際には二つの埋め込み言語があった。もう一つの言語とは、
利用者には直接見せられてはいなかったが、イメージを記述するためのものである。
ViawebはC言語で記述されたイメージジェネレータを備えていて、画像の記述を受け取って、
イメージデータの生成を行い、そしてそのデータへのURLを返すことができた。
このようなイメージの記述も、S式を用いて行った。
*** Closures Simulate Subroutines (クロージャによるサブルーチンの模倣)
One of the problems with using Web pages as a UI is the inherent
statelessness of Web sessions. We got around this by using lexical
closures to simulate subroutine-like behavior. If you understand
about continuations, one way to explain what we did would be to
say that we wrote our software in continuation-passing style.
ウェブページをUIとして使うことに伴って生ずる問題の一つは、ウェブセッショ
ンが本来ステートレスなことである。私たちはレキシカルクロージャを使って
サブルーチンのような振舞いを模倣することで、この問題を回避した。
もし、継続(continuation)について理解しているのなら、私たちがやったこと
を説明する一つの方法は、私たちのソフトウェアは継続渡し形式(continuation-
passing-style; 略してCPS)で書かれたということだ。
When most web-based software generates a link on a page, it tends
to be thinking, if the user clicks on this link, I want to call
this cgi script with these arguments. When our software generated
a link, it could think, if the user clicks on this link, I want to
run this piece of code. And the piece of code could an arbitrary
piece of code, possibly (in fact, usually) containing free variables
whose value came from the surrounding context.
大部分のウェブベースのソフトウェアがページに対するリンクを生成するとき
は、「ユーザがこのリンクをクリックしたら、このCGIスクリプトをこれらの
引数で呼出したい」と考えていることだろう。
私たちのソフトウェアがリンクを生成するときは、「ユーザがこのリンクを
クリックしたら、このコード片を実行したい。そして、このコード片は、
可能性としては(実のところ大抵そうなのだが)その値が周囲の環境から定まる
自由変数を含んだコードである」と考える。
The way we did this was to write a macro that took an initial
argument expected to be a closure, followed by a body of code.
The code would then get stored in a global hash table under a unique
id, and whatever output was generated by the code in the body would
appear within a link whose url contained that hash key. If that
link was the next one clicked on, our software would find and call
the corresponding bit of code, and the chain would continue.
Effectively we were writing cgi scripts on the fly, except that
they were closures that could refer to the surrounding context.
私たちが採った方法はマクロを書くことだった -- その第1引数はクロージャ
(訳注5.)であることが想定されていて、マクロの本体にはコードがある。
マクロ本体のコードは大域的なハッシュ表にユニークなIDをキーとして登録される。
コードが生成する出力は、上述のハッシュキーをURLに含んだリンクの中身に現れる。
もし、そのリンクが次にクリックされたなら、私たちのソフトウェアはハッシュ表から
対応するコード片を見つけて呼び出す。すると、呼び出された続き(訳注6.)が継続する。
実際上は、私たちはCGIスクリプトを実行時に生成しているのだ -- このスクリプトは
周辺の環境を参照する可能性のあるクロージャであることが異例ではあるが。
So far this sounds very theoretical, so let me give you an example
of where this technique made an obvious difference. One of the
things you often want to do in Web-based applications is edit an
object with various types of properties. Many of the properties
of an object can be represented as form fields or menus. If you're
editing an object representing a person, for example, you might
get a field, for their name, a menu choice for their title, and so
on.
ここまでだと理論上の話に聞こえるので、この技術が明白な違いを生み出す例
を示そう。ウェブベースのアプリケーションの中で度々行いたいことの1つに、
いろいろな種類の属性を持ったオブジェクトの編集がある。オブジェクトの
属性の多くはフォームのフィールドやメニューで表される可能性がある。例えば、
人を表すオブジェクトを編集するときは、まずその人の名前に対応するフィー
ルドを取得し、メニューから役職を選択して、という具合である。
Now what happens when some object has a property that is a color?
If you use ordinary cgi scripts, where everything has to happen on
one form, with an Update button at the bottom, you are going to
have a hard time. You could use a text field and make the user
type an rgb number into it, but end-users don't like that. Or you
could have a menu of possible colors, but then you have to limit
the possible colors, or otherwise even to offer just the standard
Web colormap, you'd need 256 menu items with barely distinguishable
names.
ここで、あるオブジェクトが色の属性を持っているとき、何が起こるだろうか。
もし、通常のCGIスクリプトを使うことにすると、そこでは全てのことを、
例えばページの下部にある更新ボタンを使って、1つのフォームで起こす必要が
あるので苦労しそうである。
テキストフィールドを使ってユーザーにRGBの数値をタイプ入力させることが
考えられるが、エンドユーザは入力された色が気に入らないかもしれない。
あるいは、可能な色のメニューを使うかもしれないが、そうすると可能な色が
制限されてしまうかもしれない。別の方法として、たとえ標準のウェブの
カラーマップを提示するだけにしても、今度はなんとか識別可能な256の
メニュー項目が必要になる。
What we were able to do, in Viaweb, was display a color as a swatch
representing the current value, followed by a button that said
"Change." If the user clicked on the Change button they'd go to
a page with an imagemap of colors to choose among. And after they
chose a color, they'd be back on the page where they were editing
the object's properties, with that color changed. This is what I
mean about simulating subroutine-like behavior. The software could
behave as if it were returning from having chosen a color. It
wasn't, of course; it was making a new cgi call that looked like
going back up a stack. But by using closures, we could make it
look to the user, and to ourselves, as if we were just doing a
subroutine call. We could write the code to say, if the user clicks
on this link, go to the color selection page, and then come back
here. This was just one of the places were we took advantage of
this possibility. It made our software visibly more sophisticated
than that of our competitors.
Viawebで可能にしていたことは、現在の値を示す見本としての1つの色と、引き続いて
変更というボタンを表示することである。もし、ユーザが変更ボタンをクリックすると、
色を選択するイメージマップを備えたページに移動する。ユーザが色を一つ選択すると
元のオブジェクトの属性を編集していたページに戻るが、そこでは見本の色が変更されている。
これが私がサブルーチンのような振舞いと言っていることである。
このソフトウェアでは、まるで選んだ色が返されたかのように振る舞うことができた。
もちろん、実際にはそうではない。新しいCGI呼出しが行われて、そこではあたかも
スタックを遡って元に戻ったかのように見えたのである。しかし、クロージャを用いる
ことで、ユーザにとって、そして私たち自身にとっても、まるでサブルーチンコールの
ように見せることができた。私たちはこのコードを、言ってみれば、もしユーザがリンクを
クリックすると、カラー選択ページへ移動して、それからここへ戻ってくる、と書くことが
できた。該当箇所は、この可能性を利用した複数の箇所の一つに過ぎない。この手法は、
私たちのソフトウェアを競合他社のものよりも、目に見えて洗練されたものにしたのである。
*** 訳注
1. (削除)
2. Viawebの実運用環境ではCLISPを利用していたとのこと。
CLISPではインタプリタ実行時とコンパイルコード実行時のデバッグ機能に
ある程度の差があって、デバッグには前者の方が適している。
もう一つ、ユーザ向けにはRTMLはランタイムエラーを起こさないように
設計されていたということが少し下に書かれている。それで、ここでは
インタプリタにコードをロードして(し直して)と記されているのだろう。
3. ブレークループとは、Common Lispでerror, cerror, break等の関数が呼ばれた後に
到達するLisp処理系付属のデバッガのコマンドループ(に入っている状態)を指す。
4. Common Lispに慣れた人には同意してもらえると思うが、
RTMLオペレータに対するキーワードパラメータの追加は、
オペレータに対応するmarkupタグに対する属性の追加にあたる、
と考えるのが自然だろう。
ここでは、タグ(<->RTMLオペレータ)の既存の属性(<->キーワードパラメータ)に
影響を与えずに、新たな属性(<->キーワードパラメータ)を加えるという
やや構文よりの課題について述べていることになる。
5. CPSそのものについて殆ど説明されていない感じだが、
この第1引数のクロージャが continuationということと思われる。
すると、
厳密な定義は個別の事情にもよるが、一例として continuationを表すクロージャを
1引数の関数 k と考えることが出来る。
仮に マクロ foo の定義を
(defmacro foo ((k . rest-args) &body body) ...マクロ展開形定義... )
とする。ハッシュ表に登録された本体のコードは、CPS形式 (予めCPS形式で
書かれるか、あるいは マクロ展開によりCPS形式に変換されていることだろう)であり、
最後 foo の本体 からreturnする代わりに、返り値 v を 引数として
continuation k を (funcall k v) と呼び出すことになる。
なお、fooの呼び出し側は、k を (lambda (v) ... ) のようにクロージャとして
与えるので、 ... の部分には クロージャを呼び出す側の環境(本文ではsurrounding
context)で参照可能な変数を利用することができる。
6. 効果としては、次のウェブページが表示される、ということと思われる。
(直接そうは書かれていないが)

Translated on 2016-11-25 by Google Neuralnet Machine Translation

Lisp in Web-Based Applications

WebベースのアプリケーションにおけるLisp

Paul Graham

ポールグラハム

(This is an excerpt of a talk given at BBN Labs in Cambridge, MA, in April 2001.)

(これは2001年4月、ケンブリッジのBBN Labsで講演された講演の抜粋です)

Any Language You Want

あなたが望むすべての言語

One of the reasons to use Lisp in writing Web-based applications is that you can use Lisp. When you’re writing software that is only going to run on your own servers, you can use whatever language you want.

Webベースのアプリケーションを書く際にLispを使う理由の1つは、Lispを使うことができるということです。 あなた自身のサーバー上で実行されるだけのソフトウェアを書くときは、どんな言語でも使えます。

For a long time programmers didn’t have a lot of choice about what language to use for writing application programs. Until recently, writing application programs meant writing software to run on desktop computers. In desktop software there was a strong bias toward writing the application in the same language as the operating system. Ten years ago, for all practical purposes, applications were written in C.

長い間、プログラマーは、アプリケーションプログラムの作成にどの言語を使用するかについて多くの選択肢がありませんでした。 最近まで、アプリケーションプログラムを書くことは、デスクトップコンピュータ上で実行するソフトウェアを書くことを意味していました。 デスクトップソフトウェアでは、オペレーティングシステムと同じ言語でアプリケーションを書くことに強いバイアスがありました。 10年前、すべての実用的な目的のために、アプリケーションはC言語で書かれました。

With Web-based applications, that changes. You control the servers, and you can write your software in any language you want. You can take it for granted now that you have the source code of both your operating system and your compilers. If there does turn out to be any kind of problem between the language and the OS, you can fix it yourself.

Webベースのアプリケーションでは、それが変化します。 あなたはサーバーを制御し、必要な言語でソフトウェアを書くことができます。 あなたはあなたのオペレーティングシステムとコンパイラの両方のソースコードを手に入れたので、それは当然のことです。 言語とOSの間に何らかの問題が発生した場合は、自分で修正することができます。

This new freedom is a double-edged sword, however. Having more choices means that you now have to think about which choice to make. It was easier in the old days. If you were in charge of a software project, and some troublesome person suggested writing the software in a different language from whatever you usually used, you could just tell them that it would be impractical, and that would be the end of it.

しかし、この新しい自由は両刃の剣です。 より多くの選択肢があるということは、あなたが今どの選択をするかについて考える必要があることを意味します。 それは昔のほうが簡単でした。 あなたがソフトウェアプロジェクトを担当していて、面倒な人の中には、通常使用している言語とは異なる言語でソフトウェアを書くことが提案されていれば、実用的ではないと言えるかもしれません。

Now, with server-based applications, everything is changed. You’re now subject to market forces in what language you choose. If you try to pretend that nothing has changed, and just use C and C++, like most of our competitors did, you are setting yourself up for a fall. A little startup using a more powerful language will eat your lunch.

現在、サーバーベースのアプリケーションでは、すべてが変更されています。 あなたは現在、あなたが選んだ言語で市場の力に服しています。 何も変わっていないと思って、CやC ++を使うだけなら、ほとんどの競合他社と同じように、 あなたは秋のために自分自身を設定しています。 より強力な言語を使用して少しスタートアップはあなたのランチを食べるでしょう。

Incremental Development

インクリメンタル開発

There is a certain style of software development associated with Lisp. One of its traditions is incremental development: you start by writing, as quickly as possible, a program that does almost nothing. Then you gradually add features to it, but at every step you have working code.

Lispにはある種のソフトウェア開発スタイルがあります。 その伝統の一つは、漸進的な開発です。あなたはできるだけ早く、ほとんど何もしないプログラムを書くことから始まります。 その後徐々に機能を追加しますが、すべてのステップで作業コードがあります。

I think this way you get better software, written faster. Everything about Lisp is tuned to this style of programming, because Lisp programmers have worked this way for at least thirty years.

私はあなたがより速く書かれたより良いソフトウェアを得るこの方法だと思います。 Lispのプログラマは少なくとも30年間この方法で作業してきたので、Lispに関するすべてのことがこのスタイルのプログラミングに調整されています。

The Viaweb editor must be one of the most extreme cases of incremental development. It began with a 120-line program for generating Web sites that I had used in an example in a book that I finished just before we started Viaweb. The Viaweb editor, which eventually grew to be about 25,000 lines of code, grew incrementally from this program. I never once sat down and rewrote the whole thing. I don’t think I was ever more than a day or two without running code. The whole development process was one long series of gradual changes.

Viawebエディタは、インクリメンタル開発の最も極端なケースの1つでなければなりません。 それは、私がViawebを始める直前に完成した本の例で使ったWebサイトを生成するための120行のプログラムから始まりました。 最終的に約25,000行に拡大したViawebエディタは、このプログラムから段階的に成長しました。 私は一度座って全体を書き直したことはありません。 私はコードを実行していない1日か2日以上はなかったと思います。 全体の開発プロセスは、徐々に変化する長い一連のものでした。

This style of development fits well with the rolling releases that are possible with Web-based software. It’s also a faster way to get software written generally.

このような開発スタイルは、Webベースのソフトウェアで可能なローリングリリースに適しています。 また、ソフトウェアを一般的に書くためのより速い方法です。

Interactive Toplevel

インタラクティブトップレベル

Lisp’s interactive toplevel is a great help in developing software rapidly. But the biggest advantage for us was probably in finding bugs. As I mentioned before, with Web-based applications you have the users’ data on your servers and can usually reproduce bugs.

Lispのインタラクティブなトップレベルは、ソフトウェアを急速に開発する大きな助けとなります。 しかし、私たちの最大のメリットはおそらくバグを発見することでした。 先に述べたように、Webベースのアプリケーションでは、サーバー上にユーザーのデータがあり、通常はバグを再現できます。

When one of the customer support people came to me with a report of a bug in the editor, I would load the code into the Lisp interpreter and log into the user’s account. If I was able to reproduce the bug I’d get an actual break loop, telling me exactly what was going wrong. Often I could fix the code and release a fix right away. And when I say right away, I mean while the user was still on the phone.

顧客サポート担当者の1人がエディタでバグの報告を受けて私に来たとき、私はそのコードをLispインタプリタにロードし、ユーザのアカウントにログインします。 バグを再現できたら、実際のブレークループが発生し、何がうまくいかないのか正確に教えてくれます。 しばしば、コードを修正して直ちに修正をリリースすることができました。 私がすぐに言うとき、私はユーザーがまだ電話にいた間に意味する。

Such fast turnaround on bug fixes put us into an impossibly tempting position. If we could catch and fix a bug while the user was still on the phone, it was very tempting for us to give the user the impression that they were imagining it. And so we sometimes (to their delight) had the customer support people tell the user to just try logging in again and see if they still had the problem. And of course when the user logged back in they’d get the newly released version of the software with the bug fixed, and everything would work fine. I realize this was a bit sneaky of us, but it was also a lot of fun.

このようなバグ修正の迅速な回帰は、私たちを非常に魅力的な立場に陥りました。 ユーザーがまだ電話をかけている間にバグを見つけて修正できれば、ユーザーに想像しているような印象を与えることが非常に魅力的でした。 そして、時には(喜んで)顧客サポート担当者がユーザーに再度ログインしても、まだ問題があるかどうかを確認するように指示することがありました。 もちろん、ユーザーがログインしたときに、バグを修正したばかりの新しくリリースされたバージョンのソフトウェアを入手すると、すべて正常に動作します。 私はこれが私たちのちょっと卑劣だったことを理解していますが、それはまたとても楽しいものでした。

Macros for Html

HTML用マクロ

Lisp macros were another big win for us. We used them very extensively in the Viaweb editor. It could accurately be described as one big macro. And that gives you an idea of how much we depended on Lisp, because no other language has macros in the sense that Lisp does.

Lispマクロは私たちのもう一つの大きな勝利でした。 私たちはViawebエディタで非常に幅広く使用しました。 それは正確に1つの大きなマクロとして記述することができます。 そしてそれはLispにどれくらい依存しているのかを知ることができます。なぜなら、他の言語にはLispの意味でのマクロがないからです。

One way we used macros was to generate Html. There is a very natural fit between macros and Html, because Html is a prefix notation like Lisp, and Html is recursive like Lisp. So we had macro calls within macro calls, generating the most complicated Html, and it was all still very manageable.

マクロを使用する一つの方法は、Htmlを生成することでした。 HtmlはLispのような接頭辞表記であり、HtmlはLispのように再帰的であるので、マクロとHtmlの間には非常に自然な適合があります。 だから私たちはマクロ呼び出しの中でマクロ呼び出しを行い、最も複雑なHTMLを生成しました。

Embedded Languages

埋め込み言語

Another big use for macros was the embedded language we had for describing pages, called Rtml. (We made up various explanations for what Rtml was supposed to stand for, but actually I named it after Robert Morris, the other founder of Viaweb, whose username is Rtm.)

マクロのもう1つの大きな用途は、Rtmlというページを記述するための埋め込み言語でした。 (私たちは、Rtmlが何を意味するかについて様々な説明をしましたが、実際にはユーザー名がRtmのViawebの創設者であるRobert Morrisの名前を付けました)。

Every page made by our software was generated by a program written in Rtml. We called these programs templates to make them less frightening, but they were real programs. In fact, they were Lisp programs. Rtml was a combination of macros and the built-in Lisp operators.

私たちのソフトウェアによって作られたすべてのページは、Rtmlで書かれたプログラムによって生成されました。 私たちはこれらのプログラムテンプレートを、それほど恐ろしいものにしないように呼びましたが、実際のプログラムでした。 実際、彼らはLispプログラムでした。 Rtmlはマクロと組み込みのLisp演算子の組み合わせです。

Users could write their own Rtml templates to describe what they wanted their pages to look like. We had a structure editor for manipulating these templates, a lot like the structure editor they had in Interlisp. Instead of typing free-form text, you cut and pasted bits of code together. This meant that it was impossible to get syntax errors. It also meant that we didn’t have to display the parentheses in the underlying s-expressions: we could show structure by indentation. By this means we made the language look a lot less threatening.

ユーザーは自分のページをどのように見せたいかを記述する独自のRtmlテンプレートを書くことができます。 これらのテンプレートを操作するための構造エディタがありました.Interlispで使用していた構造エディタとよく似ています。 自由形式のテキストを入力するのではなく、複数のコードをカットアンドペーストします。 これは、構文エラーを得ることが不可能であることを意味しました。 また、基礎となるs式にかっこを表示する必要がないことも意味しました。字下げによって構造を表示することができました。 これにより、私たちは言語の見た目をあまり脅かさないようにしました。

We also designed Rtml so that there could be no errors at runtime: every Rtml program yielded some kind of Web page, and you could debug it by hacking it until it produced the page you meant it to.

また、実行時にエラーが発生しないようにRtmlを設計しました。すべてのRtmlプログラムは何らかのWebページを生成し、それをハックしてデバッグすることで、意図したページを生成します。

Initially we expected our users to be Web consultants, and we expected them to use Rtml a lot. We provided some default templates for section pages and item pages and so on, and the idea was that the users could take them and modify them to make whatever pages they wanted.

当初は、ユーザーがWebコンサルタントになることを期待していましたが、Rtmlを多く使用することを期待していました。 セクションページやアイテムページなどのデフォルトのテンプレートをいくつか用意しました。ユーザーはそれらを持ってきて、必要なページを作成できるように変更することができました。

In fact it turned out that Web consultants didn’t like Viaweb. Consultants, as a general rule, like to use products that are too hard for their clients to use, because it guarantees them ongoing employment. Consultants would come to our Web site, which said all over it that our software was so easy to use that it would let anyone make an online store in five minutes, and they’d say, there’s no way we’re using that. So we didn’t get a lot of interest from Web consultants. Instead the users all tended to be end-users, the actual merchants themselves. They loved the idea of being in control of their own Web sites. And this kind of user did not want to do any kind of programming. They just used the default templates.

実際、WebコンサルタントはViawebを好まなかったことが判明しました。 コンサルタントは、原則として、継続的な雇用を保証するため、顧客が使用するにはあまりにも困難な製品を使用することを好む。 コンサルタントは私たちのウェブサイトに来て、私たちのソフトウェアは誰もが5分でオンラインストアを作れるように使いやすく、それを使用する方法はないと言っています。 だから我々はWebコンサルタントから多くの関心を得ていない。 その代わりに、ユーザーはすべて実際の販売者であるエンドユーザーである傾向がありました。 彼らは自分のWebサイトを管理するという考えを愛していました。 そして、この種のユーザーはどんな種類のプログラミングもしたくなかった。 彼らはちょうどデフォルトテンプレートを使用しました。

So Rtml didn’t end up being the main interface to the program. It ended up playing two roles. First of all, it was an escape valve for the really sophisticated users, who wanted something our built-in templates couldn’t provide. Somewhere in the course of doing Viaweb, someone gave me a very useful piece of advice: users always want an upgrade path, even though as a rule they’ll never take it. Rtml was our upgrade path. If you wanted to, you could get absolute control over everything on your pages.

だからRtmlはプログラムの主なインターフェースになったわけではありません。 それは2つの役割を果たした。 まず、本当に洗練されたユーザーのためのエスケープバルブでしたが、私たちの組み込みのテンプレートでは提供できなかったことを望んでいました。 Viawebをやっている途中で、誰かが私に非常に有用なアドバイスをくれました。ユーザーは常にアップグレードの道を求めています。 Rtmlが私たちのアップグレードパスでした。 あなたがしたい場合は、あなたのページのすべてを完全に制御することができます。

Only one out of every couple hundred users actually wrote their own templates. And this led to the second advantage of Rtml. By looking at the way these users modified our built-in templates, we knew what we needed to add to them. Eventually we made it our goal that no one should ever have to use Rtml. Our built-in templates should do everything people wanted. In this new approach, Rtml served us as a warning sign that something was missing in our software.

数百人に1人のユーザーしか実際に自分のテンプレートを書きませんでした。 そしてこれがRtmlの第2の利点につながった。 これらのユーザーが組み込みのテンプレートを変更する方法を見ることで、追加する必要があったことがわかりました。 最終的に私たちは誰もRtmlを使う必要がないという目標を達成しました。 私たちの組み込みのテンプレートは、人々が望むすべてを実行する必要があります。 この新しいアプローチでは、Rtmlは私たちのソフトウェアに何かが欠けていたという警告兆候として役立っていました。

The third and biggest win from using Rtml was the advantage we ourselves got from it. Even if we had been the only people who used Rtml, it would have been very much worth while writing the software that way. Having that extra layer of abstraction in our software gave us a big advantage over competitors. It made the design of our software much cleaner, for one thing. Instead of just having bits of actual C or Perl code that generated our Web pages, like our competitors, we had a very high-level language for generating Web pages, and our page styles specified in that. It made the code much cleaner and easier to modify. I’ve already mentioned that Web-based applications get released as a series of many small modifications. When you do that you want to be able to know how serious any given modification is. By dividing your code into layers, you get a better handle on this. Modifying stuff in lower layers (Rtml itself) was a serious matter to be done rarely, and after much thought. Whereas modifying the top layers (template code) was something you could do quickly without worrying too much about the consequences.

Rtmlを使用することから3番目に大きな利益を得たのは、私たち自身が得た利点でした。私たちがRtmlを使った唯一の人であったとしても、そのような方法でソフトウェアを書くのは非常に価値があったでしょう。ソフトウェアでこのような抽象レイヤーを追加することで、競合他社に勝る大きな利点がもたらされました。それは、私たちのソフトウェアの設計をずっときれいにしました。 Webページを生成する実際のCコードやPerlコードを競合他社と同じように使うのではなく、Webページを生成するための非常に高度な言語とそのページスタイルを指定しました。コードをよりクリーンで簡単に修正できました。 Webベースのアプリケーションは、一連の多くの小さな変更としてリリースされると私はすでに述べました。あなたがそうするとき、あなたは与えられた修正がどんなに深刻であるかを知ることができるようにしたいと思っています。コードをレイヤーに分割することで、これをよりよく処理できます。下層(Rtml自体)のものを変更することは、まれにしかやりたくない深刻な問題でした。トップレイヤー(テンプレートコード)を変更することは、結果にはあまり心配することなく、すばやく行うことができました。

Rtml was a very Lispy proposition. It was mostly Lisp macros, to start with. The online editor was, behind the scenes, manipulating s-expressions. And when people ran templates, they got compiled into Lisp functions by calling compile at runtime.

Rtmlは非常にLispyの命題でした。 それは主にLispのマクロであった。 オンラインエディタは、舞台裏でs式を操作していました。 テンプレートを実行すると、実行時にcompileを呼び出すことでLisp関数にコンパイルされました。

Rtml even depended heavily on keyword parameters, which up to that time I had always considered one of the more dubious features of Common Lisp. Because of the way Web-based software gets released, you have to design the software so that it’s easy to change. And Rtml itself had to be easy to change, just like any other part of the software. Most of the operators in Rtml were designed to take keyword parameters, and what a help that turned out to be. If I wanted to add another dimension to the behavior of one of the operators, I could just add a new keyword parameter, and everyone’s existing templates would continue to work. A few of the Rtml operators didn’t take keyword parameters, because I didn’t think I’d ever need to change them, and almost every one I ended up kicking myself about later. If I could go back and start over from scratch, one of the things I’d change would be that I’d make every Rtml operator take keyword parameters.

Rtmlはキーワードパラメータに大きく依存していました。私はこれまで、Common Lispのより怪しげな機能の1つと考えていました。 Webベースのソフトウェアがリリースされるため、変更するのが簡単になるようにソフトウェアを設計する必要があります。 そしてRtml自体は、ソフトウェアの他の部分と同様に、簡単に変更することができなければなりませんでした。 Rtmlの演算子のほとんどは、キーワードパラメータを取るように設計されており、何が助けになっているかが分かりました。 演算子の1つの振る舞いに別の次元を追加したい場合は、新しいキーワードパラメータを追加するだけで済みます。既存のテンプレートもすべて動作し続けます。 Rtml演算子のいくつかは、キーワードのパラメータを取っていませんでした。なぜなら、私はそれらを変更する必要はないと思っていたからです。 私が最初からやり直すことができれば、私が変えるべきことの1つは、すべてのRtmlオペレータにキーワードパラメータを取らせることです。

We had a couple embedded languages within the editor, in fact. Another one, which we didn’t expose directly to the users, was for describing images. Viaweb included an image generator, written in C, that could take a description of an image, create that image, and return its url. We used s-expressions to describe these images as well.

実際、エディタ内に組み込みの言語がいくつかありました。 私たちがユーザーに直接公開していなかったもう1つは、画像を記述することでした。 Viawebには、Cで書かれた画像ジェネレータが含まれており、画像の記述、その画像の作成、およびそのURLの返却が可能でした。 これらの画像も同様に記述するためにs式を使用しました。

Closures Simulate Subroutines

クロージャがサブルーチンをシミュレートする

One of the problems with using Web pages as a UI is the inherent statelessness of Web sessions. We got around this by using lexical closures to simulate subroutine-like behavior. If you understand about continuations, one way to explain what we did would be to say that we wrote our software in continuation-passing style.

WebページをUIとして使用する際の問題の1つは、Webセッションの本質的なステートレス性です。 これを回避するには、サブルーチンのような振る舞いをシミュレートするために字句解析を使用します。 継続について理解しているなら、私たちが何をしたのかを説明する一つの方法は、私たちが継続的に渡すスタイルでソフトウェアを書いたと言うことでしょう。

When most web-based software generates a link on a page, it tends to be thinking, if the user clicks on this link, I want to call this cgi script with these arguments. When our software generated a link, it could think, if the user clicks on this link, I want to run this piece of code. And the piece of code could an arbitrary piece of code, possibly (in fact, usually) containing free variables whose value came from the surrounding context.

ほとんどのWebベースのソフトウェアがページ上にリンクを生成するとき、ユーザーがこのリンクをクリックすると、これらの引数を使ってこのcgiスクリプトを呼び出すことが考えられます。 私たちのソフトウェアがリンクを生成したとき、ユーザーがこのリンクをクリックすると、このコードを実行したいと思うかもしれません。 そしてコード部分は、周囲の文脈から値が得られる自由変数を含む可能性がある(実際には、通常は)任意のコードである可能性があります。

The way we did this was to write a macro that took an initial argument expected to be a closure, followed by a body of code. The code would then get stored in a global hash table under a unique id, and whatever output was generated by the code in the body would appear within a link whose url contained that hash key. If that link was the next one clicked on, our software would find and call the corresponding bit of code, and the chain would continue. Effectively we were writing cgi scripts on the fly, except that they were closures that could refer to the surrounding context.

これをやったやり方は、最初の議論が閉鎖であると予想されるマクロを書くことでした。その後にコードが続きました。 コードは、一意のIDの下にグローバルハッシュテーブルに格納され、本体のコードによって生成された出力は、そのハッシュキーを含むURLを持つリンク内に表示されます。 そのリンクがクリックされた次のリンクだった場合、私たちのソフトウェアは対応するビットのコードを見つけて呼び出し、チェーンは続行されます。 効果的に、私たちはその場でcgiスクリプトを書いていましたが、それは周囲の文脈を参照できるクロージャーでした。

So far this sounds very theoretical, so let me give you an example of where this technique made an obvious difference. One of the things you often want to do in Web-based applications is edit an object with various types of properties. Many of the properties of an object can be represented as form fields or menus. If you’re editing an object representing a person, for example, you might get a field, for their name, a menu choice for their title, and so on.

これまでのところ、これは非常に理論的に聞こえるので、このテクニックが明白な違いを生む場所の例を挙げておきましょう。 Webベースのアプリケーションでしばしばやりたいことの1つは、さまざまな種類のプロパティを持つオブジェクトを編集することです。 オブジェクトの多くのプロパティは、フォームフィールドまたはメニューとして表現できます。 たとえば、人物を表すオブジェクトを編集している場合は、フィールド名、そのタイトルのメニュー選択肢などが得られます。

Now what happens when some object has a property that is a color? If you use ordinary cgi scripts, where everything has to happen on one form, with an Update button at the bottom, you are going to have a hard time. You could use a text field and make the user type an rgb number into it, but end-users don’t like that. Or you could have a menu of possible colors, but then you have to limit the possible colors, or otherwise even to offer just the standard Web colormap, you’d need 256 menu items with barely distinguishable names.

今、いくつかのオブジェクトが色であるプロパティを持っているとどうなりますか? 通常のcgiスクリプトを使用する場合は、一番下の「更新」ボタンを使用してすべてを1つのフォームで実行する必要があります。困難な場合があります。 テキストフィールドを使用して、ユーザがそれにrgb番号を入力させることができますが、エンドユーザはそれを気に入らないことができます。 または可能な色のメニューを持つことができますが、可能な色を制限する必要があります。そうでなければ、標準のWebカラーマップだけを提供する場合でも、ほとんど区別できる名前の256のメニュー項目が必要になります。

What we were able to do, in Viaweb, was display a color as a swatch representing the current value, followed by a button that said “Change.” If the user clicked on the Change button they’d go to a page with an imagemap of colors to choose among. And after they chose a color, they’d be back on the page where they were editing the object’s properties, with that color changed. This is what I mean about simulating subroutine-like behavior. The software could behave as if it were returning from having chosen a color. It wasn’t, of course; it was making a new cgi call that looked like going back up a stack. But by using closures, we could make it look to the user, and to ourselves, as if we were just doing a subroutine call. We could write the code to say, if the user clicks on this link, go to the color selection page, and then come back here. This was just one of the places were we took advantage of this possibility. It made our software visibly more sophisticated than that of our competitors.

Viawebでは、現在の値を表す見本として色を表示し、続いて「変更」と表示されたボタンが表示されました。ユーザーが変更ボタンをクリックした場合、それらの中から選択する色のイメージマップを持つページに移動します。彼らが色を選んだら、オブジェクトのプロパティを編集していたページに戻り、その色が変わります。これは私がサブルーチンのような振る舞いをシミュレートすることを意味しています。ソフトウェアは、色を選択して戻ってきたかのように振る舞います。もちろん、そうではありませんでした。それはスタックのように見える新しいcgiコールを作っていました。しかし、クロージャを使うことで、あたかもサブルーチンコールをしているかのように、ユーザーと自分自身に見えるようにすることができます。ユーザーがこのリンクをクリックすると、色選択ページに移動してから、ここに戻ってくるというコードを書くことができます。これは私たちがこの可能性を利用した場所の一つに過ぎませんでした。これにより、当社のソフトウェアは競合他社よりも洗練されたものになりました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment