#:g1

Lisp本積読解消: Common Lisp & Artificial Intelligence | Chap. 5 Macros

Posted 2017-02-11 18:25:51 GMT

Lisp本を沢山積読してしまっている。折角なのでこの状況のメリットを考えてみたが、一つのトピックについて色々な本を串刺しに読むというのは積読ならではではないかなと思ったので、とりあえずマクロについて串刺しに読んでみようと思う。

この本について

Common Lisp & Artificial Intelligence / Patrick R. Harrison著は、2009年にAmazonで1円で購入。
Common Lispと人工知能というタイトルの本は沢山あるが、その中の一冊という感じ。
240頁程の内容のうち、Common Lispについては150頁程割いている。

Chap. 5 Macros

この本では、マクロの利用形態を5つに大別して解説しており、

  1. ばらつきと詳細を隠蔽し抽象化するため
  2. 文法を単純化するため
  3. 大域的な副作用フォームを作成するため
  4. 引数をクォートするため
  5. 効率的にコンパイルするため

の五つを軸に据え、それぞれに具体的な例を挙げて解説が進む。

解説する例題で、MACLISPで良く使われていたユーティリティをCommon Lispで再現する例が多いので、著者はMACLISPに親しんだ人なのかもしれない。

上記のうち、大域的な副作用フォームを作成する、というのは大域的というより、定義するフォームの外側に影響を及ぼす、という意味らしい。

マクロの解説の後、リーダーマクロの解説となるが、ここでもMACLISPのリード時マクロ展開#%を再現するような例を用いて解説している。

章の最後には問題が九つ程あるので解いてみたが、中々面白い問題かなと思った。

気になった所

マクロを作る際に問題になる変数のキャプチャ問題をFUNARG問題として解説しているところがちょっと気になった。
確かにFUNARGの変種と考えられるようなそうでもないような。
とはいえ、マクロは関数引数になるわけでもないしFUNARGとは無縁のような。

また、コード例の中のassertの構文が間違っている。


HTML generated by 3bmd in LispWorks 7.0.0

Lispのぶら下がり括弧嫌ですね

Posted 2017-02-11 15:30:17 GMT

Lispのぶら下がり括弧嫌ですね。
コッカをぶら下げてしまう人は、何故ぶら下げてしまうのか。

恐らく、括弧の対応が取れないので、行で対応を取っているのでしょう。
Lisp用のエディタを使っていないからだと思いますが、そこで行で対応を担保しつつ括弧も揃える方法を考案しました。

⏜
defun fib (n)
⏜
if (< n 2)
n
(+ (fib (1- n))
   (fib (- n 2)))
⏝
⏝

どうでしょうこれ。

ふざけた感じではありますが、eval-whenだと案外実用できるかも。

⏜
eval-when (:compile-toplevel :load-toplevel :execute)

(defun foo (x) x)

(defun bar (x) x)

(defun baz (x) x)

設定方法(Common Lisp)

(set-macro-character #\⏜
                     (lambda (srm chr)
                       (declare (ignore chr))
                       (read-delimited-list #\⏝
                                            srm
                                            T)))

