LET OVER LAMBDA Edition1.0

  • エスアイビー・アクセス
3.50
  • (1)
  • (1)
  • (4)
  • (0)
  • (0)
本棚登録 : 109
感想 : 2
本ページはアフィリエイトプログラムによる収益を得ています
  • Amazon.co.jp ・本 (334ページ)
  • / ISBN・EAN: 9784434133633

作品紹介・あらすじ

Lispマクロの過激な世界へようこそ。Common Lispの基礎から最も高度な機能まで!真のLispハッカーのための秘密兵器。世界のトップ0.01%のプログラマになるために。

感想・レビュー・書評

並び替え
表示形式
表示件数
絞り込み
  • CommonLispのマクロについて述べた本。


    最近Lispがおもしろくて、あれこれ調べている。強力と言われるLispのマクロの概念を理解したくて、本書を手に取った。使いこなすためというよりは、イメージ、メリット・デメリットを知るためだ。



    結局、Lispのマクロとは、評価されない引数を取る関数のようなものだ。大概の言語は、メソッドや関数の呼び出しを行うと、まず引数が評価された後、呼び出し処理に制御が移る。Lispではfunctionという構文がそれにあたるが、それ以外にmacroという、引数を評価せずに引数を受け取る関数のようなものを定義できる。これがLispのマクロだ。


    「Lispのマクロは強力」とよく言われるのが、マクロがそれ単体で強力なのではない。関数としてのlambdaと、評価されない引数であるマクロとしてのlambdaを用いた、構文の二重性を利用したLispプログラムが強力だ。というのが正しい表現だ。

    マクロプログラムを見ると、呼び出しが関数なのかマクロなのかを、それだけでは読み取ることができない。同じ構文に、即時評価される呼び出しと即時評価されない呼び出しが混在して出現する。これが構文の二重性だ。

    Lispのマクロが強力なのは、この構文の二重性に加えて、レキシカルクロージャと変数束縛を用いた、プログラムを記述するプログラムを容易に記述できる点だ。処理系を記述するための処理系とか言われるのがそれだ。所謂DSLというやつだ。DSL自体をLispで記述するのがマクロの本領を発揮する使い方だ。

    本書の第1章にクロージャ指向プログラミングについて説明があるが、Lispはマクロと組み合わせつ使う場合、クロージャをあらゆるシーンで使う言語だ。マクロ自体が、クロージャ的な使い方を前提に設計されているように見える。クロージャは感覚的に言って環境を閉じ込める仕組みである。クラスと呼ばず、環境と呼んだ方が適切だと思うのは、なんでも閉じ込めることができるからだ。LispにもCLOSというオブジェクト指向を取り入れた仕組みがあり、Javaのようにオブジェクト指向チックに記述できるのだが、これ自体マクロを用いて記述する。

    本書は、クロージャ指向プログラミングを前提として、マクロの強力さを教えてくれる。



    ここからは、Lispについての俺の所感になる。


    Lispは方言が多く、Lispと一言で言っても逆に「どのLisp?」と聞き返さないといけないくらい大量の方言がある。標準化された言語仕様を持つCommonLispや、Schemeが有名だと思う。まぁ、CommonLispの言語仕様が標準化されているといっても、方言の数から分かるように、実用のためにはほとんど処理系依存になるのだがw

    LispはAIの分野で使われていたが、Paul Grahamによってプログラム言語として一般的に認知されるようになった。

    言語として有名にならないと俺が目にする機会を得られなかっただろうし、言語仕様が標準化されていなかったら「使ってみよう」とすら考えなかったwなので、この2点は重要。


    Wikipediaによれば、Lispは式指向の言語だ。式と文が区別されず、式の中に式を埋め込むことができる。関数型言語に分類されるが、Lispにとっては関数はひとつの型に過ぎない。

    本書で触れているクロージャ指向プログラミングについてだが、Schemeから取り入れられたレキシカルスコープとしてLispに組み込まれ、マクロとの組み合わせで非常に強力なものとして認知されている。


    言語としてみると、前置記法で括弧が多いためとっつきにくいし、方言が多すぎてひとつの言語を修めるという感覚では触れない。しかし、実際はなんでもできる最小の言語のような感じだ。

    Lispを書くのは言語を書くため、つまりメタプログラミングのためとか言われるのは、最小の言語であるため余計な機能がなく、それだけで何かを実現できるわけではなく、何かを実現するためのパーツをすべて自分で用意する必要があるためだろう。ライブラリを作るアプローチを選んだのがJavaだが、それとは異なり、特定の問題を解決できる内部言語を作るほうがてっとりばやいという発想が、メタプログラミングに最適と言われる所以だろう。

    Lispは逆に、なんでも内部言語で解決しようという発想になりやすい。AIの分野で使われてきたのは、AIは個体の機能を模倣するもので、個体の機能は内部にあるものだからだ。マクロで内部言語を定義し、自己増殖的に機能を実装するのに適している。なので、なんでも自分で作る方向に進むことになる。

    これは、頭の中に自分言語を持つプログラマや、独特の価値観を持ち、それを他人と共有できないタイプの人間に、受け入れられやすい。環境を自分で作成し、自分がプログラミングするための環境を自分で作る。非常にやりやすいだろう。

    一般的に仕事で使われるプログラムは、自分だけが読むことなどまずなく、他人が書いたコードを読むことのほうが多い。その意味で、Lispはあまりビジネスで成功しやすいとは言えない。Lispはそれ自体、基本的に閉じたコミュニティ内や個人の中で成長するような特性を持っていると言える。

    Lispとオブジェクト指向の親和性についても同様で、全く親和性がないと言ってしまってよい。オブジェクト指向は対象をオブジェクトに準え、カプセル化・継承・ポリモーフィズムで拡張性を確保するが、それ自体発散的なものであるのに対して、Lispは閉鎖的で、拡張性が閉じた環境に対して確保されている点で異なる。機能的にLispにできないことなどないだろうが、オブジェクト指向が他者との親和性で初めて機能を実現しようとしているのに対して、Lispは内部環境に対して機能を実現するため、親和性は皆無だ。

    もちろんビジネスとしてLispが成功するシーンはあるだろうが、それが広まることは考えにくい。


    Lispの利便性が昨今の言語と同等に充実したものが揃ったとして、それでもLispが受け入れられることはないだろう。ソフトウェアは書けばなんでもできる代物であるため、ビジネスの中では生産性を工数で表現される。普通の人間の生産性は多少努力して変わるものではなく、したがってビジネスで実現する機能をプログラムを書く以外の何かに任せることで工数を減らそうとする。その任せる基準が「それが何を保障してくれるか」という点で判断される。

    例えばJavaで言えば、VMがclassファイルに記述された処理の実行を保証してくれ、ApacheのライブラリはIO周りを、SpringDIライブラリはオブジェクト生成を、Nettyは通信を保障してくれるため、プログラムを書くためには保障してくれるものを組み合わせて目的の機能を実現することに集中でき、結果として生産性が上がっているように見える。

    このように、モジュールの再利用という発想が根本にあって、それを元にソフトウェアが量産される。対してLispは、モジュールを再利用するというよりは、箱の中に手を入れる感じで、パッチを当てる感覚になってしまい、再利用という感じにはならない。むしろ、目的の物を目的のためだけに新しく作ることがLispが得意とすることだ。


    俺自身はどちらかというと閉じこもる人間であるため、Lispはおもしろそうと感じるが、実際使えるかどうかとはまた話が別だ。まぁ、俺自身は他人に理解されたいと強くは思っていないように、Lisper自体、Lispが市民権を得てほしいと思っているかは甚だ疑問だがw



    「マクロを理解したい」と強く思って読んだので、いい成果が得られたなw

  • そろそろ HaskellもHskellらしいコードがかけ出したので、宣言通りマクロに再挑戦しまっす!

全2件中 1 - 2件を表示

ダグ・ホイトの作品

この本を読んでいる人は、こんな本も本棚に登録しています。

有効な左矢印 無効な左矢印
ケント・ベック
Peter Se...
まつもと ゆきひ...
有効な右矢印 無効な右矢印
  • 話題の本に出会えて、蔵書管理を手軽にできる!ブクログのアプリ AppStoreからダウンロード GooglePlayで手に入れよう
ツイートする
×