[Seasar-user:1326] Re: Mayaの式言語サポート(Re: Mayaドキュメント初稿第2版)

Masataka Kurihara kurihara
2004年 12月 7日 (火) 00:43:51 JST


栗原です。

> ということだったのですが、仮に#{ }ではなく${ }を使って
>   ${(this#)${type}.name}
> と書いた場合はエラーになるようになるのでしょうか。それとも一度「${」が見つ
> かった後は「{」「}」の入れ子を見るだけなので「#{」があろうが「${」があろう
> が同じ扱いで式言語エンジンには「(this#)${type}.name」が渡されるのでしょう
> か。

  一度目の「${」が見つかって後、「{」に対応する閉じ「}」をみていくように
したいと思います。ご要望とおり、式言語エンジンには「(this#)${type}.name」
を渡すように実装しますね。

> ・getName()が「NAME」という文字列を返す
> ・toString()が「#var」という文字列を返す
> ようなオブジェクトである場合、out.println(${type}.name)の評価結果は(1)
> の場合は
>   out.println(#evaluated_type.name) -> "NAME" を印字
> となりますが、(2)の場合は
>   out.println(#var.name) -> #varのnameプロパティの値を印字

  これはちょっと私のほうでは採否を問えませんが、前者のほうが直感的かなと
思います。後者はあらかじめ組み込みの変数を意識したJavaオブジェクトの作り
になる(toString()を、式言語のオブジェクト名を返すように実装するわけです
から)トリッキーかなと思います。式言語のための式言語になってしまうのでは
ないでしょうか?それなら、はじめからネストしないで、out.println(#var.name)
とだけ書けばよいように思います。もちろん、これは例であって、実際には有用
な場面があるのかもしれませんが。。。
  とにかく、ひとつご要望に近い形の仕様にできたかと思いますので、今後の実
装の進捗をご覧になっていただきつつ、また気がつく点ありましたらコメントく
ださい。


On Mon, 06 Dec 2004 11:33:49 +0900
Yokota Takehiko <[E-MAIL ADDRESS DELETED]> wrote:

> 横田です。
> 
> 返信が遅くなってすみません。このMLには会社からしか入っていないもので…。
> 
> On Wed, 01 Dec 2004 21:23:34 +0900
> Masataka Kurihara <[E-MAIL ADDRESS DELETED]> wrote:
> 
> >   ということは
> > 
> > > はい、この方式でも私の用途には十分です。重要なのは、「{」「}」の入れ子
> > > をきちんと認識する、という点ですので、そこだけMaya側でサポートしていた
> > > だければ大丈夫そうです。
> > 
> >   ですよね?了解しました。
> 
> よろしくお願いします。ちなみに今書いていて思ったのですが、栗原さんの元
> メールでは
> 
> > >   ジャストアイディアですが、私の提案する解決策は、式言語を、
> > > 
> > > ${(this#)#{type}.name}
> > > ${(this#)@{type}.name}
> > > ${(this#){type}.name}
> > > 
> > > という風に書くことです。「#{  }」じゃなく「@{  }」でも、単に「{  }」でも
> > > いいです。Mayaは${ }で囲まれているところを式言語としますので、
> > > 「{  }」のネストだけをきちんとみれば、切り出すELは
> > > 
> > > (this#)#{type}.name
> > > 
> > > となります。あとは、#{  } を式言語エンジンのほうで対応いただくことで
> > > できるかと思います。
> 
> ということだったのですが、仮に#{ }ではなく${ }を使って
>   ${(this#)${type}.name}
> と書いた場合はエラーになるようになるのでしょうか。それとも一度「${」が見つ
> かった後は「{」「}」の入れ子を見るだけなので「#{」があろうが「${」があろう
> が同じ扱いで式言語エンジンには「(this#)${type}.name」が渡されるのでしょう
> か。
> 
> > ${ out.println(${type}.name) }
> > 
> > というのがあったとして、
> > 
> > 1)typeを評価。値を取得して、evaluated_typeと名づけエンジンに設定
> > 2)式の${type}を#evaluated_typeと置き換える。OGNLでは頭に「#」がつくと
> >   変数です。
> > 3)out.println(#evaluated_type.name)を評価する。
> > こういう作業をループで行うものを作れば式言語をサポートしていなくても
> > 大丈夫。エンジンラッパー内部でダイナミックに変数追加できる仕組みを
> > 実装しておけばOK。
> 
> OGNLは詳細を知らないのですが、上記の機能があると便利なケースがあるかも
> しれませんね。ところで${type}の評価結果の利用方法としては栗原さんがおっ
> しゃるような(1)評価結果のオブジェクト自体を埋め込む方法、の他に、(2)評
> 価結果の文字列(文字列でない場合はtoString()する)を直接埋め込む方法、が
> 考えられます。
> 
> うまく言えませんが、例を挙げると、${type}の評価結果のオブジェクトが
> ・getName()が「NAME」という文字列を返す
> ・toString()が「#var」という文字列を返す
> ようなオブジェクトである場合、out.println(${type}.name)の評価結果は(1)
> の場合は
>   out.println(#evaluated_type.name) -> "NAME" を印字
> となりますが、(2)の場合は
>   out.println(#var.name) -> #varのnameプロパティの値を印字
> となります。自分が想定していたのは実は(2)の方なのです。ただし、このあた
> りの評価(このあたりの評価、というのは、式言語中に埋め込まれた「子」式
> 言語を解釈して、解釈結果から埋め込み元の「親」式言語を再構築し、再構築
> した式言語を解釈する処理を指します)を行なうのが式言語エンジン(のラッ
> パ)であれば、(1)(2)のどちらでもラッパを書きさえすれば対応可能になるの
> で問題ないと思います。
> 
> ちょっと話はそれましたが、結局のところ、
> 
> > 仕様
> > として出すところは、${  }の囲いを、「{」と「} 」の対応関係で切り出すこと
> > だけで、デフォルトのOGNLの実装でネスト構造をカバーしたのは伏せると
> > 思います。
> 
> ということで、${ }の囲いを{ }の対応関係で切り出すところ以外は式言語エンジ
> ン(のラッパ)側で対処するという形態でいけそうですね。ありがとうございます。
> 
> > > なるほど。ちょっと思ったのですが、なぜMayaではMayaが解釈する式言語
> > > の指定をJSP仕様と同じ${...}にしたのでしょうか。ぱっと考えた感じでは、
> > > JSFの#{...}のように、別の指定方式にした方が上記の「評価に関する問題」
> > > は避けやすいと感じたのですが、何か理由があるのでしょうか。(ひょっと
> > > してMaya仕様書に書いてあったかもしれませんが読み流してしまったかも。)
> (略)
> 
> この件に関して丁寧なご説明ありがとうございました。参考になりました。
> 
> --------
>   YOKOTA Takehiko
>     [E-MAIL ADDRESS DELETED]
> 
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> http://lists.sourceforge.jp/mailman/listinfo/seasar-user





Seasar-user メーリングリストの案内