Skip to content

Instantly share code, notes, and snippets.

@nfunato
Last active November 25, 2016 08:41
Show Gist options
  • Select an option

  • Save nfunato/1ae3ed29bc7023004401 to your computer and use it in GitHub Desktop.

Select an option

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.
ここたでだず理論䞊の話に聞こえるので、この技術が明癜な違いを生み出す䟋
を瀺そう。りェブベヌスのアプリケヌションの䞭で床々行いたいこずの぀に、
いろいろな皮類の属性を持ったオブゞェクトの線集がある。オブゞェクトの
属性の倚くはフォヌムのフィヌルドやメニュヌで衚される可胜性がある。䟋えば、
人を衚すオブゞェクトを線集するずきは、たずその人の名前に察応するフィヌ
ルドを取埗し、メニュヌから圹職を遞択しお、ずいう具合である。
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スクリプトを䜿うこずにするず、そこでは党おのこずを、
䟋えばペヌゞの䞋郚にある曎新ボタンを䜿っお、぀のフォヌムで起こす必芁が
あるので苊劎しそうである。
テキストフィヌルドを䜿っおナヌザヌに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で可胜にしおいたこずは、珟圚の倀を瀺す芋本ずしおの぀の色ず、匕き続いお
倉曎ずいうボタンを衚瀺するこずである。もし、ナヌザが倉曎ボタンをクリックするず、
色を遞択するむメヌゞマップを備えたペヌゞに移動する。ナヌザが色を䞀぀遞択するず
元のオブゞェクトの属性を線集しおいたペヌゞに戻るが、そこでは芋本の色が倉曎されおいる。
これが私がサブルヌチンのような振舞いず蚀っおいるこずである。
この゜フトりェアでは、たるで遞んだ色が返されたかのように振る舞うこずができた。
もちろん、実際にはそうではない。新しい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