2010-06-20 オブジェクト指向入門
だいぶ前に、id:koichikさんから「バートランドメイヤーのオブジェクト指向入門も読まずにブログ書いてるのか!」と怒られて、慌てて読んだことがある。
怒られきっかけで読んだけど、確かに名著だと思った。もち歩くと筋トレにもなるし。
今僕の後輩がやっぱり「オブジェクト指向入門も読まずに」ブログを書いている。
そこで、過去の自分を都合よく忘れて、後輩にどかんと雷を落とし、さんざん偉そうに説教たれたあとで、よししょうがない一緒に読書会でもやるかということになった。
今日1〜3章(約80ページ)までやってみたが、4時間もかかった。いや、新人レベルの人たち相手に4時間は逆に飛ばしすぎたかもしれない。マクドで空気読まずに読書会やったが、となりの関係のない人が僕らの勢いにおののきコーヒーをこぼした(というか、単にきもい集団への恐れ、あるいは威嚇かも)。
まぁ、オブジェクト指向入門の1,2章は単なる前ふりなので、やっぱり3章までやる必要あるしなぁ。
読書会の大半は、読書会メンバーの理解の怪しいところ、本の記述の微妙なところをつっこみ、解説をしていたのだが、なかには興味深い会話もあった。
「3章読んでも、ふーんって感じなんですよね。モジュール性を良くしましょう、ああそうですね、って感じで」
僕「どういうことや?」
メンバー「例えば、情報隠蔽とかってJavaで言えばprivateでしょ?それをなんかこんな偉そうに・・・」
僕「どあほー!!」
と、ここでその理解の浅さに雷を落とした。
しかし、面白いなと感じたのは、メンバーがいう感想も分からなくはないということだ。
まず、オブジェクト指向入門の本の記述はもってまわっている感があり、初めて読んだ人には真意は伝わりにくいとは感じる。しかし、メンバーの場合、そういうのがポイントじゃない。つまりは、受けて側に理解できるだけの素養がないのだ。あるいは読み込みが足りない。こういう場合はどうなるのだろう?この言語ではどう実現されているのだろう?自分で言語をデザインするとなったら、この原則はどうするだろう?とかそういう自分なりの意見まで掘り下げられていない。
新人レベルなので、しょうがないのだが、雷発言であることもまた、しょうがない。
そういう人のために読書会をやっているのだから、ある意味非常に真っ当な会話やったと思う。本の内容と彼らの理解の間の橋渡しができるのは、読書会ならではの良さだ。そういう刺激を与えてくれるこの本はまた、すばらしいと思う。
名著とは、みんなで読んで議論する本をいうのかもしれない。
さて、次回も3章ずつやることにしたが、どうなることか。
2010-03-27 阪大油そばを再現したい
■[その他]阪大油そばを再現したい
僕は食べたことないけど、阪大の食堂にある油そば定食がめっちゃ美味しいらしい。
いや、正しくは、美味しかったそうだ。
どういういきさつかはよく知らんけど、メニューから外されてしまっている。
この油そば、結構人気があったようで、友人の何人かがしきりに
「久しぶりにカンシタの油そば、食べたいわー」
を連呼する。ちなみにカンシタとは、阪大の図書館下にある食堂の名前。
で、もう無いらしいでっというと
「えー、ほんまに!?ショックやわー」
を、これまた連呼する。
ネットで検索しても、無くなったのを惜しむ声がちらほら見つかる。
うーむ、そんなに旨いのか。
というか、そもそも油そばという食い物自体そんなに食ったこと無いから、よくわからん。
「どんなんなん?」
「太めの麺に、ラー油かなんかを混ぜとるだけなんやけど。めっっっちゃ旨いねん!!」
友人等の話を聞いてると、めっさ食べたくなってきた。
カンシタで食べるのが無理やったら、自分で作ってでも食べたい!
っというわけで、カンシタで働いてるおばちゃんに聞いてみた。
「すいません。油そば無いんですか?」
「ああ、昔あったやつでしょ?今はもうないのよねー」
「レシピとか分かりませんかね」
「ちょっと待ってくださいね」
すると奥から正社員っぽい人が現れて色々教えてくれた。
整理すると
・数年前に油そばはメニューから外れた
・業者から、麺とタレを卸してもらっていたので、食堂ではレシピは分からない
・また、数年前に発注システムを入れ替えたため、業者の名前がすぐには分からない
・昔からいた責任者がその時(僕が聞いた時)は不在やったため、やっぱりすぐには分からない
そこで、カンシタ食堂の方々にご無理をいって
その昔の方が業者の名前や、商品名などを知っていれば、教えてくださいとお願いしてしまった。
ありがたいことに快諾してくれて、今は連絡待ち。いやーカンシタ食堂の人、親切やわぁ
てか、その対応してくれた人も、「私も食べたくなりました!」ってw
というわけで、カンシタ食堂から連絡待ちですが
結局分からなかった場合、自力で探してみようかな。
阪大に油そばを卸してる業者なんてそんなに多くないよね。たぶん・・・
てかまぁ、再現できても、当時の油そば食べてないので、よくわからんけどw
友人らいわく
「探偵ナイトスクープに出したほうがええんちゃう?」
まぁ、そうかもw
2010-01-18 ゼロから学ぶ電磁気学
■[phys]ゼロから学ぶ電磁気学
- 作者: 西野友年
- 出版社/メーカー: 講談社
- 発売日: 2007/04/11
- メディア: 単行本
- クリック: 27回
- この商品を含むブログ (2件) を見る
前に読んだ解析力学が僕にはあんまりだったので、あまり期待せずに読みましたが
いやいや、これは非常に面白かったです!!
西野先生の持ち前のギャグは控えめになっていますが、内容が良かったです。
電磁気の勉強ってともすれば、数式展開に追われてしまい本質が見えないことが多々あります。
かくいう僕もマックスウェル方程式の意味が分かったのは4年の院試勉強でした。
(つまり講義受けたときは理解できなかったということ・・・)
また、電磁気の教科書といえば砂川先生が最も良いのかもしれませんが、砂川先生のはぶっちゃけ言ってちょっと難しい。
もはや物理をドロップアウトした僕にはキツイ(いや、学生時代も大変やった・・・)
ところが、西野先生のは数式展開よりも、物理的解釈、物理的直感に重点を置いてかかれているため(と、感じる)
非常に読みやすいし、理解しやすかったです。西野先生、物理解釈を語らせると非常に上手く伝える人やなーと思います。
また、特に面白かったのは、電磁気を歴史順になぞることによって、各時代の装置(例えば、ボルタ電池だとか)が何故重要であったかを知ることができる点です。
各時代の装置を振り返ることによって、そこから、物理は「観測して、説明する学問」なのだということを実感させられます。
この感覚は、当たり前のようで、実は当たり前じゃない。
例えば、電磁気の研究は静電気から始まりましたが、これを研究しようとすれば静電気の量をどうにかしてコントロールできないといけない。
でないと、いい加減な実験結果ばかりになってしまい、実験結果をどのように解析してよいか分からないからです。
ちょっと考えてみても、それが難しい問題だということが分かるかと思います。
しかし、物理の先人たちはその問題を克服し、制御してきたのです!そしてそれが即ち装置の重要性でもあったわけです。すばらしい。
こんなちょっとした感動も、この本は伝えてくれます。
毎度のことながら、この本を読んですぐに電磁気をマスターしたとはいえないだろうし
テストの問題を解けるようにもならないかもしれません。
はやみ
「数式展開よりも、物理的解釈、物理的直感」、非常によくわかる。
高校の3年の夏まで、教科書を読んでもさっぱり頭に入らなかったのが、
「橋元淳一郎の物理橋元流解法の大原則」を読んでイメージが湧くと、
何が書かれているのか、多少わかるようになった。
西野先生、まだあの形式のまま日記を書かれてることに驚いた。
ぶれないね!
kikaineko
形式かわってないけど、ほんまに一行日記になってもうたのがちょっと残念。
前は、一行日記から本文へリンクがあったのになぁ
2010-01-03 自動生成、DSL、計算モデル(結論なし)
■[自動生成、DSL、計算モデル(結論なし)]
SIプロジェクトにいると自動生成ツールというものが、よくもてはやされる。
かく言う僕も多くのプロジェクトで自動生成ツールを使い・作ってきた。やれ、エクセルからJavaソースを生成だ!やれ、UMLからソースを生成だ!などなど。
正直なところ、自動生成ツールというのは、なんとも中途半端な存在やと思う(そもそも定義もあいまいだ。エクセルからソースは自動生成で、ソースからバイトコードはなんで自動生成とは言われないのか?)。
本当なら、自動生成なんてせずに、エクセルからJavaソースなんか吐かずに、エクセルを置けばシステムが動けばいいのだ。
例えばeclipseのコンパイラーがコンパイルの瞬間にエクセルをパースしにいき、バイトコード等に自動変換してくれるなら、すくなくとも開発中は『エクセルを置けば動く』を実現できる。ところが、実際にはそういうカスタマイズは難しいし、コンパイル時間がいかほどになるのか分からない。まぁ現段階では、将来そういうことができるかもしれないね、レベルの話。(でも、その将来は1年後かもしれないのだが)
とりあえず、まだまだ自動生成は残るだろう。
そこで思うのだが、自動生成とは何故必要になるんだろうか?
結局のところ、以下の点を克服したいからなんやろうと思う。つまり
「ドキュメントで定義されている情報量 << ソースコードに記述される情報量」
なんじゃなかろうか。
「ドキュメントで定義されている情報量」とは、つまりこれが要件定義書であり、仕様・設計書になるのだ。しかし、それをソースコードで表現したときには、かなりの情報量を付加しなくてはいけない。
ある部分、これはしょうがない。まず、要件定義書、仕様・設計書には暗黙知的な「明示化しなくても分かるよね」という情報が存在してしまう。例えばそれは、システムのドメイン知識であったり、いわゆる常識と呼ばれるようなものだったりだ。(この画面は生年月日を入れてもらいましょう。というとき、紀元前からの年代入力を許すようなことは『常識として』無い)
また、言語が要求する情報量も多い。例えば、Javaでは絶対にクラスを作らなくてはいけない。だから、これらをまとめると
ソースコードの情報量 = ドキュメントで定義されている情報量 + 暗黙知として潜む情報量 + 言語が要求する情報量
となる。この下2つをなんとかしたいというのが、自動生成の目的だ。
ただし、「暗黙知として潜む情報量」を扱う自動生成ツールはあまり多くは無い・・・と、思う。
多くのユーザに向けた自動生成ツールが成功しにくいのは、結局この2つの情報を上手く扱えないからだろう。
だから、いまだ多くのプロジェクトで、プロジェクト独自の自動生成ツールが作られるのだ。
ところで、自動生成とは別にDSLによってこれらを解決しようという流れもある。
DSLとはドメイン特化言語、ざっくり言えば「そのシステム専用の言語」ということだ。システム専用なんだから、言語が要求する情報量も非常に少なくできるし、暗黙知も扱いやすいだろう。(また、フレームワークで対処するというのも伝統的な手法として存在する)
最近では、DSLをお手軽に実現するために、言語内DSLなんてものが出てきている。言語を最初から定義するのは大変なので、rubyだとかを使って、文法っぽいものを定義してしまいましょうって話。これはそこそこ上手くいっていると思っている。(ただし、エクセルから、DSLへの変換ツールなんてものはやっぱり存在してしまうのだが・・・)
ただし、正直いって、良いDSLを作るというのは難しい。そもそもDSLとしてどのような機能を持つべきか、何を提供しないでおくべきかの判断が難しいからだ。
「抽象化をやりすぎると逆に可読性が悪くないか?」「この機能が使えないときはどうするべきか?」「この制限は厳しすぎるんじゃないか?」等など。
一番怖いのは、何か重要なことができなくなってしまうことだ。言語内DSLなら、この恐怖は多少低い。いざとなれば元言語の機能を使えば良い。ただし、その場合、統一性は消えるかもしれない。
では、DSLで完結するにはどうすればいいのか?それは残念ながら、いまだ解決していない問題だと思う。
汎用的な言語は、そのベースに計算モデルが存在する。それはチューリングマシンであったり、λ計算であったりだ。これらの計算モデルは今のところ、すべてのアルゴリズムを表現する能力があると信じられているので、この計算モデルに立つ上では、アルゴリズムとして表現できないものは、理論的には無い。
もちろん実際の言語は、純粋な計算モデルだけを表現した言語ではあまりにも原始的過ぎて大変だから、いろいろな機能が付加されている。例えば、足し算のできない言語はほとんど無いだろうが、チューリングマシンも、λ計算も足し算という操作を直接持つわけではない。
つまり、汎用言語は純粋な計算モデルより抽象度を上げることにより、便利になっている。が、それでも足りないのでDSLではさらに抽象度を上げて便利にしようとことだ。
しかし、どこまで抽象度をあげるべきか、よって立つ計算モデルが見いだされてはいない。
汎用言語はベースとなる計算モデルの能力を制限することはないが、DSLでは制限してしまうかもしれない。(例えば関数という概念が消えたりだとか)
もはや、これは数学ではないかもしれない。不可能な問題かもしれない。あるいは、そんなモデルが存在して、本当に役に立つのかも良く分からない。しかし、ちょっと興味あるところではある。新たな計算モデルが提示できれば、少なくとも学術的な興味として面白いかもしれない。(まぁ真面目には取り組まないけどw)
・・・って、あれ、自動生成の話のつもりが、DSLの計算モデルになっちゃった。
まぁいいや
2010-01-02 正月番組、特に、NHKおもしろい
世界一受けたい授業みてたら、ゴルビーでてくるし。ビートたけしの日本のやつも良かった。ちなみにその裏でやってた「日本と朝鮮半島」もそこそこ面白かった。
てか、NHKの「新春TV放談」めっさおもろい!千原ジュニアや鈴木おさむ等が、「テレビ」というものに対してガチンコに「放談」してたのが面白かった。たとえば「TVは最近、似たようなものが多くてつまらない」という視聴者の意見に対して、「昔から似たようなのばっかりですよ」とばっさり斬り「二番煎じでいいじゃないですか。完全に同じなんてありえないんだから」「そこから何か新しいものが生まれればいいと思う」というようなことを真面目に語っていて、ああ、この人たちの本音のトークなんやなぁというのが伝わってきた。まさに放談!!
さらに、他局の番組などを冷静に分析できるのも実にNHKらしくて良かった。
んで、そのままNHK見てたら「タイムスクープハンター」とかってのが始まった。再放送らしいけど、これも凄い!!!めっさおもろい!タイムワープした要潤が過去の庶民の暮らしなんかをスクープしていくという、つまりは歴史バラエティなんですが、いやーよくできてる。
これ、また始まらんかなぁ。DVD出てるようなんで、レンタルできんかったら買うかも。
NHKおもろいーー。
2009-11-05 JavaにUnlessを作ってみる
■[JastAddJ]JavaにUnlessを作ってみる
JastAddJのサンプルとして、Javaにunless文を追加してみましょう。
unless文とは、rubyなどであるif文の逆、つまり条件がfalseのときに実行される文ですね。
こんな感じです。
unless(false){ System.out.println("OK!"); }
これを実行して、OK!がでれば、unless文の成功です。
この拡張は非常に簡単なのでJastAddJの最初の理解としてはいいかと思います。
*注意:昨日書いたインストール方法で環境準備をした場合、jragファイル、astファイル、flexファイル、parserファイルは全て不要ですので、消してください。また、ASTパッケージなども再生成対象なので、消したほうがいいかもしれません)
ここでJastAddJの構成について見ておきましょう。
JastAddJは主に以下の部分からできています。(3、4は今、便宜上僕が勝手に呼んでいる呼称であって、正式にどういうのか知りません。。)
1.字句解析
2.構文解析
3.AST定義
1の字句解析と2の構文解析はJavaCCなどを使うこともできますが、JastAddJのお勧めはJFlexとbeaverらしいです。特に何がいいってのも僕には無いのでJFlexとbeaverを使うことにします。
3のAST定義というのは、ノードごとに継承関係を定義するためのものです。astファイルというものに定義します。
例えば、Unlessを追加するときに、Ifの拡張として定義したいので、「UnlessStmtはIfStmtの子クラスにしますよ」という定義をここでします。
4の属性定義は、どのノードにどのような属性・計算を追加するのかを定義します。
これにはjragファイルやjaddファイルといったものに定義します。
では、いよいよJavaにUnlessを追加してみましょう。
次のコードで「OK!」と出れば成功です!
package tests; public class Example { public static void main(String[] args) { unless(false){ System.out.println("OK!"); } } }
これをEclipse上で実行することも当然できませんし、そもそもunlessの部分に赤ぺけがでていると思います。
Unlessを追加するには、IfStmtを継承して、UnlessStmtを作ります。でも当然unlessに対応したバイトコードなどは無いので、コンパイル直前にunless文を通常のif文に変換したいと思います。
つまり、
unless( condition ){
...
}
これを
if( ! condition ){ ... }
という変換を行って、コンパイルすれば問題なく動くはずですね。
では、順番にやっていきます。まず字句定義を行いましょう。
Keyword.flexというファイルを作成して、そこに次のように書き込みます。
<YYINITIAL> {
"unless" { return sym(Terminals.UNLESS); }
}
次に構文を定義します。これもunless.parserというファイルを作って
以下のように書いてください。
Stmt statement =
unless_then_statement.u
{: return u; :}
;
UnlessStmt unless_then_statement =
UNLESS LPAREN expression.e RPAREN statement.s
{: return new UnlessStmt(e, s, new Opt()); :}
;
最初のStmt定義は、実は既に存在している(JastAddJが提供してくれている)Stmt定義に新たな定義を追加している部分です。
このような既存にマージする構文定義がないと読み込まれることがないので注意してください。
そして、その下のUnlessStmtが今回のメインになります。これは「Unlessキーワードの後に、(が来て、式があって、)が来る」
というようなことが定義されています。
そして、AST定義を行います。unless.astファイルを作成し、以下を書き込みます。
UnlessStmt : IfStmt;
これは、UnlessStmtっていうのは、IfStmtの子クラスですよーっと記述しているわけです。
このようにIfStmtを継承することによって、UnlessStmtは、IfStmtの機能を引き継げるので
煩わしい定義などが不要になるのです!!
そして、最後に属性を定義します。ここで属性として「unless(cond) ⇒ if(!cond)」への変換の計算を定義しましょう。
unless.jragというファイルを作成し、こう書いてください。
aspect Unless {
public void UnlessStmt.transformation() {
Expr co=getCondition();
LogNotExpr not=new LogNotExpr(co);
setCondition(not);
flushCache();
}
}
これはUnlessStmtにtransformation属性を定義しています。
ここの計算は「unless(cond) ⇒ if(!cond)」そのものを実行しています。
ここまでで準備は終了です。
では、いよいよunlessを理解するコンパイラを生成しましょう!!
build.xmlを実行してください。問題なく生成されれば成功です!!
そして、この生成されたコンパイラを使って、さきほどのExample.javaをコンパイルしてみましょう。
import AST.*; class JavaCompiler extends Frontend { public static void main(String args[]) { args=new String[]{"src/tests/Example.java"}; if(!compile(args)) System.exit(1); } public static boolean compile(String args[]) { return new JavaCompiler().process( args, new BytecodeParser(), new JavaParser() { public CompilationUnit parse(java.io.InputStream is, String fileName) throws java.io.IOException, beaver.Parser.Exception { return new parser.JavaParser().parse(is, fileName); } } ); } protected void processNoErrors(CompilationUnit unit) { unit.transformation(); unit.generateClassfile(); } protected void processErrors(java.util.Collection errors, CompilationUnit unit) { super.processErrors(errors, unit); } }
で、これを実行すればExample.classが生成されます!!!
この実行は残念ながらEclipseではできないので、コマンドプロンプトから実行します。
C:\***\src> java tests.Example
この結果「OK!」っと表示されれば成功です!!!
どうでしょうか。
Unlessを追加する程度なら、あっさりと追加できたのが伝わったでしょうか?
2009-11-04 JastAddJ初めの一歩
■[JastAddJ]インストール方法
インストールするためにまずはダウンロードしないといけないのですが
JasdAddJのサイト先ってちょっと分かりにくい。
JastAddというツールのサイトとJastAddJのサイトは異なっているので注意が必要です。
ちなみにここがどうやらメインサイトの模様。
http://jastadd.org/the-jastadd-extensible-java-compiler
で、ここからJastAddJをダウンロードするのですが、この場合2通りのやり方があります。
2. サンプルをダウンロードして不必要なものを消す方法
1は、ちょっとめんどいっす。自分でbuild.xmlを書くなら、これでもいいですが、僕は面倒なのでサンプルを落として不必要なものを消しています。
僕の場合、これを落としてみました。
http://jastadd.org/jastadd-tutorial-examples/non-null-types-for-java
これはヌルポの可能性を排除するためのJava拡張のサンプルですが、特に気にする必要はありませんw
とりあえずここからソースを落として、eclipseにインポートします。
するとNonNullCheckerディレクトリ(ソースディレクトリ)の中にbuild.xmlやjragファイルなどがいくつか入っています。このjragやastファイルがNonNullの拡張部分です。これらはとりあえず不要なのですが、ちょっと落としたソースが正しいかどうかを確認するために、動かしてみましょう。
JastAddJはつまるところコンパイラーコンパイラーなので、2段階の実行になります。最初の一歩が、まずJastAddJから(jragやastなどを利用して)コンパイラーのソースコードを自動生成することで、そして2歩目はその生成されたコンパイラーコードを動かして実際のコンパイル作業を行うというものです。
最初の一歩、コンパイラー生成のときに使うのがさっきついてきたbuild.xmlです。
さっそくこのbuild.xmlを実行してみてください!(注意:普通に動かしてもOutOfMemoryが発生します。Antの設定で-Xmx256Mを設定してください)
そうすると大量のソースが生成されるはずです。ASTパッケージなどが生成されます。
では、次にこのコンパイラーを動かしてみましょう。
ただし、testパッケージに赤ぺけが出ていると思いますが、これは無視してください。NonNullCheckerはJava拡張のため通常のJava構文とは異なるものが入っています。これがEclipseのコンパイラに引っかかっているわけです。今回は、Eclipseでコンパイルするわけではなく、JastAddJで生成したコンパイラでコンパイルするので無視してください。
defaultパッケージの中にあるRunTests.javaを動かしてみましょう。
すると、testパッケージ以下にあるものをコンパイルしにいきます。(わざとエラーがでるサンプルになっているので、コンパイル途中でエラーがでて終了するはずです)
2009-10-22 JastAddJ凄い
■[JastAddJ]JastAddJ凄い
研究でJastAddJというツールを使うことにしたんですが
このツール凄すぎる。
JastAddJは、簡単にいうとJava言語を拡張するためのツールで
AspectJ用コンパイラーの一つabc(AspectBench Compiler)もJastAddJで書かれてたりする(JastAddJで書き直されたんやっけ?)
AOPとかJava拡張の言語系研究分野では比較的有名なツール。
最近のAspectJ拡張系の研究ならほとんどJastAddJを使っているんじゃなかろうか。
なので存在は以前から知ってたんやけど、僕も研究で使うことにしたので(流行にのるというのはやはり大事w)
そしたら、凄い凄い。
久しぶりに感動した。
これは体感しないと分からないかもしれないけど、本当に凄い。
やっぱり以下の点が凄い部分やと思う
1. ASTに属性を付けることができて、直感的なAST操作が可能になる(属性文法?)
2. 本当に欲しい部分だけ定義すれば良い
1に関して
通常ASTは、ただのTreeなので、例えばIFの条件を操作したい場合
こんな感じになる。
Node node = getChild(0); if(node.getType().equals("Condition")){ System.out.println(node); }
ところが、JastAddJではASTに好きな属性を付与することができるので
IfStmt ifStmt= ..;
System.out.println(ifStmt.getCondition());
と、書ける。
これは、IfStmtノードにConditionという属性が付与されているという状態。
とてつもなく直感的!
2に関して
JastAddJは既にJava用のパーサなどを用意してくれているので、そこに「何を追加/変更するのか」っというような部分的な定義が可能になっている。すげー便利。
そもそもJastAddJ自体がJastAddというベースのツールを利用している。
どういうことかというと、
JastAddJは実は内部的には2つの部分に分けられていて、Java1.4用機能とJava5用機能とに分けられている。
で、Java5用機能はjava1.4用機能を拡張する形で(つまりJastAddJ形式で)実装されている。だからJava5用機能は非常にあっさりと作られているのだ。
2009-10-19 A join point for loops in AspectJ
(但し斜め読み)
A join point for loops in AspectJ
タイトルの通り、ループに対するjoin pointを提供しましょうという論文。
ループってのは、for、while。ちなみにbyte codeレベルのAOPです。
モチベーションとしては、
「ループ部分ってパフォーマンスで問題になりやすいけど、ループだけを並列化とかって難しいやんね。やから、ループをjoin pointにしたらAOPで並列できてハッピーやね!」
という話。
でも、単純にループというけど、ループを判別するのは難しくて、特にbeforeアドバイスは常に指定できるけど、afterアドバイスは常に指定できるわけじゃないという問題がある。
また、どのループを選択するのか?というのも問題で、これにはwithinとcflowとdflowを駆使して対応するよ!
っていう論文。
うーん、ちょっとモチベーションが弱い気がするなぁ。後、確かにループをジョインポイントにするのは難しいのは分かったけど、なんというか言語デザインとしてちょっと弱い気がする。とかいってみたりー。

>顔が目に浮かびます
あれ、お知り合いの方でしょうか?