Lispで再現してみようと思います。FlavorsはSymbolicsがFlavorsを改良したもので、sendでのメッセージパッシング構文から、総称関数ベースに変更になった所が目立った違いです。いっても、send構文もオブジェクトをfuncallしていたので、ちょっとした発想の転換程度の変化にみえます。マルチメソッドではありません。Lisp)に実装されましたが、方言を跨ぐオブジェクトシステムというもの良く考えると面白いです。wrapper/whopperの違いさて、とりあえず、wrapper、whopperの解説ですが、wrapperはこれまでの記事で解説したように、メソッドの周囲を包むマクロ群です。Lispの:aroundと挙動は全く同じようです。バーガーキングのワッパーと何か関係があるのでしょうか。それはさておき、マニュアルでは、マクロのwhopperは再コンパイルが必要だったりして扱いが若干面倒なので極力関数のwhopperを使おうとあります。wrapperもwhopperも同一の機能ですが、混ぜて使った場合の説明もあり、その場合はwrapperが最外周を取るようです。wrapperは、マクロなのでほんのちょっと速くできるとありますが、whopperにもインライン展開の構文もあったりするので本当にそうだったのかは謎です。Lispはマルチメソッドなので、シングルメソッドのFlavorsとは若干引数のインターフェイスを変える必要がありますが、大体こんな感じにしました。,@body)))defwrapperwrapperの方は、ボディにマクロ展開を記述するのですが、展開関数をメソッドとは別に管理すると面倒なので、式を展開するメソッドを:wrapperメソッドとして記録することにしてみました。メソッドコンビネーションの展開時に、:wrapper修飾子のメソッドを集めて、残りのフォームを引数に展開していく方針です。,@body)))))メソッドコンビネーション定義wrapperは最外周なのとマクロ展開させるので若干特殊な動きをしますが、standardメソッドコンビネーションの:aroundを:whopperに置き換えたものをwrapperで包んでいく感じで大丈夫でしょう。"42"次にwrapperを定義。stringはプライマリがありませんが、wrapperは動きます。42次に、whopperを定義してみます。22メソッドコンビネーションの展開はこんな感じです。wrapperはcall-methodの連鎖にならずにベタ書きになっているのがわかります。Lispの:aroundへ統合されたらしいことがわかります。Flavors時代に固まったようですが、どうもwrapperの仕組みが念頭にあった設計に思えてしまいます。Lispでは、MOPが規格外になってしまったので、MOP前提ではないdefine-method-combinationのインターフェイスも生き残ったという所なのかもしれません。