#:g1: Flavorsのメソッドコンビネーションを眺めたり再現してみよう: その二

Posted 2018-12-11 14:47:02 GMT

Lisp メソッドコンビネーション Advent Calendar 2018 11日目 》

前回に引き続き、メソッドコンビネーション元祖のFlavorsに標準装備されていたメソッドコンビネーションを眺めたり再現してみたりしようと思います。

前回いきなりcaseメソッドコンビネーションの再現に取り組んでみましたが、改めて、どんなメソッドコンビネーションがあるのか一覧にしてみたくなりました(ネタ切れだから)

調べてみたのは、後期Flavors〜New Flavorsあたりのメソッドコンビネーションです。

前知識

Flavorsのメソッドコンビネーションの標準構成は、Common Lisp版から:aroundを外したようなものです。
:aroundの部分は、defwrapperというメソッドを囲むマクロを定義する感じになります。

また、キーワードシンボルになっていますが、Lisp Machine Lispでは、userパッケージのシンボルの略記になります。
つまり、(eq :progn 'progn)です。
共用シンボルはuserパッケージに置かないで、keywordパッケージに纏めよう、と整理したのがCommon Lispです。

さて、では眺めてみましょう。

:daemon

Common Lispのstandardメソッドコンビネーションから:aroundを外したようなもの。
これを:darmonと呼びます。

:before / :after

Common Lispと同じです、:daemonメソッドコンビネーションの部品を単体で呼び出しているとも考えられます。

:and / :or / :progn

Common Lispから:aroundを外したようなもの。

:append / :nconc / :list

Common Lispから:aroundを外したようなもの。

:inverse-list

listが逆順になって返ってきます。
わざわざ用意しているからには使い道があるのでしょう……。

:max / :min / :sum

Common Lispと同じですが、:sumは、Common Lispでは+になっていますね。

:case

前回紹介した不思議メソッドコンビネーションです。

:daemon-with-and

:andの前後を:before:afterで囲んだものです。
Common Lispではand:daemonは付きません。

:daemon-with-or

:orの前後を:before:afterで囲んだものです。

:daemon-with-override / :override

:overrideで定義したメソッドが:daemonメソッドコンビネーションの前に配置されていて、それがorで結合しています。
つまり、:overridenilを返した場合だけ、:daemonに進むという変ったものです。

:two-pass

プライマリ全部起動の後に:after全部を起動するものらしいです。
make-instanceで良く使うらしいですが、インスタンス初期値の設定とかでしょうか。

:pass-on

メソッドの返り値を次のメソッドに次々と渡していくメソッドコンビネーションのようです。
先日フィルターを作ろうとしていましたが、pass-onならできそうです。 しかし、返り値は何故か多値で返す様子。。
(a b c)という引数を持つメソッドを連鎖させるには、(values a b c)で値を渡さないといけないようですが、何故なのか。

ネタ切れなので、次回からCommon Lispで、Flavorsのメソッドコンビネーションを、`Symbolics Open Genera上のFlavorsの挙動を確認しつつ再現していきます。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus