Skip to content
oraccha edited this page Jan 14, 2013 · 1 revision

List Processor

Lots of Insane Stupid Parentheses と揶揄されることも:-)

MIT の JohnMcCarthy 教授らによって 1958 年に開発が始まったプログラミング言語.元々は FLPL(Fortran List Processing Language)という FORTRAN の拡張(サブルーチンパッケージ?)だったらしい.人工知能研究用途によく使われ,Lispマシンといった専用計算機も作られた.

リスト構造(S式)を基盤とした統一的な記述法と拡張性が特徴.setq のような代入文を持っているので純粋な関数型言語とは言えない.数多くの方言が存在する言語だが,CommonLispSchemeが有名(CommonLisp はANSIで標準化されている).

  • Tiki:Lisp

  • LinearLisp

  • EmacsLisp

  • [http://www-formal.stanford.edu/jmc/history/lisp/lisp.html History of LISP] . John McCarthy 教授による LISP の歴史.

  • [http://www.paulgraham.com/ Paul Graham氏のページ]

    • OnLisp
  • [http://www.apl.jhu.edu/~hall/lisp.html An Introduction and Tutorial for Common Lisp]

  • [http://www.haun.org/kent/lisp1/ Lisp一夜漬け] . Oh!X 誌の連載記事.

    • setq は関数ではなく,special form であり,第一引数を評価しない.if, cond, let, let*, progn, quote なども special form である.
    • 変数には型がなく,データに型がある.データ型はアトムとリストに大別できる.リストには純リスト(pure list)とそうでないものがある.純リストは '(a . (b . (c . (d . nil)))) のような nil で終端される線形リスト.nil はアトムでもリストでもある.
    • 関数定義は defun.
    • Lisp らしいプログラミングはリストに対する再帰呼出しを使う.
  • [http://lispuser.net/ LispUser.net]

  • [http://cathcart.sysc.pdx.edu/lispos/ LispOS]

  • [http://www-masu.ist.osaka-u.ac.jp/~kakugawa/hacks/clisp/ CAMPUS LIsP] . Lisp 処理系の実装の教育用.C 言語で 1,000 行程度で,GC あり.

  • [http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/impl/awk/0.html AWK Lisp] . awkで実装されたLisp処理系.

  • [http://tociyuki.cool.ne.jp/archive/index.html lisp10.rb − Rubyで書いたLISPインタープリタ] . ruby実装.

  • [http://www.okisoft.co.jp/esc/go.html やさしい Lisp の作り方 by Java and by C#] (沖ソフトウェア)

  • [http://itpro.nikkeibp.co.jp/article/COLUMN/20060922/248738/ やさしいLispインタプリタの作り方] (ITPRO)

  • [http://www.defmacro.org/ramblings/lisp-in-haskell.html Writing A Lisp Interpreter In Haskell]

  • [http://codezine.jp/a/article/aid/1492.aspx L2Lisp in Ruby] (Codezine 2007-07-23) . RubyによるモダンなLispの小さな実装

  • [http://jp.franz.com/base/seminar/2005-11-18/SeminarNov2005-Takeuchi.files/v3_document.htm どう転んでもLisp]


=== リスト操作 === Lisp の最初の実装は IBM 704 上で行なわれたが,car,cdr という関数名にその名残が残っている.

  • IBM 704 のワードは prefix,decrement,tag,address という四つのフィールドに分かれており,cons は1ワード確保し,head と tail へのポインタを address 部と decrement 部に詰め込むという実装になっていた.
    • ちなみに IBM 704 は 1word が 36bit で 15bit のアドレス空間を持っていた.そして decrement と address がそれぞれ 15bit,prefix と tag がそれぞれ 3bit になっていた.
    • 蛇足ついでに Fortran の最初の実装も IBM 704 上で開発された.IBM 704 では文字を 6bit BCD で表しており,36bit ワードに識別子を格納できるように,識別子長は 6 文字以内という制限があった.
  • それで car はレジスタのアドレス部(Contents of the Address part of Register)から命名された.同様に cdr はレジスタのデクリメント部(Contents of the Decrement part of Register)から.
  • このようにすることで car を cla 0, i のような機械語 1 命令で実装できた.

=== S式と Wiki ===

S式から HTML へ変換する感じのプログラムなら結構ありそうだけど,あまり見つからなかった.探し方が悪いのかな.

  • [http://www.graco.c.u-tokyo.ac.jp/~kamina/lisp/wserver.html JavaとLispのWebエンジン、どっちが強い?]

  • [http://www.cs.auc.dk/~normark/laml/ LAML]

  • [http://paulgraham.com/paulgraham/lwba.html Lisp for Web-Based Applications]

  • [http://pc.2ch.net/tech/kako/1016/10162/1016211619.html LISP Scheme Part4]スレの 803-6 あたり.


=== PDAとLisp === しばらくAgendaのコンソール上で遊んだけど,括弧が入力しずらいというかEmacs並みの支援がほしい気がする.Lispマシンの開発環境ってどんなだったんだろう?

  • 大昔のLisp処理系には「構造エディタ」なるものが付いていたらしいです。
    話にしか聞いたことないけど。Xyzzy の ML で以前ちょろっと話がでました。

  • よく思い返してみると Lisp 処理系に構造エディタがついていたとはだれも言っていなかったかも。 不確かでごめんなさい。

  • [http://www.lispme.de/lispme/ LispMe] . Palm用の実装.

    • このサイトにある ParenthesesHack が入力を支援する。[http://www.lispme.de/lispme/doc/lm_parh.htm 説明]
      • Hack(常駐してSystemにHookをかけるソフト)で、複数行文字列入力欄すべてにHookする(らしい)。
      • 閉じ括弧を入力した瞬間、開き括弧をピカっと(?)見せるらしい。viのshowmatchみたいなものか?
      • どっちかの括弧をselectした状態で0かoを入力すると対応括弧をピカっとするらしい。
      • どっちかの括弧をselectした状態で5かsを入力すると括弧内をselect状態にするらしい。
      • コメントや文字列の中では反応しない。

PDAならいっそのこと、Lisp支援のキー(ボタン)をつけちゃえ。括弧ペアを入力するキーとか、括弧対応を辿るキーとか。

  • Lisp「専用」マシンと化す…
  • SONYのクルクルピッピなら、クルクルで括弧対応を手繰り、ピッピでペアを挿入、とか?
  • ん〜,手のひらLispマシンっていいですね.Symbolics のマシンはでっかいキーボードで有名だったみたいだけど,ParenthesesHack とかジョグダイヤルを使ったりして,どこまで快適な Lisp モバイル生活ができるかな.
  • CanonCat の LEAP キーみたいだ.

=== Lispに関連する話題 ===

  • 電脳騒乱節によるとカシオがLisp電卓ってのを作っていたらしい. . S式が入力できたらしく,実際に販売されたらしい.見たことあります?

    • 昭和末期に発売された [http://www2b.biglobe.ne.jp/~houmei/restore/ai1000/ CASIO AI-1000] らしい.オプションで Prolog も使えたとか.
  • [http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html 普通のやつらの上を行け] . Shiro Kawaiさんの翻訳.

    • は読みましたぁ。この説による”最も強力な”言語ってのは、 対照性というか対称性というか直交性の高い言語であり、 かつ自己記述性が有る言語だ、ということのようですが、 ならば ばぶばぶ でも行けるわけですね。最強言語だったのか(ぉ。 . ただしLispと違ってカッコすら無いので、人間にとっても機械にとっても、 ソフトの"構造"を把握するのはずっと困難(というか文脈にしか依存しない) だろうな…。(構造を)把握できないということは(構造を)再利用もできない ということであって(T_T)。

    • TikiGuion:普通の奴らの上を行け

    • HashedWiki:クロージャとオブジェクト

    • 関連して,[http://www.akademia.co.jp/Smalltalk/SML/archives/SRA.archives/1998-March/002168.html LispのマクロとSmalltalkのブロックプロシージャ] (SML)

      • Lispは雑草で,Smalltalkは徒花ですか.
  • [http://slashdot.jp/article.pl?sid=02/09/02/0238241&mode=nested Emacs Lispあれこれ] (SlashdotJapan 2002-09-02)

    • [http://www.mew.org/~kazu/doc/elisp/ Emacs Lisp あれこれ] . 山本和彦氏による文書.リスト遊びって書籍もあるね.
    • EmacsLisp は動的スコープで,CommonLisp,Scheme はレキシカルスコープ.
      • なんで EmacsLisp を動的スコープにしたかは [http://www.paulgraham.com/thist.html History of T] によると,動的スコープの方が効率的だからって,当時(1982?) RMS 氏は答えていたらしい./.J によると動作環境をあらわす大域変数を多用するためだとか.
      • 最近の Lisp 処理系でもレキシカルスコープを採用するものが多いみたい.
      • ちなみに次のプログラムを実行して,結果が0なら静的スコープ,1なら動的スコープ. {{{ (setq x 0) (defun bar () x) (defun foo () (let ((x 1)) (bar))) }}}
    • バッファローカル変数も EmacsLisp の独自拡張.
  • [http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/comparison.html Scheme、Common Lisp、Emacs Lispの比較]

    • 名前空間が値用と関数用でわかれているか?
    • 動的スコープと静的スコープ
    • lambdaとfunction
  • [http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Lisp%3A%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%AA%A4%E8%A7%A3 Lisp:よくある誤解]

  • [http://lispuser.net/memo/lisp/2006-03-30-23-58.html 最高にキモい Lisp コードを書いてみよう with 100 行リーダーマクロ] (LispUser.net 2006-03-30)

  • [http://cadr.g.hatena.ne.jp/g000001/20071220/1198182248 40年前の処理系 PDP-1 Lisp を試してみる] (わだばLisperになる 2007-12-20)

  • [http://cadr.g.hatena.ne.jp/g000001/20071222/1198273286 45年前の処理系 元祖LISP 1.5 を試してみる] (わだばLisperになる 2007-12-22)


Tak関数 (「初めての人のためのLISP」) {{{ (progn (defun f (x y z) (cond ((> x y) (f (f (1- x) y z) (f (1- y) z x) (f (1- z) x y) )) (t y) )) (f 12 6 0) }}}

Clone this wiki locally