(set-syntax-from-char #\⏝ #\))


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: LISP 原書第3版(I) | 12章 マクロ

Posted 2017-02-08 18:11:33 GMT

Lisp本積読解消今回はLISP 原書第3版(I)
12章 マクロ を読むことにする

最初にマクロの引数の評価について説明があり、その後にバッククォートを使い、テンプレートを埋める方式で式を組み立てる方法を解説する。

それ程込み入った解説はないが、問題が実践的で面白いのでこの章の問題が解ければ実際に作成するマクロの九割以上はすんなり書けることと思う。

また、13章の構造体の解説にもあったが、マクロもまとめて別ファイルに分けようとのこと。
理由としては、マクロは先に読み込ませたいことが殆どだからとのことだが、マクロ展開に利用する補助関数をどう扱うかについては言及がない。

Lisp Style and Designにはファイル分けについて、評価順でファイル分けをし過ぎると、意味単位のモジュール分割が阻害され、意図が良く分からないものになりがちという指摘があるが、何事も程々が良いだろう。


HTML generated by 3bmd in LispWorks 7.0.0

Lispは関数形言語

Posted 2017-02-07 06:18:52 GMT

JIS X 0007:2001の07.01.20によると、Lispは関数形言語。
「形」に注目。

07.01.20 関数形言語(functional language)

関数呼出しだけを使用して計算機システムを稼働させる
ことによって,達成されるものを記述する手段を提供す
るプログラム言語。

例 FORTH, LISP, ML, Miranda, PostScript

JIS X 0007:2001 の元になったのは、ISO/IEC 2382-7:2000らしいが、ISO/IECでも同様。

functional language:
    A programming language that provides the means to state what is to be achieved by the actions of a data processing system exclusively through the use of function calls. For example, FORTH, LISP, ML, Miranda, Postscript. Synonymous with functional programming language. Contrast with imperative language.

ちなみに、Lisp関係でで良く使われている用語の“binding”は、“束縛”ではなく“結合”らしい。 結合なら、「変数が値に結合される」でも、「変数を値に結合する」でもどっちでも良さそう。


HTML generated by 3bmd in LispWorks 7.0.0

Lucid CLとMCLのメーリングリストを発掘

Posted 2017-02-06 23:09:59 GMT

Saildartを探索していたら、偶然Lucid CLのメーリングリストの記録を発見。
Lucid CLのユーザーグループって存在しなかったのかなあと不思議に思っていたので、やっぱりあったかという思いつつも、見付かったとはいえ、いまいちぱっとしない内容だった。とはいえ貴重。

Lucid CLは主にOEM提供されていて、一番メジャーなものでは、Sunのアーキテクチャで稼動する Sun Common Lisp がある。
他にも、IBM・HP・Appolo・DEC等々でも採用されているが、自社でCommon Lisp処理系を作っていたものの後にLucidのOEM版に切り替えてしまったメーカーも多い。
Lucid CLのコミュニティの目立った資料が残っていないのは、Allegro CLやLispWorksのようにマシンアーキテクチャを跨いでまとまったコミュニティというものが形成され難かったからかもしれない。

MCLのメーリングリストの方は、MCL 3.0のおまけの付属資料をmhonarcにかけたもの。

立ち上げ最初は、Macintosh Allegro Common Lisp という名称だったためか、maclという名称になっている。
ベンダーがApple→Digitoolと変遷している様子も伺える。

おまけに、ml.cddddr.org のトップページを少し整理してみた。

個人的におすすめなレトロメーリングリストは、LISP-FORUM at MIT-MCだ。
MACLISP系で採用されている、#||#コメントが誕生する過程を覗き見ることができるなど色々と興味深いものが多い。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: プログラミング言語Lisp 入門からマルチメディアまで | 9章 マクロ

Posted 2017-02-05 15:55:58 GMT

Lisp本積読解消は、今回もプログラミング言語Lisp 入門からマルチメディアまで
9章 マクロ を読むことにする

9章 マクロ

マクロも特殊形式スペシャルフォームと言うこともある等々、なんとなく言葉の定義がふわふわした印象が多い章。
Lisp族一般の用語として、引数の評価が通常の関数とは異なるという意味での特殊形式スペシャルフォームということでは、そうなのかもしれないが、Common Lispでは、Special Form/Operatorはマクロとは一応分離されているのできっちり分けておいても良いような。

ちなみにCommon Lispでは、特殊形式スペシャルフォームはマクロで実装されていても良いし、マクロは特殊形式スペシャルフォームであっても良い(この場合、内部的に利用していなくてもマクロ展開すれば展開形が出てくる必要がある)

マクロの次にリーダーマクロの説明がある。割合に丁寧な説明で、先のマクロと同じ位の分量がある。

次に、局所ローカルマクロの解説。何故かmacroletでは再帰的な定義ができない、という説明がある。
MCLではそうだったのかなと思い古めのMCL 3.0で再帰的なマクロを定義して実際の動作を確認してみたが、問題なく定義できる。筆者の勘違いだろうか……。

その次に、defsetfの説明がある。所謂、短形式の方のみの説明。

結び

用語の定義がふわふわしていたり、局所ローカルマクロの説明が間違っていたりするので、この章に関しては、あまりお勧めできないかも。
Common Lispマクロ解説の本は充実しているので、マクロに関しては他の本を参考にするのが良さそう。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: プログラミング言語Lisp 入門からマルチメディアまで | 6章 再帰関数

Posted 2017-02-01 17:15:00 GMT

Lisp本積読解消は、今回もプログラミング言語Lisp 入門からマルチメディアまで
6章 再帰関数 を読むことにする

6章 再帰関数

数学の帰納法をプログラムで表現することから始まって、フィボナッチ数の計算やテーラー展開等の話題に進み、再帰的なデータ構造としてのリスト処理の解説がある。
また、再帰関数にtraceを仕掛け、動作を観察し、繰り返しと比べて計算効率がどうなっているかを確認する。

本書はプログラミング自体の入門者でも読めるように書かれているので非常に丁寧に書かれていると思った。


HTML generated by 3bmd in LispWorks 7.0.0

Lisp本積読解消: LISP 原書第3版(I) | 13章 構造体

Posted 2017-01-31 10:28:00 GMT

Lisp本積読解消今回はLISP 原書第3版(I)
13章 構造体 を読むことにする

LISP 原書第3版(I)

まず、この本の紹介をすると、Winston & Horn本として割合に有名な本。
原書は1989年に出版されている。
第1版と第3版が邦訳されていて、第1版の方は、Common LispでなくMacLISPなので注意。
第1版邦訳の文体は直訳的で独特。第1版程ではないが第3版も見出し語などには妙な癖がある。

第3版の方もANSI Common Lisp以前の出版だが、CLtL2相当の内容でオブジェクト指向システムの解説もされている。

13章 構造体

要点を押えつつ簡潔な内容になっていて、この章を読めば構造体についての一通りの知識は得られると思う。

この本にもSETFのFはフィールドのFと説明があったのは知らなかった。
実際にそうなのかは謎なのだが、SETFの大元であるMIT Lispマシン開発者のDavid Moon氏がそういうのだからそうなのかもしれない。
※レビュアーとしてMoon氏の名前もあるので、氏からの指摘があったのかもしれない。

私個人としては、MIT Lispマシンが参考にしたDeutsche氏のA LISP machine with very compact programsに、既にSETFQとして登場していて、フィールドと強い関係がありそうな説明はないので実際どうなのかなあと思っている。
寧ろ関数との関係性で説明されているのでFunctionのFである可能性も0ではなさそう。

閑話休題。この章に付属の例題もそこそこ要点を得ているし全体的に良い内容かなとは思った。
ただ翻訳の問題なのか設問の意味が良く分からない内容になっている気はする


HTML generated by 3bmd in LispWorks 7.0.0

真・LispWorks IDE起動時のツールを指定する

Posted 2017-01-29 03:42:44 GMT

以前、LispWorks IDE起動時のツールを指定する方法として、起動ツールが指定されている隠し変数を変更する、という方法を紹介した。

起動ツールの指定方法位マニュアルに書いていて欲しいものだと思ったが、実は正しい方法が他にあることをLispWorksユーザーのメーリングリストで知った。

その正しい方法だが、LispWorksでは、actionという概念があり、イメージの起動から終了までのイベントにフックを掛けるポイントがあり、ユーザーは任意にactionを追加したり上書きしたりできるらしい。

(lw:print-action-lists)で一覧を取得可能だが、IDEのツールの起動は、"Initialize LispWorks tools"の下の"Create default the tools"で設定されている模様。
標準では、lw-tools:editorと、lw-tools::lispworks-podiumが指定されているのだと思うが、これを上書きし、lw-editorのみとしてみる。

(lw:define-action
 "Initialize LispWorks tools"
 "Create default the tools"
 (lambda (screen)
   (capi:find-interface 'lw-tools:editor
                        :screen screen))
 :after "Configuration restored")

define-actionの長所は、定義したactionは明示的に呼び出さなくても良い所。定義をずらっと並べておくだけで良いのは楽。

落とし穴的な所は、初期化ファイルのように先頭から順に読んで行くわけではないので、ライブラリをロードした結果として使えるようになるシンボルを予め記述しておく訳にはいかない所。簡単にいうと、どうしても記述したいなら、uiop:symbol-callのようなものが必要になる訳である。

むすび

これまで、.lispworksはEmacsの初期化ファイルのように、ずらずら式を並べて書いていたが、Quicklispの初期化などもactionで記述したらすっきり見通しが良くなった。

(lw:define-action
 "When starting image"
 "Quicklisp Settings"
 (lambda ()
   #-quicklisp
   (let ((quicklisp-init "/l/quicklisp/setup.lisp"))
     (when (probe-file quicklisp-init)
       (load quicklisp-init)))
   (asdf/find-system:initialize-source-registry)))

やはり、マニュアルは全部読もう


HTML generated by 3bmd in LispWorks 7.0.0

Common LispのDOLISTを作るのは案外難しい

Posted 2017-01-29 03:02:31 GMT

先日記事に書いたMKCLのDOLISTのマクロ展開の問題だが、紆余曲折の後に改善された。

最初に問題を報告したのは、MKCLだったが、ECLにも同様の問題があるので、全く同じものを報告。
ECLの方も色々あったが、型宣言の問題は解消した。

DOLISTのマクロを組む上で難しい、というかややこしい点に、

  1. ボディ内では、タグが使える(GOできる)
  2. 結果節では、繰り返し変数がNILに束縛される

というのがある。

繰り返し変数に型宣言を付けることが可能だが、最後にNILになるとすると、安直に同じスコープ内に置くと宣言と競合してしまう。
また、ボディ内でGOを使うことは殆ど無いとはいえ、そういう仕様なのである。

(dolist (x '(1 2 3 4))
  (when (oddp x) (go next))
  (print x)
  next)
⊳ 2 
⊳ 4 
→ nil

さらに細かい所では、結果節に型宣言を置いたら機能してしまうようなマクロ展開結果になってもまずい。

歴史的にはDOLISTDOで組まれていて、DOも元々は、PROGで組まれていて、という風にタグが使える構文を下敷にしてきたため、暗黙的にタグが使える。
思えば、繰り返し構文のボディでタグが使えないのはLOOP位だ。

むすび

DOLISTDOTIMESは歴史的にはDOよりは抽象度の高い構文と考えられて来たと思うが、利用する機能としては単純である。
その為、ECLや、MKCLではブートストラップ付近で定義しているが、道具があまり揃っていないブートストラップ時なので結構大変そうだ。
ブートストラップ時はCL:DOLISTを単純にした構文とし、後の潤沢な環境でCL:DOLISTを定義するのが簡単そうだが……。
ちなみに、MKCLでは、MKCL:DOLIST!というのを定義して使っていたりはする模様。


HTML generated by 3bmd in LispWorks 7.0.0

Older entries (2074 remaining)