トップページtech
174コメント70KB

-generic- 総称的プログラミング -programming-

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
erasureなんてうんこ、とか。
0083デフォルトの名無しさんNGNG
そして、オブジェクトを関数言語の部分計算と見ることで、
関数言語の型システムで、オブジェクト指向の型システム(クラス)を説明できるようになり、
最終的には、オブジェクト指向言語の型システム(クラス)について、フォーマルな取り扱いがしやすくなるんでわ?
つうのが、漏れの信念です。

でも、こーゆーのって、米澤県とかMSRあたりのキラ星研究者がやってるテーマな気がする。。。
0084デフォルトの名無しさんNGNG
>>82
その「研究機関の研究テーマ」ってのは何だ?(w
0085デフォルトの名無しさんNGNG
オレオレ
0086デフォルトの名無しさんNGNG
>>85
おまえが研究機関か!
あれほど裏の空き地で野球を(ry
0087デフォルトの名無しさんNGNG
つか、素人向けに現在のトレンドを説明したつもりなんだけど、
なんで一々絡んでくるの?だから素人は嫌いだ。
0088デフォルトの名無しさんNGNG
ニヤニヤ
0089デフォルトの名無しさんNGNG
話の本筋ではなく、重箱の隅をつついて、
相手に丁寧な説明を要求しちまうような、
礼儀知らずで無作法な厨房って多いよな。
俺はそういう厨房が、大嫌いだ。

今も、大岡山近くの事務所(誰だよ番頭は?)から、
その手の厨房が俺の席前に出張ってきていて、
対応に困ってる。

こっちの言うこと全然聞かねぇで反論ばっかりだし(口癖は聞いて下さいよ〜)し、
メールで返事しろつっても、非難するような口調で一々口頭で質問してくるし、
忙しいから出来るか出来ねぇかまず答えろつっても、じくじく質問してきやがって、
挙句の果て、ここまで説明すりゃーどんな厨房でも出来るだろ、っつう説明をし終えると、
今度は「そんなことやっても意味がないです」ブチッ

てめぇの趣味聞いてんじゃねぇんだよ、仕事だからやれよ。
自分で方法も思いつかず、忙しい人様の時間を浪費して質問してくるなら、
さっさと実装しろよ。方法を人に聞いて、自分勝手に結論出して意味がねぇって、おまえ何様?
ふつ〜、そ〜ゆ〜無作法な奴って、卒業研究か博士課程でゴリゴリ削られて丸くなるもんなんだけど、
その程度の訓練もできてないヤシが、なんで大口叩くの?40も近くなって。お子様ですか?

と、ゆーような、アフォに心乱される日々を送る、2004年春の夜。

0090デフォルトの名無しさんNGNG
結論はCleanのGenericマンセー
ってこったな。
0091デフォルトの名無しさんNGNG
いまこのスレでなにが話されているか、
俺にもわかるように教えてください。
0092デフォルトの名無しさんNGNG
(・∀・) ニヤニヤ
0093デフォルトの名無しさんNGNG
>>89
君ももうちょっと大人になればいいのに。
0094デフォルトの名無しさんNGNG
プロマネ業務経験者の立場から言わせてもらうと、
・虚偽の報告をする奴
・分担作業者間のすり合わせをのらりくらり逃げる奴
・ぷろぱの指示聞けない外注さん
は、居なくていいか、と。
俺がこんなこと言わにゃならんとはな〜、世も末だなこりゃw
老婆心ながらアドバイスしとくと。
・報告やすり合わせの場で、あんま反論ばっかりすると、
 プロジェクトが荒れるから、もうちょっと反論の方法を考えた方が良いよ。
 口頭でつじつまの合わない逃げを打つと、ボロクソに叩かれるのが道理。
 それでも自分に理があると思うなら、冷静にメールで事実を伝えてはどうよ。
 CCで自分と相手の上司にもCC打つのは基本動作。
 ようするに、口頭でツマラン喧嘩する暇があったら、自分も相手も逃げ場のない方法で
 きちんとした誠実な議論をして呉れっつう事。それが、正しい問題解決の方法だよん。

0095デフォルトの名無しさんNGNG
・自分の指示系統の外のぷろぱに、全部責任押し付ける、
 不合理外注も(゚д゚)イラネ、ペッ
0096デフォルトの名無しさんNGNG
外注に、真実を報告する価値を認められない、
独善的終了済プロ真似の愚痴はこちらで http://life4.2ch.net/yume/
0097デフォルトの名無しさんNGNG
>>96
いみ、ふめいですぅ〜☆
0098デフォルトの名無しさんNGNG
で?
0099デフォルトの名無しさんNGNG
土曜日の晩 17:00にageたスレが、未だにスレ位置34か。

この板の過疎っぷりも、ひどいな。
ここ数年、気違いが荒らしまくってるのを放置した結果が、このザマか。
0100デフォルトの名無しさんNGNG
なんていうか、「関数型言語」に反応して荒らしてる奴が約2名いるな・・・
0101デフォルトの名無しさんNGNG
>>84を軽く流せない>>82もかなり低能な気が…
0102デフォルトの名無しさんNGNG
相手の話の本筋をまるっきり無視して、
興味本位に重箱の隅をつついた質問を繰り返す、
そんな厨房が、私は大嫌いだ。

呆れ返った相手が、同情心で莫迦っ丁寧な説明をしてくれるのを見て、
「そんな幼稚な事は判り切ってるよ、アフォ」とか、
「アフォを煽って、うまく情報を聞き出したぞ」とか
「知的でクールな駆け引きをして情報を入手した」とか
ゆーよーな態度を取る厨房が、死ぬほど嫌いだ。

おまえら、ヴァカでアフォで格下だから、そんな態度が許されるんだぞ。
おまえらが、おまえらより格下にそんな態度とったら、アフォ扱いされるんだぞ。
そんな態度とる奴は、
「私はヴァカなガキなんで、丁寧にものを尋ねるマナーすらありません」
って首から看板ぶら下げて歩いてるくらい、みっともないんだぞ。

ただし、ヴァカでアフォでガキなおまぃらは、ヴァカでアフォでガキだから、
そーゆー未熟な態度しかとれない事はわかってる。遠慮なく、ヴァカでアフォでガキな態度でもがく事を特別許す。
だけど、とってもウザいから、とにかく早く成長しろ。おながいします。
0103にゃーごNGNG
春だね。発情期だね。
0104デフォルトの名無しさんNGNG
>>102
どこを縦読み?
0105デフォルトの名無しさんNGNG
>>104
http://pc5.2ch.net/test/read.cgi/tech/1083734838/ ;の1だろ。
0106厨でーすNGNG
下寝りっくぷろぐらみんぐって、
単にみんなObject型(型継承木のルート)で扱うのと、なんが違うの?(型間違いのチェックを除いて)

「どうだ、これが下寝りっくぷろぐらみんぐだ」!見たいな
サンプルコードない?
0107デフォルトの名無しさんNGNG
そんなことしたら、Object型が闇鍋になってしまうじゃない。
手に入りやすいところでtype_traits辺り読んでみてね。
0108厨でーすNGNG
>>107
とんくすこ。それって、
http://www.boost.org/libs/type_traits/ の Example code のこと?
++読めないけど読んでみますた。
げねりっくって、コンテナ系に強いっていうか、
なんでも(?)コンテナベースで書くのが流儀なの?
コンテナを発想の中心に据えてコードを書くのかな?それって一般的に可能なの?
(Type Trait自体はリフレクションでいいかなとか思っちゃうけど(速度がメリットな訳じゃないよね?))
0109デフォルトの名無しさんNGNG
C++で最初に追求した人がcontainerでやったから
containerで一番発達しています。

traitsっていうくらいで、
型システムをうまく使った脱闇鍋ぶりをみてね。
0110デフォルトの名無しさんNGNG
とどのつまり、Generic Programmingのメリットとは、
型の気持ちよさが維持できる、ということですかい?

全部Objectで書いて気にならない剛の者、あるいは
静的型がない言語では別段うれしくはない?
0111デフォルトの名無しさんNGNG
意味不明なリファレンスの書き方をするのが、最近の流儀なの?

学がない人の知ったかぶりって、やーねぇ
0112デフォルトの名無しさんNGNG
type_traits:
 C++ STL方面(Boosts C++ Library ?)で
 Template引き数の型特性情報(voidとかpointerとか)
 をランタイム情報として持たせる
って話か。いかにもC++って感じだね。

>>30近辺で型パラメータ(仮引数)だtype class(実引数)だ、って言ってる話の派生ね。
で、>>107-108は一体何を言ってるの?
0113デフォルトの名無しさんNGNG
>>110
おれもあんまわかってないけど、それは違うと思われ。
http://www.mamezou.com/tec/Tips/jsgl/

Genericsってのは、*事実上*、汎用的なコンテナと汎用的なイテレータで
汎用的にごにょごにょするのをいうのではないかと。
そういう意味で、Javaではもともと可能な訳で、
J2SE5.0で追加の、erasureによる「Generics」はホントはgenericsではなくて、
気持ちよさの味付けに過ぎない、とか言ってみるテスト。
0114デフォルトの名無しさんNGNG
>>30-31>>107-108だろ。
つまんない知ったかぶりで話を脱線させる特性が共通してるYO
0115デフォルトの名無しさんNGNG
>>110,>>113
 あの〜w
 まめぞの記事リファレンスに出すくらいなら、
 もっと皆に分かりやすく説明したらどうだろね。

 >>110が主観的すぎて第三者に意味不明、
 それにレスする>>113はもっと意味不明。

 要するに、Java Genericは普通のGenericじゃねぇよ、と知ったかしたいのですね :-)
0116デフォルトの名無しさんNGNG
>>113
どーでもいーや。あんたの発言。
夜中にいみふめな即レスつける厨はすっこんでろ、と。
0117デフォルトの名無しさんNGNG
賢くて造詣が深くていらっしゃるようですので、意味不明なんていわないで、
突っ込みどころをきちんと突っ込んでくれれば話は進むのですが。
0118デフォルトの名無しさんNGNG
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1076074304&res=14&fi=no
一応こういうのも作れたり。
0119デフォルトの名無しさんNGNG
>>118
それもGenericProgramingなの?
0120デフォルトの名無しさんNGNG
メンヘラー1が発生しますた。
場所は>>114=>>115=>>116です。
 OKで終了
 キャンセルでデバッグ
[OK] [キャンセル]
0121デフォルトの名無しさんNGNG
「とどのつまり、Generic Programmingのメリットとは、
 型の気持ちよさが維持できる、ということですかい?

 全部Objectで書いて気にならない剛の者、あるいは
 静的型がない言語では別段うれしくはない? 」

ってのは、生半可な厨房に言える言葉ではないな。
究極の厨房、至高のDQS、とにかく視野が狭すぎ。
C++ばっかやんないで、スクリプト系言語やプロトタイピングベースのOO
にでも手を出して、視野を広めてきなさい、ってこった。
0122デフォルトの名無しさんNGNG
究極でも歯垢でも何でもいいから、具体的な突っ込みを書けよ。
しかし、プロトタイピングベースのOOってのは初めて聞いたな。
0123デフォルトの名無しさんNGNG
厨房に突っ込んだら捕まるからいやん
0124デフォルトの名無しさんNGNG
> Genericsってのは、*事実上*、汎用的なコンテナと汎用的なイテレータで
> 汎用的にごにょごにょするのをいうのではないかと。

Genericsって、用途というか適用範囲は限られてるんだね。
OOみたいなもっと一般的な考え方かと思ってた。
0125デフォルトの名無しさんNGNG
C++なんかのgenerics程度でわかったような気になってるやつは
関数型言語の「多相型」についてもっと勉強した方がいいよ。
0126デフォルトの名無しさんNGNG
> 関数型言語の「多相型」

それって、コンテナとイテレータ(イテレーション)でごにょごにょとは
全然違って、Genericsを一般的な技法にしてくれるもの?
0127デフォルトの名無しさんNGNG
>>126
> それって、コンテナとイテレータ(イテレーション)でごにょごにょとは

C++だって、そうじゃない。

話っぷりがアホっぽくて、相手したくないから、
"Modern C++ Designe"でも読んでくれ。
0128デフォルトの名無しさんNGNG
>>127
アホはおめーだろwww.co.jp
0129デフォルトの名無しさんNGNG
>>126
コンテナもイテレーションも関係ない。
0130デフォルトの名無しさんNGNG
一言でいうと、ストローのようなもの
0131デフォルトの名無しさんNGNG
ストロー??(@_@)??
その心は?
0132デフォルトの名無しさんNGNG
ちゅーっ
0133デフォルトの名無しさんNGNG
虎のGenericsって↓とかってどうなんのよ?
とくにEndUserだけあとでコンパイルしたら。

public class Holder<T> {
T value_;
public Holder(T t) { value_ = t; }
public T value(T t) { return value_; }
}

public class IntegerHolderUser {
void method( Holder<Integer> holder ){....;}
}

public class EndUser {
void hoge(IntegerHolderUser iu){
....;
iu.method(new Holder<String>("Unko"));//★
....;
}
}
0134デフォルトの名無しさんNGNG
>>133
試しもせずに聞く奴はウンコ。
> EndUser.java:3: method(Holder<java.lang.Integer>) (IntegerHolderUser 内) を (Hol
> der<java.lang.String>) に適用できません
> iu.method(new Holder<String>("String"));
> ^
> エラー 1 個
0135ウンコNGNG
とんくすこ。
クラスファイルは今までと変わらなくて、
実体はみんな只のObject(か制約してるinterface)+ キャスト、ってのはガセか?
これって、classファイルにしっかり特殊化したパラメタの型データが埋め込まれてるって事だよな?
0136デフォルトの名無しさんNGNG
>>135
そーゆーのが知りたきゃ、横着しないでちゃんと仕様読めよ。

http://java.sun.com/developer/earlyAccess/adding_generics/
でダウンロードできる adding_generics-2_4-ea.zip 内にある文書とか、
http://www.jcp.org/en/jsr/detail?id=202 とか。
0137デフォルトの名無しさんNGNG
>>134みてトライしたが、TypeList書けね。書けんの?
0138デフォルトの名無しさんNGNG
>>121
このおっさん何言ってんだ?あふぉ?
Genericプログラミングは、型についてGenericなプログラミングなんだから、
「」が言ってることはあってるだろ。
0139デフォルトの名無しさんNGNG
当たり前すぎるからいってると思われ。


0140デフォルトの名無しさんNGNG
Tiger preFCSリリース記念age。
0141デフォルトの名無しさんNGNG
だれもやってないの?
0142デフォルトの名無しさんNGNG
テンプレート関連のスレが他にあるから。
0143デフォルトの名無しさんNGNG
++だけかぁ。 (´・ω・`)ショボーン
0144デフォルトの名無しさんNGNG
>>143
別に言語なんて何だっていいんだけどね。
0145デフォルトの名無しさんNGNG
>>144
だったらこのスレ盛り上げてけろ。
0146デフォルトの名無しさんNGNG
「generic」という言葉の意味を考えると、コンテナ+アルゴリズムだけではなく、
ストリームもgeneric programmingじゃないんだろうか。
ファイル・標準入出力・メモリ(文字列)などを一般化して扱っているのだから。
0147デフォルトの名無しさんNGNG
ちょっと研究に飽きたので書きこ。専門的には、大雑把にわけると

parametric polymorphism ≒ C++のテンプレート ≒ JavaのGenerics
generic programming == polytypic programming(呼び方が変わっただけ)

だな。

前者はMLとか大昔からあって、まあコンテナがメインだよな。
たとえば二分木を実装したいときに「整数の二分木」「浮動小数の二分木」
「文字列の二分木」とか、要素の型ごとに別々に実装するのが無駄なので、
「…の二分木」の…の部分をパラメタライズできる機構を導入したわけだ。

後者はまだ新しくて、「木にもリストにも組にもグラフにも集合にも
適用できる関数を定義」とか、もう1段上の一般化。
そこまで一般的に定義できるとうれしい関数としては、
シリアライザとかpretty printerとか=(構造等値)とか。

前者は明らかに役に立つが、後者はまだ用途が限定されてて何とも言えん
と俺は思う。
0148& ◆D3ra0B2LiQ NGNG
で、parametric polymorphismというかJavaのGenericsについては
「要素の型をObjectにすればいいじゃん!」と思うかもしれんが、
そうすると取り出した要素をダウンキャストしないと
ほとんど何もできなくて、コンパイル時型チェックの有難さが
減ってしまう。実行時に「クラスが違うからダウンキャストできないよー」と
言われてしまう(かもしれない)わけだ。

もちろん、誰かが言ってたがコンパイル時型チェックのない言語だったら
そもそもparametric polymorphismなんて不要というか意味がない。

polytypic programmingも、コンパイル時型チェックのない言語なら
普通は自明に実現できるので、やはりあまり意味はない。
0149デフォルトの名無しさんNGNG
あれ、名前がすげー文字化け…

たまにしか書かないので許してちょ
0150デフォルトの名無しさんNGNG
全然わけわからん、そもそも>>147的な分類自体が意味不明・・・
大体、Ada83の昔から、genericは後者を明らかに志向していたし
無論AdaのGenericを手本にしたC++のtemlateも
STLなんかを見れば明らかに後者を志向している
0151デフォルトの名無しさんNGNG
>>147
ちょっとちょっと
> 後者はまだ新しくて、「木にもリストにも組にもグラフにも集合にも
> 適用できる関数を定義」とか、もう1段上の一般化。
が役に立つかどうか言えないなんて、世間ずれしすぎ…
0152& ◆l.EoaDddmI NGNG
>>151
じゃあそういうpolytypicな関数で役に立つ例を、できるだけ多く挙げてくれ。
0153147NGNG
>>150
たとえばAdaのgenericsでもC++のテンプレートでもいいが、
木とかリストとかペアとか任意のデータ型に適用できるpretty printerを
どう書くの?
0154デフォルトの名無しさんNGNG
必死だな
0155147NGNG
ちなみにgeneric programmingとgenericsの区別がつかない人は

http://www.cs.uu.nl/research/projects/generic-haskell/

でも見てね。
0156デフォルトの名無しさんNGNG
>>147
findとかfor_eachって、後者に入るのでしょうか?
それとも全然見当はずれなのかな。
0157156NGNG
>>155
どもも。読んでみます。
0158156NGNG
見当はずれの気がしてきた。
なぜなら、findやfor_eachを*作る*のはgeneric programmingだが、
*使う*のはまた別の話。
0159147NGNG
あースマソなんかHaskellとか関数型言語でいうgeneric programmingと
OOでいうgeneric programmingが食い違ってるような気がしてきた。
狭義と広義っていうか。googleしてみたら半々ぐらいっぽい。
勉強になりますた。出直してきます。
0160156NGNG
>>159
そんなん言わんと、専門の立場からもっといろいろ発言しておくれ。
あと、食い違った部分について軽く説明しておいてくれると、読んでる側として勉強になる。
0161デフォルトの名無しさんNGNG
Java厨に言わせると、
きちんとinterfaceベースで設計すればよいだけでは?
JDK5のGenericsだってOjbectで扱う、コンテナ以外の使い道三塚欄。
0162デフォルトの名無しさんNGNG
>>161
まず、まともな日本語で書け。意味が分からん。
それから、そういう次元の話はしていない。
0163英語毎回追試NGNG
Java junkies say,
it is satisfied by correct desinging with 'interface'. is't it?
Generics introdused to J2SDK5.0 seems to be only useful for containers
that need hadling 'Object's.

0164デフォルトの名無しさんNGNG
genericな設計にするときにUMLなんかでは書けないよね。
設計を図にしたいときってどうするの?
0165デフォルトの名無しさんNGNG
総称的クラスに対しての操作を通常のクラスに対するものと同様に扱えばいいと思うけど。
0166デフォルトの名無しさんNGNG
>>155
Generic Haskelは、CLOS的な総称関数をHaskelにtype safeなまま持ち込む試み。
Dynamic typingも含む。

どっちかつーと、CLOS, C++(with typeid)の後追いかな。
もちろん理論部分で頑張ってるけども。
0167147NGNG
>>160
現在の自分の理解…

OOでいっているgeneric programmingは、MLとか関数型言語でいう
parametric polymorphismのことで、C++のテンプレートとか
Javaのgenericsが実現の一例。intのtreeと、floatのtreeと、
stringのtreeと…を「Xのtree」みたく、型について一般化された
型や関数を定義できる。

Haskellとか関数型言語(プログラミング言語基礎理論のコミュニティ?)でいう
generic programmingは、polytypic programmingと同義で、treeにもlistにも
pairにも適用できる関数を「定義」するための機構。>>156もいっているように、
foreachとかmapとか別々に定義して「使用」することは大抵の言語で可能だけど、
そうではなくて、まとめて定義するってことね。テクニカルにいうと、
型(intとかfloatとかstringとか)について一般的なだけでなく、
型演算子(listとかtreeとか)について一般的な定義ができる。

ついでにソフトウェア工学あたりだと、とにかく超広義に「一般的なプログラムを
書くための仕組み」を何でもgeneric programmingとか言っている人もいる。

ってな感じで合ってる?
0168147NGNG
>>166
あー、C++のテンプレートはいろいろとくっついてるから、一概に
parametric polymorphismだけとはいえないのね。なるほど。

ちなみにCLOSの総称関数ってどんなの?
0169147NGNG
参考文献?

http://en.wikipedia.org/wiki/Generic_programming
0170デフォルトの名無しさんNGNG
>>168
C++と同じくコード共有はあまり気にしない流儀。
http://www.lisp.org/HyperSpec/Body/mac_defgeneric.html

Generic Haskelは、dynamig typing使って、
コード(というか定義)共有頑張るんでしょ? (違うのかな?)
Java genericsやC#のboxing/unboxingみたいに。

structural polymorphismってのは、
C++でいうところのtraitやconceptを入れたポリモなのかな?
0171デフォルトの名無しさんNGNG
>>170
> Java genericsやC#のboxing/unboxingみたいに。

auto-boxing/unboxingね。
0172デフォルトの名無しさんNGNG
>>168
こんな感じ。
http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_149.html
0173デフォルトの名無しさんNGNG
マクロベースでなんとかならなかったのかなーと思って
妄想書いてみた
(define-macro (hoge . body)
 (let ((x (gensym)))
  `(let ((,x 1))
   (hage ,x (car body)) (set! ,x 2) (mage ,x ,@(cdr body)))))

#define hoge(#rest body) \
 { int #gensym x = 1; \
  hage(#unquote x, #first body); \
  #unquote x = 2; \ mage(#unquote x, #unquote_splicing #rest body); }

hoge(a,bc)

{ int g01__x = 1;
 hage(g01__x, a); g01__x = 2; mage(g01__x, b,c); }

#define_syntax for_each #var o #var proc in #var seq ; \
 { #unquote seq.type #gensym x = #unquote seq; \
  for (; #unquote x; ;#unquote x = #unquote x.next()) { \
   #unquote x.data.type #unquote o = #unquote x.data; \
   #unquote proc}}

for_each z printf("data = %a",z); in strlist;

{ string_list_t g02__x = strlist;
 for (g02__x; g02__x = g02__x.next()) {
  string_list_data_t z = g02__x.data; printf("data = %a",z); }}

やっぱ型がネックだなー
やはりC++の選択は正しかったのか。
0174デフォルトの名無しさんNGNG
>>173
C++のテンプレートは構文マクロだからな。

どうでもいいがJava Genericsには日本人の貢献もでかいな。
■ このスレッドは過去ログ倉庫に格納されています