関数型言語ML(SML, OCaml, etc.), Part 3
1 :
デフォルトの名無しさん :
04/12/21 14:17:03
2 :
デフォルトの名無しさん :04/12/21 18:59:30
_,ヾゝ'"'" " '"、,; ,ラ 、_ 〃,、 イ r-'ー゙ "ー‐、, ミ i! ,! / \ |ミ ,j i - - | ,,(6 ,,.. ↓..,, | <モ2ワが2げっと! メ, ー / ,.-'\ ...,, ーー、,/、 //:::;;:::::::::::::::::::::▽:::::::ヽ |||::::|::::E N E O S::|::::::| |||::::|:::::::::::::::2:::::::::::|:::::|
おいおいいくらなんでもこのままだとdat落ちするぞ
んーじゃそれはちょっと悲しいので提議をしてみます。 ML 系言語だと SML/NJ と OCaml が有名だという認識なんですが、他の処理系 を使ってる人っていますか? どう違うとかどう嬉しいとか、そもそもどうい うのがあるかとか(Moscow ML くらいしか知らないんですが)。
>>1 乙!…………と言いたいところだが、
このスレには消えて貰うわけにはいかないのですよ。
ちょっと立てるの早かったかな。でも乙。
MLってオブジェクト指向? ってそんな話じゃない?
関数型言語だと書いてあるでしょうに
OCaml はオブジェクト指向もあり。
10 :
Aransk :04/12/24 18:01:52
>現実的なソフトの開発にも使用できる実用性を備えた言語です。 使用できるじゃなくて、使用して開発「された」ソフトは あるのでしょうか?
今の時代、関数型であろうと手続き型であろうと、 オブジェクト指向、STLとかないと非常に開発効率・保守が悪くて 使い物にならないわけだが。。。
>>11 STL って何? C++ の Standard Template Library くらいしか思いつかない
んですけれど……。
13 :
デフォルトの名無しさん :04/12/24 21:58:09
説明するのも面倒だが ただの用語聞きかじり厨だからほっとけ STLが何の略なのかもわからなかったんだろ
SMLの中間語はCPS? そのせいもあったりして。
きれいさだけで言えば、むしろCPSのほうが見やすいコンパイラにならないか? 効率を気にし始めると、CPSは妙な最適化が要るようになって汚くなるのかもしれんが。
17 :
デフォルトの名無しさん :04/12/25 14:24:15
mltonそこそこ速いみたいだけど cygwin/gcc依存しまくってんなorz 単体実行ではOCamlかねえ
使ってる奴いないの? というかMLで何すんの? C++じゃいかんの?
使ってる奴いるよ? というか聞いてどうすんの? そもそも1行ずつあける必要あんの?
行間よめってことじゃない? でもこの話題に行間もくそもありゃしない! 残念!
21 :
デフォルトの名無しさん :04/12/26 02:01:32
VMになってからのML Kitはどうなの? regionには魅かれる
どうなの? って自分で確かめろよ そして報告しろ自作自演しろ! ひといないんだから! 残念!
Haskellみたいな関数の合成ってMLにあるの?
25 :
デフォルトの名無しさん :04/12/26 12:38:54
>> 23 fun f x = x + 1; fun g x = x * 2; val h = f o g;
deforestationします。
27 :
Aransk :04/12/26 16:58:26
>オブジェクト指向、STLとかないと非常に開発効率・保守が悪くて >使い物にならないわけだが。。。 CとかCobolなんかそんなものが無くても 結構実用的な開発に利用されています。 MLはどうなんでしょう?
ここで Aransk 降臨!とかあるとおもしろんだが。 どうせ厨しか集まりませんからぁー! 残念!
31 :
Aransk :04/12/27 17:33:58
一時期研究したことがあるけれど、Region Inference は微妙です。 たとえば、tail call が tail call じゃなくなったりする。 let f x y = letregion r in ... f x' y' end (* f の後で region 開放命令が必要 *) はっきり言ってそのままでは使えないよ。Linear Type とかを使ってばしばし destructive update するとかは最低必要。(もちろんコンパイラがやるんですけど。) あと、GC と言ってよいのかもしれないけど、GC が動的に回収するのに対して、 region inference は静的にメモリを回収するコードを埋め込む違いがある。 (i.e. コンパイル時に malloc/free を埋め込む) あと、リージョンはスタックで取るので、スタックの下のほうにゴミがあっても、 上の方が使われていたりすると破壊されない。リージョン推論がちゃんと出来てれば 防げるのかもしれんが、もう半分忘れた。
ここはおまえのメモ帳じゃねえんだ
34 :
Aransk :04/12/27 18:35:06
region関係は一時期D. Walker達が盛んにやっていたようだが、今はどうしてるんだろうね。
>>35 MorrisettとかのCycloneあたりにシフトした…のか?
WalkerもMorrisettも発表はよくきくけど、
L^3とかは複雑すぎてわけわかんなかったなあ。
コンパイラが推論するにしても、プログラマが挙動を理解できなさそう。
ところでML Kitって今はx86ネイティブコードを出すんだよね?
昔はHPだったが。VMって何?と思ってよく見たら、
3.9.0からバイトコードもあったんだ。へーへーへー。
http://www.itu.dk/research/mlkit/dist/NEWS-4.1.4
37 :
Aransk :04/12/28 12:59:16
最近VM付きでない言語を探すほうが 難しい。それほどVM技術が一般化した ってことじゃないでしょうか。 上記のAliceもしかりです。 その内ハードディスクがVMだらけに なって、バッティングを起こしたりしてね?W
さびれてんなあ。しょうがないなあ、つっこみ入れるよ…
>>37 ・ML Kitは「言語」じゃねえだろ!
・「VM技術」ってなんだよ。VMにすること自体は技術なんてもんじゃねーよ。
・「ついに」とか言われたってAliceなんてしらねえよ(作者の一人は知ってたけど)。ざっと見たが何もオリジナリティないじゃん。
・JVM同士とかならともかく、違うバイトコードのVMがどうバッティングするんだよ!
39 :
Aransk :04/12/29 13:52:21
>>38 >・ML Kitは「言語」じゃねえだろ!
誰が「言語」と発言されたのでしょうか?
>・「VM技術」ってなんだよ。VMにすること自体は技術なんてもんじゃねーよ。
RubyはVM化したいらしいけど、まだ出来ませんが…。
>・「ついに」とか言われたってAliceなんてしらねえよ
>(作者の一人は知ってたけど)。ざっと見たが何もオリジナリティないじゃん。
少なくともML Kitよりは活発にプロジェクトは動いているようです。
>・JVM同士とかならともかく、違うバイトコードのVMがどうバッティングするんだよ!
「バッティングを起こしたりしてね?W」貴女は最後のWを見落としましたね?
ジョークです。W さすがにdllを組みこんだVMは存在しないでしょう。W
(Wを全角にしましたから…)
アホを相手にすんなよ。
41 :
Aransk :04/12/30 15:59:46
>>40 黒田さん並におっとりしておりますんで…。
すまん Aransk = アホ
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
44 :
Aransk :04/12/31 18:38:07
畏れ多いことを発言してはいけません。 黒田さんは=内親王の夫君となられるお方です。 黒田さん=おっとり=Aranskですからして、 おっとりー>アホは黒田さんにも関数適用 されます。W
Aransk = アホ は真であるが Aransk = おっとり は偽だな。
ま た A r a n s k か
Aranskに項と関数の区別がつけられないのはよくわかった。
>>25 ocaml だと、
let (^.^) f g = function x -> g (f x);
let h = f ^.^ g;;
みたいに定義しないとダメ? 標準装備じゃないの?
>>50 Thanks!
ところで、話題になってる「VM」って抽象機械の事?
ocaml だと ZINC とか聞いたことあるけど、対応表キボン。
Java -> JavaVM
ocaml -> ZINC?
SML -> ???
52 :
Aransk :05/01/04 17:41:59
>話題になってる「VM」って抽象機械の事? 1.中間コードを生成することにより インタプリターの速度をアップする。 2.OS間の差異を吸収し、コーディングの 統一を図る。 これらを目的としたもの全て、MSのCLRも 含むと個人的には解釈しております。
それとこれまでの発言を踏まえると、 Aranskは現存の言語の実装を全くわかってないという結論が導かれるがよろしいか。
>>50 osiire:/tmp[58]>cat gext.ml
open Pcaml;;
EXTEND
expr: AFTER "apply"
[[ f = expr; "o"; g = expr -> <:expr< fun x -> $f$ ($g$ x) >> ]];
END;;
osiire:/tmp[59]>ocamlc -pp "camlp4o pa_extend.cmo q_MLast.cmo" -I +camlp4 -c gext.ml
osiire:/tmp[60]>cat o.ml
let f = fun x -> x + 1
let g = fun x -> x * 2
let _ =
let h = f o g in
Printf.printf "%d\n" (h 10)
;;
osiire:/tmp[61]>ocamlc -pp "camlp4o ./gext.cmo" -o o o.ml
osiire:/tmp[62]>./o
21
osiire:/tmp[63]>
55 :
デフォルトの名無しさん :05/01/19 11:31:13
ocaml のファンクターについて質問があります。 ファンクターでクラスを内包してるモジュールを輸入したいとき、与える実際 のクラスの型ってシグネチャーと正確に一致してる必要がありますか? 私が試した限りではそうなのですが、他の書き方で実現できたりしないのか なー、と淡い期待を抱いています。 Objective Caml version 3.08.2 # module A = functor ( B : sig class c : object method x : int end end ) -> struct class c' = object inherit B.c end end module D = A (struct class c = object method x = 10 method y = 20 end end) ;; Signature mismatch: Modules do not match: sig class c : object method x : int method y : int end end is not included in sig class c : object method x : int end end Class declarations do not match: class c : object method x : int method y : int end does not match class c : object method x : int end The public method y cannot be hidden #
val ならいける模様. method はダメなのか...うーむ... Objective Caml version 3.08.2 # module A = functor ( B : sig class c : object method x : int end end ) -> struct class c' = object inherit B.c end end module D = A (struct class c = object method x = 10 val y = 20 end end) ;; module A : functor (B : sig class c : object method x : int end end) -> sig class c' : object method x : int end end module D : sig class c' : object method x : int end end #
ここに書き込むのが適切なのかどうかわからんのだけど、 コンビネータ理論とラムダ計算の同等性がわからず、詰まってます。 λ|- M=N ⇔ CL+ (ζβ)|- M_cl = N_cl らしいんだが、なんでζβじゃないといけないんだろう・・・
λにおけるη展開に相当する規則がCLにないから補う必要がある。
>>59 仰る通り、字面では分かるんですが、それはなぜかと言うところで…
というか、とある問題を解いていて、
(ζβ) : Px → Qx ⇒ P = Q
という規則の代わりに
(ξ):P→Q ⇒ λx.P → λx.Q
をCLに追加するだけでは不十分である事を示せ、とあって、
詰まっていたりします。
…うう、スレ違いスマソ。
すいません、規則書き間違えました。 (ζβ) : Px = Qx ⇒ P = Q (ξ):P = Q ⇒ λx.P = λx.Q でした。重ね重ねスマソ
つーか、プリミティブなλにη展開は存在しないんだが。
ここは横内さんの本を輪読するスレになりました。
\( r―-、、 ,r''^tヽ 〉、::::::::ヽ 落ち着け! t'L`、f) ム`''^)ヾj'′ ヽlヲノー、-、 ,.゙'r'''ニヽ、, r'^ヽt,..,j:::゙i ヽ f,..つ'''ヽ、ヽ! ゙i、 ヾ._゙)_;::-:'"r-ミ= __):l.l =テ`'i,,゙>、 '"_,,.ィ"`′ ノ´!;;;;;;l ! '"'^´l ゙i`1234、_ィ'"´:::::l;;;;;;l l
>>61 (ξ):P = Q ⇒ λ^*x.P = λ^*x.Q
の間違いじゃない?あとλかληかはっきりさせて。
p.44 練習問題2.6の2です。
>>63 >>65 >>66 ご明察で、横内さんの「プログラム意味論」(共立出版)
p.44 練習問題2.6の2です。
(ξ)の正しい定義は
>>65 さんの通り、ληではなくλです。
理解が足りてなかったので混乱させてしまいました。
CL+(ζβ)は強すぎじゃないか? λη|-M=N iff CL+(ζβ)|-M_cl = N_cl λ|-M=N iff CL+(ξ)|-M_cl = N_cl という感じがするのだが(根拠はない)
69 :
デフォルトの名無しさん :05/02/26 12:40:47
俺にとっては横内さんの本はわかりにくかった。 GunterやMitchellを読んで、横内さんの言いたかったことがやっとわかった。
>>69 しかし、上で揉めてる話は純粋なラムダ計算周りで、代数系の知識はあまり
要らないんじゃないかと思うんだが。
Winskelも読んだが、あれは横内さんのような(というか元ねたのGunterのような) カテゴリーに基づく意味論を扱ってなかったように思う。代わりに自分の専門 (の一つの)information systemに1章割いていたが。 まあWinskelは学部レベルの入門書、Gunterは専門書という位置づけだろうな。
アマゾンを見たら 『プログラム意味論』と『プログラミング言語の基礎理論』、どちらもおすすめ! って書かれてるけど、横内さんの本を読もうという人が、まともに大堀さんの本など 読めないのでは? 日本語限定だと他にどうともしようがない事情も分かるけれど。
横内は誰にでもわかる本を作れない時点で低脳
せめて劣化コピーry
今、75が本質的な事を言った
スレのレベル低下中・・・
今、78が本質的な事を言った
スレの法則が乱れる!
OCamlの勉強をはじめてみようと思うんだが、OCamlのユーザーって日本に何人ぐらいいるもんなの?
う~ん、OCamlをインストールしてちょっと触ってみた感想として、標準で グラフィックスライブラリやパーサージェネレータが付属していて、 よく出来てそうな環境という印象だったんだけど、あんまり流行ってないのかな。
例外処理とかどうなってんの? WindowsのOCamlはSEHとか使ってんの?
>>81 表には書いていないけれど、私はOCamlで作ったツールとかも公開したりしている。
おれも心のなかでは公開してるよ
>>84 使ってない。
つまりエラー処理グダグダ。
www.ocaml.org が 404 Not Found なんだけど……なにかあったのか?
スルーされてるが
>>85 に期待。
いくら貰えたの?
現段階ではSparcマシンが必要七日
ATLを生成してGCCのバックエンドを使えばいいと思うんだけど、難しいの?
ATL(Active Template Library)?
RTLですた。
・RTL(Register Transfer Level) HDLの記述形式。レジスタの振る舞いに注目し、回路構成を記述。 難しそうね。
ゲートレベルよりははるかに楽。
101 :
デフォルトの名無しさん :05/03/13 06:46:15
楽?
おフランス万歳
ドキュメント類が3.07のときのやつに戻ってるような。。。
>>102 IEからだとファイルのダウンロードになってしまう。
おれの環境がおかしいのか?
110 :
デフォルトの名無しさん :05/03/20 18:04:49
MLってどこがいいのよ? 動的型付けのLispみたくパワフルでないし、 JAVAみたいにわかりやすくもないし、 Cみたいに高速でもないんでしょ?
>>110 型について、LispとMLでどちらがパワフルかといったらMLだろうなぁ…
解かりやすさについては…う~ん、解かりやすさってなんだろう…それが解からない。
C++よりも速いがCよりは遅いと巷では言われています。
そうして個々に見るといい言語なんだよなML。 しかし日陰者。
>>112 OCaml!!!!!!!!!!!!!!!
これって日本語回りはどんなもんです?
むしろ Camomile では?
MLがマイナーな理由の1つに、 コード生成アルゴリズムがほとんど認知されていないという事があると思う。 どういう記述をすれば良いコードが生成されるとかいった情報。 例えばC言語は高級アセンブラと言われるぐらい単純で、 実際アセンブラからCへの写像も簡単だし、 そういった情報は豊富にあるから、C=速いという結論へすぐに 帰着することができるけど、MLではベンチマークサイトの結果等から漠然と 「速いらしい」という認識しかしてない人が多いと思う。 ほとんどの人がなぜ速いのか?、まで追求しない。 これは型推論からなるMLの基礎理論のハードルが他と比べて高いのが1つの原因だと思う。 言語処理系がコードを処理していく行程というか、仕組み想像できないゆえに敬遠される。 きっとMLにはGCが存在する事さえあやふやな人もいるはず。 CやLISPを自作できるという人はかなりの人数に上ると思うけど、 MLはどうかな?たぶんここには一人もいないよね。
minicaml!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
前半は正しいっぽいのに後半はむちゃくちゃだな。 >CやLISPを自作できるという人はかなりの人数に上ると思うけど、 >MLはどうかな?たぶんここには一人もいないよね。 MLがその力を真に発揮するのは言語処理系を書くときだよ。 MLマニアの大半もそういうことに興味あるやつだと思ってたけど…。 むしろCの処理系を自作できることのほうがすごい。
>>119 処理系書くとかいう話ではないんだけど。
>>111 > 型について、LispとMLでどちらがパワフルかといったらMLだろうなぁ…
???
>>110 は型自体がパワフルなんて言ってないと思うんだけど???
>>117 言ってることはまさにその通りだと思うんだけど、みんなが知りたい
そういったコアな情報を分かりやすく公開してくれる熱心なグルが
現れん限り状況は改善しそうにないな。
アホか。大学で普通にならうっちゅうねん。
↑馬鹿注意
むしろ学校でしか縁がないとも言えるな。
126 :
デフォルトの名無しさん :2005/03/21(月) 19:57:47
Windowsでちゃんとした実行ファイルが作れるMLってありますか?
127 :
デフォルトの名無しさん :2005/03/21(月) 20:00:19
128 :
デフォルトの名無しさん :2005/03/21(月) 20:02:24
↑何?怖くて見れません。
桜まつり??
130 :
デフォルトの名無しさん :2005/03/21(月) 20:07:30
あ、OCamlにします。
今話題の岡村がどんなものなのかざっと知るのに よいページを教えてください
>>115 亀だけど㌧
家かえって早速インスコ。
軽く触ってみた。。。第一印象は「いい感じ。」
ここのところPython三昧だったけど、ちょっと浮気してみようかな、と思ってみたり。。。
(ググッたらwxCamlもあるし。ちょっと期待)
133 :
デフォルトの名無しさん :2005/03/21(月) 21:06:18
136 :
デフォルトの名無しさん :2005/03/31(木) 02:14:01
>>136 下の方のは実用目的ではないよね。
(その分、処理系の存在自体が楽し感じる)
まぁ、
>>126 の用途もよく分らないけど。
137 :
デフォルトの名無しさん :2005/03/31(木) 03:44:43
>
>>135 その中に日本語のサイトが1つも無いのは仕様ですか
140 :
質問2つ :int 2ch =05/04/02(土) 02:35:59
●パターンマッチングを、変数の値を使ってやりたいのですができないでしょうか? 0 と size と、それ以外の値でパターンマッチングをやりたいです。 let f size i = match i with 0 -> print_endline "zero" | size -> print_int size; print_newline (); print_int i; print_newline () | _ -> print_endline "_";; とやると、どうやら size に i の値が束縛されてしまい、0 の場合以外は必ず二番目のケースに マッチしてしまいます。 Warning: this match case is unused. という警告も出ます。関数の型は val f : 'a -> int -> unit = <fun> で、 size が使われていない感じです。 #f 5 2;; は 2 2 を表示します。 ●(int * int) と int * int の違いが今一つ理解できないんですけど、教えてプリーズ
>>140 それはパターンマッチを使うべきではない気がする。というか、できない。
if i = 0 then "zero"
else if i = size then "size"
else "_"
(int * int) と int * int は同じでしょう?
(int * int) list と int * int list は違うけど。
>>141 訂正。when 使えばできるかも。
match i with
0 -> "zero"
| _ when i = size -> "size"
| _ -> "_"
>>140 >>141 それ単体では同じだけど
type t1 = A of (int * int) と type t2 = B of int * int は微妙に違う。
match (A (1, 1)) with A p -> (fst p) はできるけど
match (B (1, 1)) with B p -> (fst p) はできない。
大して深い意味がある違いじゃないと思うけどね。
144 :
140 :2005/04/03(日) 00:29:08
>>141 ,142
ひとまず if を使う実装にしたんですが、月曜にでも試してみます。
>>143 # let f () = (1,2);;
val f : unit -> int * int = <fun>
# type t1 = A of int * int | B of (int * int);;
type t1 = A of int * int | B of (int * int)
のとき、
# B (f ());;
- : t1 = B (1, 2)
# A (f ());;
Characters 0-8:
A (f ());;
^^^^^^^^
The constructor A expects 2 argument(s), but is here applied to 1 argument(s)
となって、悩んでます。
145 :
143 :2005/04/03(日) 03:10:21
A of int * int の A は、int 型の引数を 2 つとる構築子。 B of (int * int) の B は、(int * int) 型の引数を 1 つとる構築子。 A (f ()) は (f ()) という (int * int) 型の引数を 1 つしか与えてないからだめ。 let (v1, v2) = f () in A (v1, v2) と書けばいい。 こういう仕様になってる理由はよくわからん。 歴史的な理由か実装上の都合かなと思ってるけど、誰か知ってる?
>>143 >> 144
そんな現象があるとは知りませんでした。
しかし、ものすごく直観に反するんですけど。理由がないならコンパイラを修
正すべきだ。
typing/typecore.ml のこのあたりかな?
let sargs =
match sarg with
None -> []
| Some {pexp_desc = Pexp_tuple sel} when explicit_arity -> sel
| Some {pexp_desc = Pexp_tuple sel} when constr.cstr_arity > 1 -> sel
| Some se -> [se] in
if List.length sargs <> constr.cstr_arity then
raise(Error(loc, Constructor_arity_mismatch
(lid, constr.cstr_arity, List.length sargs)));
たぶん int * int のときは、constr.cstr_arity が 2 で、sargs が [se] に
なるので mismatch なんでしょう。
どう直すべき?
data constructorのarityの定義が気になる。 直感的には、すべてのdata constructorのarityは1だと思うのだが…。 A of int * intはintの組を1つ引数とするものだと思うし。
気持ちはわかる。けど本当に大した理由がないことなのかは自信が持てない。 A of int * int のほうが tuple を構築、分解しなくてすむ分 メモリ効率や実行効率が若干いいかも。 そういうのは最適化の方でやってほしい気もするけど。 コンパイラ直すなら ad-hoc に parsing/parser.mly の constructor_arguments: /*empty*/ { [] } | OF core_type_list { List.rev $2 } を | OF core_type { [$2] } とする方がいいんじゃないかな。 これすると camlp4 のコンパイルが通らなくなったけど。 気合いと暇があるなら ast 書き換える方向で。
A of int * intの場合(かっこがつかない場合)、 parse時にちょっとデータ構造を最適化しているが、 matchの方を修正し忘れている…という可能性もあるね。
>>149 よくわかんないけどバグってこと?
>>143 の例で言うと、
The constructor B expects 2 argument(s), but is here applied to 1 argument(s)
なんていうエラーメッセージが出るくらいだから、
多分バグではなくて意図した仕様と動作みたいだよ。
何を意図しとるんだ?
それはOCamlの有名な、というか悪名だかい仕様。148のいってること↓が正解。 > A of int * int のほうが tuple を構築、分解しなくてすむ分 > メモリ効率や実行効率が若干いいかも。 > そういうのは最適化の方でやってほしい気もするけど。 Unboxingっていう最適化を実装すればよいんだが、多相性との関係で意外と大変なので、OCamlではやってない。 MLtonあたりならやってそうだけど。
どこで有名なんですか?
154 :
152 :2005/04/06(水) 12:10:47
詳しいことは知らんが、マニュアルに > The type expression ( typexpr ) denotes the same type as typexpr. と書いてある以上、int * intと(int * int)で動作が異なるのを仕様と言い張るのは 無理があると思う。そもそも()はtype levelのconstructorではないだろう。 それと揚げ足を取るようだが、最適化の実装の有無で言語仕様が変わるのはおかしい。
OCamlは.+とか、汚い部分を消していけばよいと思う。
Microsoft の F# ってどうなの?調べるのめんどいからおせーて。
構文は SML の方が読み易い様に感じるけど、処理系は OCaml の方が機能豊富だね。
言語仕様を見るとHaskellの方がはるかに機能的に見えるのだけど、実用面を見るとHaskellはボロボロ。 結局、開発するならOCamlに軍配があがるんだよね。
161 :
152 :2005/04/06(水) 23:34:38
>>155 > 詳しいことは知らんが、マニュアルに
> > The type expression ( typexpr ) denotes the same type as typexpr.
> と書いてある以上、
それは鋭いね。実装のバグとも、マニュアルのバグともいえるかも。バグレポート出そうか?
ちなみに言語仕様が「効率よく実装できるかどうか」に影響されることは、
どんな言語でも大なり小なりあるだろう。
>>156 それも俺の中ではFAQだが、Haskellのtype classみたいな大掛かりな仕組みを入れるか、
SMLみたく妙にad hocなルールを決めるか、どっちかになってしまう。
162 :
デフォルトの名無しさん :2005/04/08(金) 00:23:58
>>161 演算子のoverloadingは、genericで解決できないのかな?
164 :
163 :2005/04/08(金) 03:28:40
ってgcamlのことか。じゃあよく知らんスマソ
166 :
デフォルトの名無しさん :2005/04/09(土) 02:22:59
Camlp4のp4て何?
>166 ばーか
170 :
デフォルトの名無しさん :2005/04/20(水) 21:20:32
p4 はフランスの徴兵検査でお馬鹿か何かで不適格になった時の分類らしいです。 どーも campl4 と手が動いて困る。campl4 だけバイナリ名が ocaml から 始まってないのも好かん。改造するときに統一的に名前が変えられない、、、
リネームしたら、ええんちゃう・・・?
172 :
デフォルトの名無しさん :2005/04/20(水) 21:22:34
173 :
デフォルトの名無しさん :2005/04/20(水) 21:26:20
>>171 ocaml を改造して acaml を作るとすると、
ocaml => acaml
ocamlc => acamlc
ocamlopt => acamlopt
ocamldep => acamldep
なんだけど、
camlp4 camlp4o camlp4r ocpp
は統一的な名前変更が出来ん。作者が違うからしょうがないけど、
ocamlなんとか って名前にしてほしい。
それ苦情申し立てした方がいいね 名前ごときで使えないなんてもったいない
>>175 すごい! すばらしい!
で、早速コンパイルしたいのですが、
./configure; gmake world すると、.depend がないとか言われてしまいます...
どなたかご助言下さい
177 :
デフォルトの名無しさん :2005/04/23(土) 13:01:10
今日付けの version ではなおっているみたい。
どうもfuruseさんはこのスレッドをチェックしているような気がしてならない。 それはそうとGJ!
別にGJじゃないよ
普通チェックすると思う。
>>177 無事コンパイルできました。ありがとうございました。
README.gcaml には Native code compiler が未実装だと書いてあるのですが、
手元で少し試してみると、gcamlopt も動くじゃないですか。すばらしい。
まずは generic とか run time type とかどうやって使う物なのか、お勉強し
なきゃ。
182 :
デフォルトの名無しさん :2005/04/26(火) 01:59:05
eclipse&camlclisp初めて触ってみたけど、graphics.cma他外部ライブラリ をリンクする方法が判らない…orz
183 :
デフォルトの名無しさん :2005/04/26(火) 15:40:25
ここでぶつぶつ言ってないで、 camlclisp の作者に聞けばいいじゃん。
いいじゃん、いいじゃん
185 :
デフォルトの名無しさん :2005/04/26(火) 23:25:53
186 :
デフォルトの名無しさん :2005/04/27(水) 22:23:17
コレを気におフランスの言葉を覚えるざます
188 :
デフォルトの名無しさん :2005/04/28(木) 11:49:00
>> 186 ドキュメント書いているのはどうやら学生さんみたいね、、、 だから、英訳はすぐには期待できないかな? Chailloux は O'Reilly O'Caml 本の著者。 気さくなオッサンだから彼に英語で質問するのが吉。
189 :
デフォルトの名無しさん :2005/04/28(木) 22:33:40
merd ってのを最近見つけたんだけど、 どなたか詳しい方いますか? 現在開発されてますか?
>188 ご助言ありがとうございます 解んない事が明確なら質問しようとかも思いまするが フランス語の入門書と辞書でも買ってもう少し足掻いてみようかと。 その前に社内にいるフランスの学生さんに掻い摘んで読んで貰おうとか それ以前に、山勘で使えてると思っているのも思い過ごしかもしれないし… orz
つーかフランス語のフォントって英語と違うよね?
はぁ?
関数型言語コミュニティには>193のようなイジワルな人が多い気がする。
そう言う人はどこにでもいるけど、人数が少ないから目立つだけのような気がする。 Javaスレで同じようなことが起きても誰かが答えて終わりじゃん。
197 :
189 :2005/05/01(日) 09:43:26
失礼。 関数型言語全般のスレと間違えました。
merdは確かOCamlで書かれてるし、別にスレ違いというほどでもないと思うけど。 漏れもちゃんと調べてはいないなぁ。
コーダ臭ぇスレだなw >変った型システムの言語というイメージ おぃおぃw Haskelやった事ないだろw
201 :
デフォルトの名無しさん :2005/05/01(日) 11:08:10
>>199 haskell知らなかったらコーダなの?
>>199 Haskellのlはふたつ。
ところで Haskell には SoftTyping はないと思うんだけど。
ゴールデンウィークなんだ 察してやれ
幸田です。 この言語は基幹系システムを組むのに向いていますか?
205 :
デフォルトの名無しさん :2005/05/05(木) 12:58:12
Goferでいいんじゃね? 2ちゃんに常駐してるようなのには。
208 :
デフォルトの名無しさん :2005/05/05(木) 13:05:22
>>207 なんだと!
だったらお前の意見を言ってみやがれ
209 :
デフォルトの名無しさん :2005/05/05(木) 13:09:20
基幹系というと、あれか。 ボラクルに繋いだり、バッチ処理をやったり・・・
210 :
デフォルトの名無しさん :2005/05/05(木) 13:10:41
リレーショナルなデータベースから何から何までOCamlで組むんだよ。
ML系の言語は、当初、定理証明系の記述言語として作成されたものなので、 汎用的プログラミングには向いていませんでした。 その後、HOPEの型推論等を取り入れた、汎用の関数型言語として、 Caml、SML等が開発されました。 特にCamlは、Category Abstract Machineと呼ぶ抽象機械の上に実装されており、 実用プログラミング言語としての地位を目指しています。
まぁ目指すだけならボンクラにもできるわけだがw
214 :
デフォルトの名無しさん :2005/05/05(木) 13:17:57
215 :
デフォルトの名無しさん :2005/05/05(木) 13:20:30
バカは相手にしない。
216 :
デフォルトの名無しさん :2005/05/05(木) 13:21:39
表面しか見ないで発言する奴もバカ。
>>216 本当にお願いだからそういうレスでスレを腐らせるのはやめてくれ
218 :
デフォルトの名無しさん :2005/05/05(木) 13:46:55
俺の学生時代の記憶では、 十数年前にmirandaかなんかでOSとか実用分野のプログラムを記述する試みがあったな。 SMLやgoferがでる前。
219 :
デフォルトの名無しさん :2005/05/05(木) 13:47:14
220 :
デフォルトの名無しさん :2005/05/05(木) 14:09:07
職場の古老が言うには、RDBのSQL言語は、関連代数を扱う宣言型言語で、 ライバルはPrologという大変トンがった言語だそうな(笑。 歴史的経緯を度外視すると、COBOLのお仲間に見えちまうんだが
ObjectDB商売やXMLDB商売、Alt RDB商売も、 パッとしないねぇ
222 :
218 :2005/05/05(木) 14:43:53
いま、引っ張り出してきた。 1987~1990年頃の話だから、SMLより後、SML NJの前あたりか。 [Tur90] D.A. Turner. An approach to functional operating systems. In D.A. Turner, editor, Research Topics in Functional Programming, pages 199--218. Addison-Welsey, 1990.
関数型言語でDatabase作ろうって話も、同じ本に載ってた。 [Bun90] P. Buneman. Functional Programming and Databases. In D. Turner, editor, Research Topics in Functional Programming, pages 155--169. Addison-Wesley, 1990.
> 職場の古老が言うには、RDBのSQL言語は、関連代数を扱う宣言型言語で、 実際そうだよねえ。SQLじゃ手続きは一切記述しないし。 > 歴史的経緯を度外視すると、COBOLのお仲間に見えちまうんだが 計算機科学の基本的な勉強してないと、そう見える場合もあるってことですね。
DDLは手続きそのものだけどね。 > > 歴史的経緯を度外視すると、COBOLのお仲間に見えちまうんだが > 計算機科学の基本的な勉強してないと、そう見える場合もあるってことですね。 おバカ?
>>222-223 monadic I/O 以前の話のような気がする。
そして、OCamlもSML NJも monadic I/Oなど使っちゃいないのさ(w
つまりML系関数型言語 特にOCalmlで 実用プログラミングをするのに、
大きな障害はないんじゃないか、と。(やる人が居るかどうかは別として)
やる人など居ない
>>225 > DDLは手続きそのものだけどね。
まさか。宣言型の意味がまるでわかってないの?
229 :
デフォルトの名無しさん :2005/05/05(木) 15:38:31
中学生の煽りカッコイイ DDLってなんの略?
230 :
デフォルトの名無しさん :2005/05/05(木) 15:40:26
DMLってなんの略?
関数型言語のスレで暴れるDBエンジニア、カッコイイ
232 :
デフォルトの名無しさん :2005/05/05(木) 15:47:40
CAMLでグタグタな事務プログラミングする人柱、きぼんぬ
DDLの記述は宣言的だが、 DDLの実行は、関数定義の変更と同様、手続き的になされる ということ
> > 職場の古老が言うには、RDBのSQL言語は、関連代数を扱う宣言型言語で、 > 実際そうだよねえ。SQLじゃ手続きは一切記述しないし。 まさか。実際のRDBでSQL使った事ないだろ。
SQL-99のPSMの件だな。
>>226 Haskelじゃなくて、Clean流のmonadic I/Oね。
237 :
236 :2005/05/05(木) 16:47:01
訂正
>>226 Haskelのmonadic I/Oじゃなくて、
Clean I/O につながった話だね
>>211 ご存知でしたら教えて頂きたいのですが、ocamlって今でもcamに基づいて実装されてるんですか?
pushとかcarとかswapとか。
今の高レベルの言語機能をcamで実現するのは結構大変かもと思うのですが…
SQL で手続き的な部分ってトランザクションとかストアドプロシージャとか? 歴史的経緯を考えれば SQL は宣言型言語と言って間違いは無いと思うけど。
>>238 私はOcamlはほとんど触ってないので存じません。(Linuxでmmm使った位かな)
先ほど調べたら、OCamlはネイティブコード版とバイトコード版があって、
バイトコード版は XleroyさんのZINC仮想機械で動く、ということらしいですね。
ZINC report,
http://pauillac.inria.fr/~xleroy/publi/ZINC.ps.gz >>239 当初の理念はどうであれ、現状は違うって話でしょ。
宣言型とか関数型という概念自体、当時とは随分変わってきている。
最近の定義だと
純関数型: 変数への(破壊)代入を許さない
参照透過性: 処理の順番によらず、同じ結果が得られる
等々、SQLの INSERT, UPDATE, DELETE操作自体、
宣言型と言い難いような気がする。
他方、SQLの仕様自体もどんどん変化して、
おっしゃる通りの手続き要素がSQLの内側に入り込んできている。
camlも最初はcamに基づいていたが、今は全く使っていない。
>>240 > 宣言型とか関数型という概念自体、当時とは随分変わってきている。
ついには宣言型とか関数型とをごっちゃにするヤツまで登場か。
えぇーと、じゃぁ「宣言型」と「関数型」と「手続型」の区別を 定義してみて。
宣言型={論理型, 関数型} SQLは述語論理型
幼稚な揚足ばっかで不毛なスレだな。 最初の話題に戻って、 関数型言語でデータベースやOS作るという話はどうなんだ。 DBに関して、例えばこの本が非常に気になるんだが Purely Functional Data Structures by Chris Okasaki
>>247 いや、ここに居るのは「DBは宣言的言語の適用分野」って丸暗記しているだけで、
実際のDB (dbmじゃないヨ)はあまり知らないだけだろう
>>246 SQL言語は述語論理だが、SQL言語が提供する
INSERTやUPDATE、DELETEはDBに対する手続き的操作
なんだよ
あと、こっちのバカにもレスしとくか。 >228 DDLの、DROP、ALTERってナニするか知ってる?(激藁
>>249 > INSERTやUPDATE、DELETEはDBに対する手続き的操作
> なんだよ
違うでしょ。「手続き型言語」なら、INSERTやUPDATEの中身を手続き的に記述する必要がある。
それをせずにINSERTと書くだけですむから宣言型。
ANSI SPARC 3層モデルの話かよw
「関数型言語でDBを作る」という時、 いわゆる代入や参照不透明性を持たない、 純関数的にDBをどうやって作るのか? という点が気になった。 だけどここは CleanでもHaskellでもない、 「なんとなく関数型」言語(ML)のスレだから、 そんな拘りを持ってもしょうがない、 という事か。 じゃあ、思い切ってDBは有り物使う事にして、 例えば OCamlでPostgreSQL呼び出せば済む。 終了。
ラベル低ぅ~。
情報処理二級程度の知識しか持たないのが、 関数型言語スレに粘着してるからな。 どうしようもないさ
おぃおぃ。
DB無関係? Amazon のreviewには、red-black trieとかwide-range of datastructure と書いてあるから、関数言語によるDBの内部データ構造を議論するのに役立つと 思ったんだけど。 おっしゃる通り (cue中心)なら、よく使い道がわかんないですね。
DB無関係? Amazon のreviewには、red-black trieとかwide range of data structure と書いてあるから、関数言語によるDBの内部データ構造を議論するのに役立つと 思ったんだけど。 おっしゃる通り (queue中心)なら、よく使い道がわかんないですね。
260 :
デフォルトの名無しさん :2005/05/05(木) 23:48:48
二度書き申し訳ない。 しかも良く見たら red-black treeだし・・・。
>>257 D論へのポインタありがとうございます。
目を通してみます。
以下は【ご参考】ということで
Purely Functional Data Structures by Chris Okasaki
http://www.amazon.com/exec/obidos/tg/detail/-/0521663504/ Inside This Book (learn more)
A distinctive property of functional data structures is that they are
always persistent-updating a functional data structure does not destroy
the existing version, but rather creates a new version that coexists
with the old one. Read the first page
Statistically Improbable Phrases (SIPs): (learn more)
enclosing suspension, binomial heaps, fun lookup, leftist heaps, fun cons,
unevaluated suspensions, catenable deques, sortable collections, five debits,
pairing heaps, amortized bounds, fun exec, polymorphic recursion, amortized time,
fun tail, leftist property, nested suspensions, global rebuilding, four debits, false fun,
one actual step, struct datatype, fun merge, credit invariant, let val
単に Chris Okasaki氏の本は (純関数型言語をそれ自体で実装するのに必要な、純関数型言語向けデータ構造だから) で~たべ~すぷろぐらまのような下賎の民には無関係だよ、 って逝ってるだけじゃねぇか、と
>>262 >>257 >Chris Okasakiの本は、ほとんどすべてがキューの話。
>演習問題
ほら、ここが笑うとこですよ
どうぞ。無視されますが。
>>264 もちつけ。GWが終われば夏までは平和なんだから、辛抱しる。
ちょっと興味を持ったのでOCamlの超入門だけ読んだんですが {Windows,UNIX}で日本語でGUI使えますか? 日本語の処理の事情(単にバイト列のままなのかunicodeなのか)とか GUIの事情とか書いてあるページがあれば知りたいのですが、 ぐぐってみても探し当たりませんでした。
それじゃよくわからんです。
Windowsでは使ってないので知らんが、 TclTk も Gtk+ も Gtk+2 もあるよ。 stringの実体はバイト列。unicodeにするなら camomile あたりを噛ませて変 換すればよい。
超入門で GUI に直接 attack すると玉砕するかも、、、 label とか poly-variant とかあるからねえ。 焦らずゆっくりどうぞ。
>>267 超入門だけで足りるか?
それだけで、あとはリファレンスを読んだら分かるっていうのなら問題ないが。
>>267 窓を出すだけなら一行。
let window = GWindow.window () in let _ = window#show () in GMain.Main.main ()
なんやかんや言って、みんな関数型言語ユーザーが増えるのはうれしいので、 267 は失速しない程度にがんばれ。
C++におけるSTL・BOOSTの設計思想など、関数型言語が普及する道筋はできている。
OO が流行っても Smalltalk が普及しなかった様に…
relational databaseが流行ってもdatalogが普及しなかった様に…
OOらしいOOの本格的流行は、Javaの出現以降だった様に、 メジャーでポップな関数型言語が現れないと、流行はブレークしないだろうな。 ・・・MSR発Visualなんちゃらではない事を祈るw
normal reductionが流行ってもHaskellが普及しなかった様に…
DSMが流行ってもHPFが普及しなかった様に…
マ板ができても、ム板はネタスレだらけの様に…
>>276 別に特定の言語が普及してほしいなんて思ってないよ。
肝心なのはスタイルだね。
impredicativityが流行ってもFωが普及しなかった様に…
267です。
教えていただいてありがとうございます。
先は長そうなので次はもうちょっと詳しそうな解説を探して読んでみます。
文字列はバイト列なんですね。私もString.lengthやString.getで試してみて
納得しました。
lablgtk2を入れて、
>>273 の1行だけやってみました。
エラーばっかり出て???でしたがチュートリアルを見て
gtkInit.cmoというのが必要なのがわかって、ウィンドウをおがむことができました。
文字列がただのバイト列ということは、gtkで日本語を表示させようと思うと
自分でエンコーディングを変換してやらないといけないんでしょうか。
>>282 276じゃないけど、あのブロックの独特のスタイルが普及して欲しいでつ。
ruby!!!
どっちもdebは無いんだよねぇ。
ocamlfindがなんか勝手に世界作っちゃってていけ好かないって感じ。 しかも、何か変。 ocamlfind installに一回め失敗しちゃったし、removeしようと思ってもできないし、 手動でインストール失敗したファイル消さないと、続けられなったし。 素人の俺様にも使い易いようにならないかなー。
しかも、makeしただけでインストールするなんて変態!
MLに限らず処理系特有のライブラリパッケージ管理ツールができるとみんなが不幸になる法則
mlgladeのHomeページになぜかアクセスできないんですが…
1年半くらい前の話ですまんが、mlglade 使うより、glade2 使って lablgtk2 の lablgladecc を使ったほうが楽だったよ
どうか素人で愚鈍な俺様にお知恵をお貸しください。 glade-2で作成し、 lablgladecc2 test.glade > test.ml としてソースを吐き出した後、 ocamlc -I +lablgtk2 lablgtk.cma gtkInit.cmo test.ml としたのですが、 Error while linking test.cmo: Reference to undefined global `Glade' とエラーが出てしまいます。 どうすれば解決できますか? 愚考するに、gladeモジュールをリンクしないといけないのではないかと思うのですが、コンパイラオプションに何をどう指定すれば良いのかわかりません。
lablglade.cma てのがあるみたいだから、それも一緒にリンクしないといけないんちゃう?
スレ違いかもしれませんが関連レスとして、 GTK+ではXMLから動的にウィジェッツを作るのが流行りなのですか?
>>296 ほんとですねー。READMEにちゃんと書いてありました^^;
The executable must be linked with lablglade.cma.
ML勉強して将来的にうれしいことある? と疑問に思ってる大学生なんですが・・・どうなんでしょ?
>>299 どんな将来像を思い描いているの?超エリート中学生の俺様が聞いてやるよ。
嬉しいことやりたきゃ、理工系辞めちゃえば。
理工系って趣味人だよね。
ってかお前ら今の仕事なり何なりに MLやってたことが役立ってんの?
中学生だし。 プログラミングには便利だから使っている。処理系作るのにもOCamlは便利だし、リストが楽に使えるから便利だし。
306 :
デフォルトの名無しさん :2005/05/13(金) 00:46:47
無駄の無いプログラムの指標で普通の言語を醜いと感じるためにある。 数値計算するんなら R や Scilab があるし。
小学生です。 自動定理証明器を作るのに使ってます。
>>307 そんなもんに興味持つ小学生がいるわけねーだよ
309 :
デフォルトの名無しさん :2005/05/13(金) 11:43:26
ML勉強して将来的にうれしいことある?とか受身に思わずに、 もしMLが個人的に便利、マンセー、だと思うのなら、 将来はMLを使ってうれしい環境を自ら作る! ぐらいの気概が欲しいと思われ。 欧米ではそういう奴らが大学外でも既に少数ながら出てきている。 (大学からスピンアウトした人々とか、じゃなくてね) 「強い型付けによる安全性」というフレーズはマーケティングにも 使えないことはない。 じゃあ、俺は?すいません。大学内の人です。
逆に言えば、勉強する前から嬉しいことあるか考えるような 現実派にとっては嬉しいことないかもね。 俺も以前はCやJavaとかしか使ったことなかったけど、MLを学んで世界が変わった。 とは言い過ぎか、少なくともプログラム設計の考え方は変わった。 でもMLを学んだせいでCやJavaのプログラム書くのがひどく億劫になった…。 こうなると大学出るのが辛くなるわけです。
リストが便利で高速なネイティブ吐ける処理系っていったらOCamlしかない!
type t = IntV of int;; let aa=[IntV 1, IntV 2, IntV 3];; let get_int = function IntV n -> n;; List.fold_left (fun a-> fun b->IntV(get_int(a) + get_int(b))) IntV(0) aa;; This expression has type t but is here used with type 'a -> 'b aaの要素を全て足して、IntV 6って答えを出したいのですが、どうもうまくいきません。 何がまずいのでしょうか?
>>312 リストの区切りは;ですよ
type t = IntV of int;;
let aa = [IntV 1; IntV 2; IntV 3];;
let get_int = function IntV n -> n;;
List.fold_left (fun a -> fun b -> IntV (get_int a + get_int b)) (IntV 0) aa;;
誰もが通る道だなw
MLの優位性としてあげられる、「型システムによって実行時型エラーが 存在しないことが保証される」という性質って「強く型付けされている」よりも もっと強い性質だよね。 Cだって強く型付けされている(コンパイル時に型が一意に決まる) けど、この性質は持っていない。 こういう性質(型システムがsound)のことを一般にどう呼称してるのでしょう?
好きなの選べ type safe type soundness
>>309 は「強い型付けによる安全性」って言ってるよ。
>>315 Cだと領域のサイズが同じなら、全然関係ない型の値でも型変換して代入できたりするけど、これは問題だよね。
try run() with _ -> print_string 例外の名前 という処理を行うために、例外の名前を取得したいのですが、何か関数はあるのでしょうか?
>>318 >309 「型システムによって実行時型エラーが存在しないことが保証される」という性質って
> 「強く型付けされている(Strong typed)」よりももっと強い性質だよね。
322 :
320 :2005/05/13(金) 21:10:04
解決しました。 Printexc.to_string
323 :
デフォルトの名無しさん :2005/05/13(金) 21:53:24
ML最高
ファイルから文字列を読み込みたいです。以下のものを書いてみたのですが、うまくいきません。 2行目でエラーがでるようですが、何が原因なのでしょうか? let s = ref "" let f = open_in "test.txt" in while true do s <- ref (!s ^ (input_line f)) done print_string !s
エラーの内容を書こうな
326 :
324 :2005/05/13(金) 22:03:07
エラーの内容です。お願いします。 ocaml test-openin.ml File "test-openin.ml", line 2, characters 27-29: Syntax error
さっぱりわからんが構文エラーだそうだ。
let s = ref "" let _ = let f = open_in "test.txt" in while true do s := !s ^ (input_line f) done; print_string !s がんばれ。
File "test-openin.ml", line 2, characters 27-29: Syntax error これで何をわかれというのか コンパイラ不親切すぎ いかにもフリーソフトって感じ
>>329 Emacs+tuareg-modeを導入するとエラーの箇所までジャンプしてくれて便利。
>>329 ならば是非エラーメッセージの所を書き直してくれ。
改定案を出すだけでもきっと喜ばれると思うぞ。
332 :
324 :2005/05/13(金) 22:42:22
>>328 ありがとうございます。やっと解決しました。
OCaml難しいね。 下ので、loop_recはループしてくれないのは何故でしょう? あと、例外を取った時はprint_string "end"を実行してくれるけど、 例外が生じなかったときは、それを実行してくれないのはなぜなんでしょうか? なんとなく、print_string "end"がwithのブロック内にあると認識されてるのがいけないのだと思うのですが、 ブロックを閉じるにはどうしたらよいのかも教えてもらえないでしょうか? exception Zero let randomfunc () = match (Random.int 2) with 0 -> raise Zero | _ -> print_string "ok" let rec loop_rec () = try randomfunc (); with e -> print_string "<EXCEPT>"; print_string "end"; loop_rec() let loop_while () = while true do try randomfunc (); with e -> print_string "<EXCEPT>"; print_string "end"; done let _ = loop_while() (* loop_rec () *)
let rec loop_rec () = (try randomfunc (); with e -> print_string "<EXCEPT>"); print_string "end"; loop_rec() または、 let rec loop_rec () = begin try randomfunc (); with e -> print_string "<EXCEPT>" end; : インデントを適切にしてくれるエディタを使った方がいいよ。わかりやすいから。
335 :
333 :2005/05/14(土) 02:26:23
>>334 なるほど、()で囲むか、begin-endで囲む方法があるのですね。
まだまだ知らないキーワードがありそうですね。
どうもありがとうございます。
OCamlのインデントってどうなってるの? letで下がったりする? まあいいや。
>>335 and as assert asr begin class
constraint do done downto else end
exception external false for fun function
functor if in include inherit initializer
land lazy let lor lsl lsr
lxor match method mod module mutable
new object of open or private
rec sig struct then to true
try type val virtual when while
with
↑馬鹿?
>>335 とりあえずemacsでcaml-modeを設定しる
みんなocamlのインデントルールってどうしてる? letのinの前後での改行にいつも悩んでて、どれもすわりが悪い。 あと、引数がいっぱいある関数の適用で、一行にすると長すぎる場合も。
MLで書くときはエディタの横幅を160文字にしてる。
昔、ocamlのインデントガイドラインていうドキュメントがあったんだけど、いつのまにかなくなってるな。
本物のocamlユーザはインデントをしない
短ければ >let i = ... in >... 長ければ >let i = > ... >in >... って書くかな。 自分でもいまいち納得してないんだけど。
インデントは臨機応変。 O'Caml のソースを見てもらえばわかりますが、 担当者が変われば細かい部分が変わります。 無理せず、状況に合わせて自分の見易いように するのがいいかと。
>>345 頼むからインデントの方針を統一してくれ。
お前のソースは場所によってインデントの仕方がばらばらだから、読みにくくてかなわん。
>>346 人に頼む前に自分でインデント整形フィルターを作った方が楽なのでは?
ocamlプログラマー全員にインデントの方針を統一させるよりよっぽど簡単。
346じゃないけど、インデント整形フィルターを作ろうにも、 肝心のインデントルールをどう設定したものか。
349 :
デフォルトの名無しさん :2005/05/16(月) 04:12:30
クオリティテラ高杉
おらいりーのML本って結局、出版されるの?
351 :
デフォルトの名無しさん :2005/05/16(月) 16:20:49
ところで、心底、読みたいの?
自分で読む気は全くないが、 「オライリーが本出してる言語」という紹介がしたい。
五十嵐先生のぐらい網羅的な英語での入門 or チュートリアルってありますか?
↑Objective Camlの、です。
フランス語ならあるのだが。
OCamlってすごいね
なるほど、lib/ocaml/*.mliを見ると確かに説明が入っています。 教えていただいて非常に助かりました。ありがとうございます。
>>361 module type S = の S がクリックできるんですね。
全然気がつきませんでした。
ページの見出しの「Set」がクリックできるのには気付いたのですが、
そこにあるシグネチャが情報の全てだと思っておりました。
ocamlbrowserというのも初めて知りました。
Intfというボタンで*.mliの中身を表示させられるんですね。
欲を言うとここからドキュメンテーションを抽出してウィンドウ内に表示して
くれるともっといいですね。
>>363 超燃える。
って言うか、OCaml で書かれた OS だって説明が無いと、誰もクリックしないワナ。
ほぉ、凄いね
OCamlでサウンドプログラミングがしたいのですが、そういう用途に便利なライブラリはありますか?
>>366 ねーよ。 昔、正規表現を使おうとしたとき、ライブラリがオートマトンの教科書レベルで
唖然とした記憶がある。 今は知らないが大して事情は変わらないだろう。
正規表現ライブラリはだめだめだったからサウンドライブラリなんてあるわけない。 ↑ナンダソリャー、というのはおいといて、 確かにocamlって正規表現、というか文字列操作(とくに分解)全般に弱いよね。 ocamllex/yaccや簡易パーサは仰々しすぎる。Scanfは表現力に欠ける。 Strは教科書的な正規表現しかなくて、マッチ結果の参照もめんどい。 ocaml-regexpは見た目はいいんだけどpcre必須というのがめんどい。 やっぱりocamlをスクリプトっぽく使おうという発想が間違ってるのかな。
haskellとかのライバルはどうなんだろうね
pcreが必要で、pcre-ocamlが必要で、そのためにfindlibが必要。findlib嫌い。 micmatchってocaml-regexpとどう違うの?
>>373 いまさらだけど、ocaml-regexpって Yutaka Oiwa の Regexp/OCaml の事だよね?
# 違ってたらすまん
ocaml-regexp は正規表現で match するための構文シュガー。
micmatch はスクリプトっぽいものを目指したコマンド。
The goal of Micmatch is to make text-oriented programs even easier to write, read and run
without losing the unique and powerful features of Objective Caml (OCaml).
正規表現の部分がクローズアップされがちだけど、↓みたいなこともできる。
#! /usr/bin/env micmatch
let _ =
let n = ref 0 in
Micmatch.Text.iter_lines_of_channel
(fun line ->
let code, comment =
match line with
RE (_* Lazy as code) "#" (_* as comment) -> code, comment
| code -> code, "" in
incr n;
Printf.printf "%s# %i %s\n" code !n comment)
stdin
正に ocaml をスクリプトっぽく使おうという発想だから紹介してみたんだけ
ど、お気に召さないのであれば仕方がない。
>いまさらだけど、ocaml-regexpって Yutaka Oiwa の Regexp/OCaml の事だよね? そうです。 気に入らなかったというより、新規性がわからなかっただけです。つまり、 (micmatch - Regexp/OCaml) = iter_lines_of_channelのような便利関数群 という認識でOK? 正規表現の部分は既存のものがあるのに、使い勝手も変わらなくて、 便利関数群と密接に絡んでるわけでもないのなら何で再発明したのか。 せめて構文くらいあわせりゃよかったのに。
alphaCamlって何するモノ?
378 :
デフォルトの名無しさん :2005/06/17(金) 03:52:15
OCamlのグラフィクスライブラリ使おうとすると、なんかうまくいかないんだけど (WindowsXP) 例えば # Graphics.open_graph;; Reference to undefined global `Graphics' ってなる。りゆうおしえて。
#load せよ。
なにお?
>>379 thanks
#load "graphics.cma" でなんか動いたような気分になった。
let x = e1 in let y = e2 in ... のような場合、e1とe2の評価される順序は不定ですよね? (もちろんe2がxに依存したら話は別ですが)
MLはstrictだよ
あまり用語に明るくないので、もうちょっと噛み砕いてお願いします…
e1が評価されてから、e2が評価される The let and let rec constructs bind value names locally. The construct let pattern_1 = expr_1 and ... and pattern_n = expr_n in expr evaluates expr_1 ... expr_n in some unspecified order, then matches their values against the patterns pattern_1 ... pattern_n. If the matchings succeed, expr is evaluated in the environment ... (Section 6.7 of Objective Caml manual)
>>385 痛み入ります。理解できました。
これはe1,e2に副作用がある場合にその順序を保証するためと考えてよろしいでしょうか?
e1,e2が純粋に計算で副作用がない場合、最適化により順序を入れ替えたり
特定の計算を遅らせるのは問題ないですよね?
388 :
デフォルトの名無しさん :2005/06/17(金) 20:01:32
Ocamlのグラフィクスライブラリおもしろいね。 でもさ、リファレンスポイントって言うやつ2つ出せないの? アニメーションで一点しか動かないよ。これじゃあさ。
何が面白いのかわからない
390 :
デフォルトの名無しさん :2005/06/18(土) 00:41:57
>>388 Ocmlみたいなショボイ言語じゃ無理。
素直に、Javaにすればいいだけ。
なんだかんだいったって、結局こういうところがいい加減なんだよw
所詮見かけ倒しのおフランス産か。
Javaもずいぶん偉くなったもんだな。
GraphicsLibひとつとっても、この有様w Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ Java最強、Ocamlへたれ ava最強、Ocamlへたれ
そうそう,最強だよ Dancing Queen とか Money, Money, Money とかね 岡村なんてめじゃない
こいつこの間 Lisp スレにも来てたな 無知が露呈して、総スカン喰らってたけど
来てたっけ。多分そのときは鬱陶しかったんだろうけど、忘れちゃうもんだな、荒らしが来ても。
ヒント: ignore: 'a -> unit = <fun>
>>396 2つ作れることと,1つだけを使って2つあるように見せるのとでは
まったく違うよ。
403 :
デフォルトの名無しさん :2005/06/18(土) 17:47:22
>>386 あんた英語も読めずに引用してんの?
> > let x = e1 in
> > let y = e2 in
> > ...
> > のような場合、e1とe2の評価される順序は不定ですよね?
> e1が評価されてから、e2が評価される
>
> The construct
> let pattern_1 = expr_1
> and ... and
> pattern_n = expr_n
> in expr
> evaluates expr_1 ... expr_n in some unspecified order,
> then matches their values against the patterns pattern_1 ... pattern_n
404 :
デフォルトの名無しさん :2005/06/18(土) 17:47:59
MLスレも低レベルになったもんだな
まML自体低レベルだからいんじゃね
MLは高レベルだよ
アニメーションで一点しか動かないって嘆いている人がいるのに対して Javaにうつれっていうのが精一杯なのに高レベルなのかよw
正規表現にしろ、グラフィックにしろMLはだめだめだね。
>>408 初心者が間違ってOcamlみたいなインチキ言語
で時間をつぶさないよう、警告してるだけw
ここにもキチガイが粘着してるのか。 Ocamlでグラフィックやってるフリって、、、クオリティ超タカスギ
412 :
デフォルトの名無しさん :2005/06/18(土) 18:33:55
普通Haskellやるよね。 だってMLって関数型のフリしたイカサマ言語だもん。
>>403 そこではなく
If the matchings succeed, expr is evaluated in the environment ...
を言いたいんだと思われ。
1. expr_1からexpr_nが不定の順番で評価
2. マッチング
3. 成功したらexprの評価
なので
let x = e1 in
let y = e2 in
...
ではe1はx2より前に評価される。
ありゃりゃ、よく見たら随分間抜けな質問だな
DQNな発言は控えてください
MLこそプログラム言語界のキチガイなんだけどw
キチガイに吉外呼ばわりされたMLはもうだめぽ
Haskellは無駄の塊。ただのC言語ソースジェネレータ。 MLこそ高速で美しい至高の言語。
何に価値を置くかは人の自由だけど、私の勝手な想像では、君等は勉強不足なんじゃないかな?と思う。
>MLは、確固とした理論的背景を持つ言語でありながら、 これはそうかもしれんがね、 >現実的なソフトの開発にも使用できる実用性を備えた言語です。 うえの議論でわかるように グラフィックにしろ正規表現にしろイイカゲン杉 口が滑っても実用的だなんていえないねw >また、プログラミングの初心者が最初に学習する言語としても >優れています。 ファw、MLのどこが初心者が最初に学習するのに優れてるんだよw 関数型プログラム -→初心者には意味不明、マズは手続きがただろw 型推論? -→初心者にはわけわからん、っていうか大半のプログラマにとって不要 多相型? -→初心者どころか大半のプログラマにとってわけわからんw 以上。
以上、視野の狭いJava厨の意見でした
自分=大半
………………………… き り と り せ ん …………………………
今時 Java 使いでも大半は多相型くらい理解してると思うんだが。GJ で。
>>412 >>420 >だってMLって関数型のフリしたイカサマ言語だもん。
>関数型プログラム -→初心者には意味不明、マズは手続きがただろw
どうせ荒らすなら最低限意見を統一してから荒らせよって思った。
よるするにMLってのは 理屈ではHaskellに負け 速度ではCに負け 実用性ではJavaに負け いいとこなしの中途半端言語ジャンw
………………………… き り と り せ ん ……………………………
428 :
デフォルトの名無しさん :2005/06/18(土) 20:10:06
まあ、とりあえずパターンマッチを勉強してから言いたいことを言ってくれ
まあ、実際のところ MLが誇れるものってパターンマッチングだけだからねw
C/C++とPerlぐらいしか使えなかった俺が最近ocamlを始めた訳です。 パターンマッチングだけをとってみてもSugeeeeeeeeeeeeeeeYO と思いました。 haskellもjavaも良いのかもしれないけど、俺はこの先ocamlと共に生きようと思いました。 だから、お願い。このスレ荒らさないでね。
だったらグラフィクスで2点同時に動かしてみろ世w
グラフィックス…ごめん、興味わかねーや。自分でやって。
↑imifume
オリジナル資料読め
「perl使いの人に言ったら」=「2ちゃんのperl関連スレでMLの話題で荒らしをやったら」
理屈ではHaskellの次、 速度ではCの次、 実用性ではJavaの次だったら 間違いなく現時点で最強クラスの言語だよ。 OCamlのGraphicsははっきり言ってできの悪いライブラリなので、 OCamlSDLを見てみるといいんじゃないかな。 何がやりたいのか全然わからないけど。
Graphics.open_graph で1つグラフィクスウィンドウが開くじゃないですか。 で Graphics.current_point();; で現在のreference pointの位置が返ってくるんです。 このreference pointってのを使って絵とか描くんですけど、 これ2つ以上だせないのかってことなんです。 1つしか出せないとアニメーションで1点しか動かないことになるじゃないですか それはめんどうなので4ッツくらい動かしたいわけなんですが。 どうしたらよいかというところなんです。 できるって書着込みもあったんで調べてみたんですけど。わからないので。
>1つしか出せないとアニメーションで1点しか動かないことになるじゃないですか >それはめんどう できないと思ってるのか、面倒だと思ってるだけなのか。 前者なら可能だ。順番に描いていけ。後者なら諦めろ。 OCamlのGraphicsを本気で使うやつなんかいない。
>>441 訂正
OCamlを本気で使うやつなんかいない。
荒らしはともかく、実際問題ocamlで書かれた 公開実用アプリで有名なのって何があるかな。 unisonは知ってる。
444 :
デフォルトの名無しさん :2005/06/19(日) 09:50:03
Ocamlの処理系 coq
445 :
デフォルトの名無しさん :2005/06/20(月) 19:11:27
reference_point なんか使わずに、自分のプログラムで状態を覚えたら? -- open Graphics;; type point = { mutable p : int * int; mutable v : int * int};; let create_point width height = { p = (Random.int width, Random.int height); v = (Random.int 5 - 2, Random.int 5 - 2)};; let rec create_points width height = function | 0 -> [] | n -> create_point width height :: create_points width height (n-1);; let plot_point p = plot (fst p.p) (snd p.p);; let add_vec (x1,y1) (x2,y2) = (x1+x2, y1+y2);; let update_point width height p = let (nx,ny) = add_vec p.p p.v in if nx < 0 then p.v <- (Random.int 5 + 2, snd p.v) else if nx > width then p.v <- (- (Random.int 5 + 2), snd p.v) else if ny < 0 then p.v <- (fst p.v, Random.int 5 + 2) else if ny > height then p.v <- (fst p.v, - (Random.int 5 + 2)) else p.p <- (nx,ny);; open_graph ""; auto_synchronize false; let width, height = size_x (), size_y () in let points = create_points width height 10000 in while true do clear_graph (); List.iter (fun p -> plot_point p; update_point width height p) points; synchronize (); done;;
446 :
sage :2005/06/20(月) 19:23:20
>>437 了解。なさげなのであきらめてちゃんと読みます。
パターンマッチの実装について述べた日本語文書で見たことあるのは 纓坂 智, 『型に基づくパターンマッチングコンパイル方式の構築と実装』 北陸先端科学技術大学院大学 修士論文, 2004 PDF直リンするのは気が引けるのでググって頂戴。
449 :
デフォルトの名無しさん :2005/06/21(火) 21:10:37
ocamlってわりと早いよね。C++より早いのに、どうして誰も使おうとしないんだろう??
Python並にライブラリが整備されてたら使う。
でもPythonはスクリプト言語として使うために作られた言語でしょう?
453 :
デフォルトの名無しさん :2005/06/21(火) 22:14:22
>>436 関数型言語でいうパターンマッチングって、正規表現とは異なるコンセプトなんですか。
正規表現によるパターンマッチングの対象はテキストですが、
こちらで話題になるパターンマッチングとは、どういったものなのでしょうか。
他言語の仕様では実現されていない機能なのでしょうか?
説明を聞いてみたいのですが・・
>>452 だから何?
ocamlってコンパイル言語界のRubyだと思う。
言語仕様の信者はいるが、普及も中途半端。ライブラリも中途半端。
関数言語界の Eiffel
>>453 Prologの単一化(ユニフィケーション)を一方通行にしたイメージ。
特にリスト操作はPrologとソックリ、だった気がする
海外では流行って…
積極的に使っていかないと。 そして、「このプログラムはMLで書かれてます」 と再生紙の様な宣伝もする。
つかあれは専門教育用プログラミング言語として流行っているだ(略 そもそも専門教育で関数言語やって奥の奥まで理解しちゃった奴を 業務命令で集めてソフトウェア開発しても いったいどれだけ人件費が^H^H^H^H^H^H^H^H船頭多くして舟、陸に(略
だからM$やGoogle、ThoughtWorksのような企業は奇跡的なんだよな
>>459 そんだけ打つなら ^W か ^U で良いだろw
464 :
デフォルトの名無しさん :2005/06/21(火) 23:48:22
465 :
デフォルトの名無しさん :2005/06/21(火) 23:53:58
466 :
デフォルトの名無しさん :2005/06/21(火) 23:56:34
468 :
デフォルトの名無しさん :2005/06/22(水) 00:14:55
関数型言語におけるパターンマッチングの解説をしてくださった皆さん、ありがとうございます。 文章の咀嚼を試みてみます。 どうやら、正規表現よりも広い概念なんですね。 その機能を有効に用いる場面とは、どのような事例が考えられるのでしょうか。
C で言うと、case 文の超強力版?
470 :
デフォルトの名無しさん :2005/06/22(水) 00:26:17
>>468 というか、正規表現による文字列のマッチングとは基本的に無関係。
よく使うのは……というかOCamlでプログラム書いたらほとんどパターンマッチだからな。
一番良く使うのはリストの空リスト/空でないの場合分けと先頭の取り出しや、
バリアント型の種類による場合分けとかかね。
と説明しても多分理解できないだろうから、理解したければ書いてみてください、としか言いようがないが…
>>454 関数型言語からオブジェクト指向言語にアプローチしたのがOcaml
オブジェクト指向言語から関数型言語の考え方を取り込んだRuby
どちらも共通しているのは道具としては優れてるが何に使うのか目的がない。
個人的には高速性を生かしてWindowsAPIラップしまくって
軽量級アプリケーションを作ることに特化すればまだ生き残れるのではないかと思う。
C++とC#の間のニッチを狙うことになるけどね
………………………… き り す て …………………………
結局、ライブラリそろったもん勝ちだろ そのためには、ユーザーが多くいなきゃならんが マイナーだから拍車をかけるかな
………………………… き り す て …………………………
>>471 OCamlのオブジェクト指向の機能はオマケだよ。
そうだね 全く必要ない 結局あれだろ? 名前空間がツリー構造にでもなってて、 object.methodみたいな呼び出しができれば、 それがオブジェクト指向かどうかは問わないんだよ
関数型だとObject思考はオマケになりがちですが、 その理由は透明参照性ですか。 それとも、構造に汎用性もないし駄目ポってことですか。
>>477 > 関数型だとObject思考はオマケになりがちですが、
この発言は関数型言語を広く知ってないと出来ないが、
> その理由は透明参照性ですか。
これを見るとその知識(not 知恵)に疑問符がつく。
猿の相手する必要ナッシング
>>477 メジャーなオブジェクト指向表現ではフィールド変数をメソッド関数で操作するよね。
その操作自体が副作用だからだよ。
だから透明参照性を保つためかってこと。 逆の事言ってんだからわかるだろ。
オブジェクト指向設計の場合何があるかを最初に考えるけど、関数型の場合は何を何にするか(具体的な値の計算方法ではなく、入力と出力の型がどうなるか)を考えるからかなぁ。 2つは別ものじゃない気もするが、なんとなく、考え方が違うような。
>>481 レコード型で解釈するんじゃなかったっけ、
オブジェクト指向計算の理論では
>>481 関数型ベースでなくてもimmutableなオブジェクトを扱えるOOPLなんて
掃いて捨てるほどありますが、何か?
>>485 immutableなオブジェクトを扱えるかどうかではなくて、immutableなオブジェクトだけかどうかが問題なのでは。
>>486 わざわざimmutableなオブジェクトを作れるようになっているぐらいだから、
副作用の有無はオブジェクト指向の本質ではないということ。
オブジェクト指向言語にimmutableを求めるのは筋違いだろう。 実際、SingletonやStrategy,Functorばかりの設計は、 眩暈がするほどCOBOLソックリだ
え、funtorがcobolって・・・ 詳しく(藁
典型的なcobolプログラムは、構造化された入力データ圏から出力データ圏への準同型写像 になりそうではあるな。両者を項代数とみなせばfunctorと言える。
>>490 > 典型的なcobolプログラムは、構造化された入力データ圏から出力データ圏への準同型写像
> になりそうではあるな。
・・・ならないと思われ・・・
>>487 作れるがそれは補助的なものであって、あるから本質的ではないというものではないかと。
例えばCamlは副作用のある式がそのまま書けるが副作用が無いことは関数型言語の本質ではないかというと違うわけで。本当は書きたくないが、書かざるを得ないか、書いたほうが便利だったり楽だから使っているわけで。
オブジェクト指向だって本当はオブジェクト同士のメッセージパッシングだけでやりたいけど利便性とか速度とかのためにメソッドやら静的メソッドやら実装の継承やらがあるし。
>>493 > 作れるがそれは補助的なものであって、あるから本質的ではないというものではないかと。
例えばアランケイによるオブジェクト指向の根底にある発想である、
" ... the entire thrust of its design has been to supercede the
concept of data and procedures entirely; to replace these with the
more generally useful notions of activity, communication, and
inheritance.''を素直に受け止めれば、activityに相当する部分が
手続き的であろうが関数的であろうが関係なく、計算能力と
コミュニケーション能力を持つ「実体」であればそれでよいのです。
> オブジェクト指向だって本当はオブジェクト同士のメッセージパッシングだけでやりたいけど利便性とか速度とかのためにメソッドやら静的メソッドやら実装の継承やらがあるし。
あのー、メッセージとメソッドの関係、ちゃんと整理できてます?
>>494 関数型が素直に「実体」を扱えるか、って話じゃないの。
「実体」なんてものが「activity」を持つには、変化できることが必要でしょ。
関数型の世界ってのは、実体のない関数と、永遠に変化しない値の世界。
「実体」なんて Monad の中くらいにしか存在できないんじゃない。
immutable なオブジェクトだけで何もかもを組み上げるような OO があるなら、
それは関数型でも実装できるかもしれないけど。
>>495 > 関数型の世界ってのは、実体のない関数と、永遠に変化しない値の世界。
違うだろ。状況計算。
>>494 煽るのも良いが、実装例を示す等の具体的な話が無いと議論にならないと思われ
仮想的な、関数型オブジェクト指向言語 hoge についてでも良いけど
>>495 副作用がなければactivityにならないということ?
煽り抜きで、関数型スレでそんな意見が出てくるのって、
すごく新鮮だと思った。
>>495 実体のない関数ねえ・・・
関数型言語の関数が実体でないのなら、一体何が実体なんだろう??
実態 == 状態って事じゃないの
俺ならMLで簡潔に書くんだけどね。
OOP の本質でない private 変数は廃絶だ!
#define private public でいいじゃん
若しくは全部すけすけに見えちゃう Python に乗り換えて、
Pythonで関数プログラミングをかじったら、MLへ。
んで、たくましくなった
>>502 が上の議論のばっさり切る。
変なのがしつこく粘着してるな、
506 :
デフォルトの名無しさん :2005/06/24(金) 14:56:02
OCamlでbignumを扱うにはどうすればいいですか? 1048576 * 1048576を計算したら0になってしまいました (i386)。
(* #load "nums.cma" *) open Nums num_of_int 1048576 */ num_of_int 1048576 結果を可視化するなら string_of_num。 巨大数だけなら Bit_int もあるけど、Nums は 1.演算子が定義されている、2.有理数が扱える、という点で楽。
Requirements: - OCaml version 3.04 or higher (3.06 or higher recommended), native Win32 port - Microsoft Visual C++ version 6
相変わらず低スキルなのが粘着しているな。 ビルドのやり方もわかんねぇガキは、 cygwin ming gcc版バイナリでも使ってろ
512 :
509 :2005/07/03(日) 13:23:04
Cygwin(比較的最新バージョン)+Ocaml-3.083 でocaml-win32の中にMakefileがあるのでmake打ったのですが、 Makefile:75: *** missing separator. Stop と出てしまいます。 環境が悪いのか、ビルド方法自体間違ってるのかわかりません。 よければ教えてください。
513 :
509 :2005/07/03(日) 13:24:01
追記: Binary distributions for Microsoft Windows * Self installer for the port based on the MinGW toolchain Some features require the Cygwin environment. パッケージはこれを使ってます。
>>510 が読めないのか?
コンパイルにVC++6が必須なんだよ。
そのMakefileはnmake用だ。
515 :
509 :2005/07/03(日) 14:54:02
VC++6は持ってるんですが、 具体的なビルド方法がわからない・・・orz
Visual C++ の bin/ にパスを通して nmake すればいいんじゃないかな。 INCLUDE や LIB 環境変数も適当に設定する必要があるかも。 こういうのもなんだけど、ビルドできたその先も茨の道だから それなりの問題解決能力や VC++ についての知識がないなら やめた方がいいんじゃないかな。
517 :
509 :2005/07/03(日) 16:41:13
ありがとうございます。 Cygwin上でnmakeしたところ $ nmake Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. ocamlc -ccopt /W3 -ccopt /YX -ccopt /Fpwin32.pch -ccopt /Fowin32_c obj win32_core.c gcc: /W3: No such file or directory gcc: /YX: No such file or directory gcc: /Fpwin32.pch: No such file or directory gcc: /Fowin32_core.sobj: No such file or directory In file included from win32_core.c:20: win32.h:20: warning: ignoring #pragma warning win32_core.c:661: error: `LR_VGACOLOR' undeclared here (not in a function) win32_core.c:661: error: initializer element is not constant win32_core.c:661: error: (near initialization for `load_image_options[6]') ・・・ となりました。 gcc: /W3: No such file or directory gcc: /YX: No such file or directory gcc: /Fpwin32.pch: No such file or directory gcc: /Fowin32_core.sobj: No such file or directory がエラーの原因だと思うのですが、よくわかりません。 テストプログラム動作確認までどうしてもやりたいのでよろしくお願いします。
>>517 cmd.exe上でnmakeしろ。
こういうのもなんだけど、ビルドできたその先も茨の道だから
それなりの問題解決能力や VC++ についての知識がないなら
やめた方がいいんじゃないかな。
>>517 -ccopt ~
ってのはCコンパイラに渡すオプションを指定する。
だから /W3 /YX /Fpwin32.pch /Fowin32_c ってのはCコンパイラのオプション。
でも、gccにはそんなオプションは存在しなくて、
Cygwinのgccでは / はパス区切りと認識するからそのようなエラーが出る。
結局、516, 518が言っているように、
Cygwin上ではなくて、cmd.exe上でVC++のコマンドラインコンパイラが使えるように
環境変数を適切に設定した上でnmakeしなければビルドできない。
度々ありがとうございます。 cmd.exeでVC++のbinとOcamlのbinのパスを環境変数に設定しました。 そしてnmakeすると、 CL.EXE - コンポーネントが見つかりません mspdb60.dllが見つからなかったため、このアプリケーションを開始できませんでした。 アプリケーションをインストールし直すとこの問題は解決される場合があります。 となりました。 これは、VC側の問題・・・? 今、手元にVC++6のCDがないため、明日再インストして試してみます。
521 :
509 :2005/07/03(日) 20:22:39
↑509です。
522 :
デフォルトの名無しさん :2005/07/03(日) 20:39:28
vcvars32.bat
523 :
デフォルトの名無しさん :2005/07/03(日) 21:40:38
こいつどうせ割れ物のVC++6.0とか、 ライセンスが曖昧なMSDNとか使ってて、 マニュアルに目を通した事ねぇんだろうな。 なんでこんなの相手すんの? もしMSDNのサイトライセンスがあるのなら、 ライセンス管理者か、詳しい人に聞きゃええやん(大笑
524 :
519 :2005/07/03(日) 21:51:32
> 環境変数を適切に設定した上で と言ったのに > cmd.exeでVC++のbinとOcamlのbinのパスを環境変数に設定しました。 PATHだけ設定してもな。 516が > INCLUDE や LIB 環境変数も適当に設定する必要があるかも。 って言ってるんだから、VC++ 環境変数 でぐぐるぐらいしなさいな。 とりあえず 522 が挙げてくれたキーワードでぐぐってみ。
525 :
509 :2005/07/03(日) 22:28:50
>nmake Microsoft (R) Program Maintenance Utility Version 6.00.8168.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. ocamlopt -c win32_core.ml 'ml' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 Assembler error, input left in file C:\DOCUME~1\xxxxx\LOCALS~1\Temp\ 9.asm NMAKE : fatal error U1077: 'ocamlopt' : リターン コード '0x2' Stop. test_optのmakeはなぜか上記の通り失敗しましたが、 static,dynamicのテストプログラムは動作しました。 指摘された通り、 環境変数のPath, Lib, Includeに必要と思われるパスを設定して vcvars32.batを実行したらnmakeできるようになりました。
>>526 =VC++のコマンドライン環境を知らない痛いひと
528 :
デフォルトの名無しさん :2005/07/04(月) 02:37:47
# let id x = x;; val id : 'a -> 'a = <fun> とおいて、 # id id ;; - : '_a -> '_a = <fun> としたとき、値ポリモフィズム?になってしまう理由はなんででしょうか? 本当であれば 'a -> 'a ですよね。
いみふめ
相変わらずお前の質問は、間抜け過ぎて解答しようがない&元ネタ付きだな。 哀れな奴
そんで元ねたは言わないのな
朝からファビョるな。鬱陶しい。
祈念化キコ挙げ
>>528 value polymorphismという言葉を知っているのに、
何故その理由が解らない?
取り敢えず学校で出て来てくだしあ
539 :
デフォルトの名無しさん :2005/07/04(月) 16:17:13
528です。
>>536 www.cl.cam.ac.uk/Teaching/Lectures/funprog-jrh-1996/chapter8.ps.gz
のpp.107-108のあたりを勉強しています。
アンダースコアがついた型変数がvalue polymorphismを表すということは、わかったんですが、
中身が理解できませんでした。
>>530 副作用がないということは、代入がなければ素直に'a->'aという型付けが
可能ということですか。
>>530 がはってくれたリンク先にすべて書いてあるだろ?
日本語は書けても読めないのか?
どうしてもわからんのなら明日の夜教えてやるw
541 :
sage :2005/07/04(月) 20:01:47
どこで?7号館?
明日じゃ遅いのです
学部生のプログラム演習受講者レベルで 大学名晒す厨房っぷりに萎え萎え
やれやれ また東大コンプレックスかい?w
小学生レベルの煽りだな
俺も東大ですが何か
お兄ちゃん、わたしその学校知ってるよ。 神田にあるやつだよね!
マジレスしてみる。 項を多相型として扱えるかどうかを判断することは一般的に不可能(決定不能)。 なので確実に多相型として扱える値だけを多相型として扱う、 というのがOCamlが採用しているvalue polymorphism。 もちろんこれは十分条件で、多相型として扱えるはずのものが 多相型として扱えなくなる場合がある。例えばid id。 この項は多相型として扱えるはずだが、 関数適用であり値ではないため多相型にならない。
質問ですが、 CygwinでOcamlをソースからコンパイルし、 ocaml, ocamlcは使えるのですが、 ocamlc -custom f.mlとすると、 /usr/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lcamlrun collect2: ld returned 1 exit status Error while building custom runtime system となります。 (f.mlは let func a b = a+b;;) 解決法ありませんか?
SMLにはOcamlのocamlcとかocamloptに相当するものは無いの?
>>549 環境変数OCAMLLIBがおかしくない?
Windows版のOCamlをいれると勝手に設定されるよ。
それで解決しなければocamlc -verbose -custom f.mlした結果を貼ろう。
・cygwinの開発環境パッケージ、特にbinutilsが入っていないとか、 ・gccのインストール状況が不完全で、gccが内部使用するツール(binutils)を呼び出せない といったレベルの問題だと思う。 まずはC コンパイラーが動作する事を確認汁
>>550 mltonは普通にコンパイルできるよ。
gccの内部には詳しくないが、
>>549 のエラーログを見る限り
ldはちゃんと起動してるからbinutilsが入ってないことはないだろう。
というか、libcamlrun.aを見つけられないだけじゃないのか。
>>549 もしまだ悩んでるようならocamlc -whereの結果をみせてみ。
> (省略)ld: cannot find -lcamlrun かよ!!!(変な所で改行するから ldがめっかんないつってると思った) CAMLのライブラリ(libcamlrun.aとか、libcamlrun.so)が見つけらんなかったって言ってるだけやん。 ldの -Lオプションが正しくないか、インストールが間違ってるんだろうな。 とりあえず環境変数 LD_LIBRARY_PATHに 上記ライブラリの絶対フルパスをコロン区切りで設定 bash% export LD_LIBRARY_PATH=(絶対フルパス):${LD_LIBRARY_PATH} csh% setenv LD_LIBRARY_PATH=(絶対フルパス):${LD_LIBRARY_PATH} C:\> set LD_LIBRARY_PATH=(絶対フルパス):${LD_LIBRARY_PATH} してやればいーんじゃねぇの?
>>445 なんだかわからないけど、
グラフィック画面にすごい数のポイントが行ったりきたりしてますよ。
これつかえるかもしれないんで、試してみます。どうも。
>>445 のやつはUnbound value plot_pointって出るけど何で?
let plot_point p = plot (fst p.p) (snd p.p);; とでも定義しておけ。
The external function `caml_gr_plot' is not available
>>559 #load "graphics.cma";;
445 ですが、、、 >> 557, 559 いくらなんでも自助努力が足りないんでないかい?
教えてくれる人がいるなら頼るのが正解
563 :
デフォルトの名無しさん :2005/07/15(金) 21:27:55
MLに手をだして数ヶ月。 久々にCのプログラム書くことになった。 配列処理が必要だったので、 for (int i; i < ここまでかいて、 「うわっ、やってらんね。」とMLの偉大さを知った。 マンセー房ぽいが、まじめな話、 1年くらいやったら、ループがかけなくなりそう・・・orz
配列処理が一番楽なのはfortran(90以降)だと思う。
>>563 MLだと不便なコードもあれば、Cで書かないと非効率的なコードもある。
言語は使い分けることで全体の効率がよくなる。
久々に書いたCで関数宣言に型をつけ忘れてコンパイルエラーになったことはあるな。
>>565 まあ、MLで書いた方が簡単なコード100に対して、1ぐらいはそういうコードがある
かもね。
>>567 では、MLでデバイスドライバ書いてください。
MLは文字列処理に弱いと思う。Cはその数百倍弱いけど。
>>568 ML で OS が書けるんだから、デバドラも当然書けるんじゃね
Windows のドライバを書けとかなら厳しいかもしれんが
>>570 > ML で OS が書けるんだから、デバドラも当然書けるんじゃね
ポカーン
しぃー、可哀想な人のことじっと見ちゃダメ!
>>568 世間に存在する全ソースコードは、世間に存在するドライバの
全ソースコードの100倍以上あるだろうけどね。
あたまわる。
あまりのことにひっくりかえった。なんだこりゃ。
===================== 談話解析と文章生成プログラムのテスト中です。 ときどき暴走しますが、所詮プログラムのする事で 悪意も善意も一切ありませんので。よろしく。 =====================
もうMLスレもおしまいだな。 なぜかOCaml使いが増えて、スレが賑わってきたと思ったらバカな連中ばかりで、議論の質もずいぶん下がった。 2ちゃんねるはもはや何の情報源にもなりそうにない。
よっぽどCのファンなんだろうけど、多くの場合のおいて MLの方が優れているという現実を見つめよう。 他人が馬鹿なせいにするのは簡単だけどねw
583 :
デフォルトの名無しさん :2005/07/16(土) 21:12:00
>>581 まぁ今荒らしてるバカは、
かつてはRubyスレやOOスレに居座って荒らしを続け、
最近はデザパタスレや推薦図書スレを猛烈な勢いで荒らしてるばかちんなわけだが。
つかもともと学生と教官の対話しかねぇじゃんこのスレ。
初心者練習用コードの集合って大きいなあ。
まあ、ただCよりMLが優れてるって言われただけでムキになって 大暴れするような奴よりは、このスレはレベル高いんじゃない?w
恥ずかしい奴だな その粘着力を実生活に活かせよ
>>585 誰も彼もひとまとめにするなよ。
誰に言っているのか自分でも分かっているのか?
>>572 ML で OS を書いたら、当然その OS のドライバも ML で書くようにするんじゃないの?
少なくとも、TCP 等の仮想デバイスのドライバは ML で書くんじゃないかね
良く知らんけど、LispM 用のドライバは Lisp で書かれてないの?
唐突に質問ですが、 type 'a set = 'a list; fun f ((r,a) : (''a * ''b) set * ''a) = case r of [] => [] : ''b set | ((a1,b1)::tail) => if a1=a then b1::f (tail,a) else f (tail,a); で、 f: (''a * ''b) set * ''a -> ''b set にしたいのですが、 なぜか f: (''a * ''b) set * ''a -> ''b list [] => [] : ''b set で型指定してるのになぜ・・・?
自己解決しました。 type 'a set = 'a list; fun f (([],a) : (''a * ''b) set * ''a) = [] : ''b set | f ((a1,b1)::tail, a) = if a1=a then b1::f (tail,a) else f (tail,a); なぜ589だと''b listってなるんだろう
591 :
デフォルトの名無しさん :2005/07/17(日) 04:14:39
>>588 > ML で OS を書いたら、当然その OS のドライバも ML で書くようにするんじゃないの?
それが正しければ、ML以外で書かれたOSは当然ML以外で書くんだろうな。
ほんとアフォ丸出し。さっさと消えれば?
592 :
デフォルトの名無しさん :2005/07/17(日) 04:15:17
>>591 > それが正しければ、ML以外で書かれたOSは当然ML以外で書くんだろうな。
OSのデバイスドライバは、な。
MLでOSを書いた場合、GCはOSに必要でしょうか
C で書かれた UNIX のデバイスドライバは、C で書かれる事が多いと思うけど?
Cで書いた方がいいプログラム ・Cで書かれたUNIXなどのデバイスドライバ 以上
問題があるとすれば、588のどこがアホ丸出しなのか さっぱりわからないということぐらいかな。
600 :
デフォルトの名無しさん :2005/07/17(日) 06:00:54
>>599 588が572への反論として成立するためには
(1) ほとんどのOSがMLで記述されている、または
(2) ML以外で実装されているOSのデバイスドライバを記述するのにMLが向いている
のいずれかが成立していなければならないが、
(1)は呆らかに成立しないし、(2)は591にある通り588自身の主張に矛盾する。
以上により588はマヌケな粘着バカであることが証明された。
夏ですなぁ。
>>600 >(1) ほとんどのOSがMLで記述されている、または
>(2) ML以外で実装されているOSのデバイスドライバを記述するのにMLが向いている
>のいずれかが成立していなければならないが、
この前提が間違い。
もともと588は
>では、MLでデバイスドライバ書いてください。
に対する反論であったはず。
MLで書いたOSのデバイスドライバなら書けることを示すだけで十分。
なお、 >では、MLでデバイスドライバ書いてください が >まあ、MLで書いた方が簡単なコード100に対して、 >1ぐらいはそういうコードがある >かもね。 の反論として成立するためには、 (1)デバイスドライバなるものが全てのソースコードのうちの1/101より 大きな割合を占めていること が成立していなければならないが、 (1)は呆らかに成立しない。 以上により568はマヌケな粘着バカであることが証明された。
604 :
デフォルトの名無しさん :2005/07/17(日) 08:20:38
>>602 > >では、MLでデバイスドライバ書いてください。
>
> に対する反論であったはず。
> MLで書いたOSのデバイスドライバなら書けることを示すだけで十分。
・・・あんた、本物の認知症患者だね。working memoryが少なすぎ。
605 :
デフォルトの名無しさん :2005/07/17(日) 08:22:38
>>603 MLに向かない色々な領域の例としてデバドラが出てきたのに
どうしてデバドラだけで1%以上にならなければ反論として成立しないのか、
ほんと精神病患者の考えることは理解できんよ。
頭悪杉
ドライバについて知らないだけかと思ったら、それ以前かよ...
デバイスドライバが全体の1/100より大きくなければ568は反論になってないだろウンコ頭
どっちの夏厨もOSもドライバも書いたことねーよ
OSはともかく、ドライバくらいは書けるだろ
デバイスドライバなんて俺にとってはどうでもいいことだけは確かだ。
611 :
デフォルトの名無しさん :2005/07/17(日) 10:00:09
>>607 「世界の人口のうち日本人以外は95%以下」という主張をして、
「違うというのなら具体的な証拠を挙げろ」と言う香具師がいたとする。
そいつに対する反論として「まず中国人がいるだろ、、、」と列挙しはじめたら
「中国人が日本人の20倍いるってのかよ?
20倍いなければ反論になってないだろ」とか言い出して暴れてるようなもんだ。
ほんとお目出たい人間のゴミだな。
>>611 中国人が20倍いなきゃ、中国人だけでは確かに反論になってないだろ。
まあその例だと、あとはインド人とアメリカ人あたりを挙げれば
十分だがな。
======================== 頭悪いのが粘着して自作自演中。全部スルーでよろし。 ========================
>613 自演オツ
MLコア自身をMLで書けないのにOS作れるんですか?
>>615 >MLコア自身をMLで書けないのにOS作れるんですか?
不可能って訳じゃないよ。面倒くさいから誰もやらないだけで。
プログラムをどの言語で書いてもどうせCPUとこでは機械語になってんだから細かいことは気にしなさんな。プログラム言語は書いてて楽しければ良いんだよ楽しければ。 MLでOS書いて楽しいならとっても結構なことだと思う。俺はやらんけど。 え、仕事?C/C++/Java/C#.....いろいろあるから好きなの使って書いとけ!
>>617 MLって何の略か知ってる?このスレにいるんだから知ってて当然だよね?
何でおかしな奴がこんなに湧いてんの? それとも一人なのか?
>>619 例えば、シグナルハンドリングとか GC とかネイティブスレッド対応とか FFI とかを
ML のみで書くのは面倒くさくないのかね?
FFI がコアかどうかは異論もあるだろうから、GC だけでも良いけど。メモリ管理が
コアじゃないって事は無いよね?
>>619 じゃないが、そんなもん面倒に決まってんだろう。
Cで書いてもそんなに簡単だとは思わないが。
今Cを使うと楽なのは、機械語、アセンブリ、他低レベルな言語いろいろを経て
蓄積された過去の資産が生かせる状況だろう。
Cがそういう地位にあるのはCの人気や魅力によるものなのかもしれないが、
資産自体がCの潜在的な能力というわけではない。
って、何の議論をしてるのかよくわかってないんだけどね。
的はずれだったら無視して。
>>622 >Cで書いてもそんなに簡単だとは思わないが。
ML で書いた方が「より」簡単かって話。
>>622 >資産自体がCの潜在的な能力というわけではない。
そこだよな。言語仕様だけを比べるなら
ほぼ100% ML>>>>>>>>C
>>624 これがML厨と云われる種類のバカの一種ですか?
何が上とか下とか、どうやって決めるの?
基準は?それは客観的なのか?
「農業と工業どっちが偉い?」というのとレベルが変わらないような議論なんじゃないの?
基準は、マトモなプログラマが同等の内容のプログラムを 書くのにバグが少なく、短時間でわかりやすい コードを書けるということかな。 そして、この場に書いた意見ははほぼ主観的。 やれやれ、ここまで詳しく言ってやらないとわからないのかな。 これもゆとり教育の弊害か。
======================== 頭悪いのが粘着して自作自演中。全部スルーでよろし。 ========================
>>626 つまり、主観的である以上、他人にとっては意味のない意見だということだね。
意味の内ことを書くなよ。
>>628 読むのダルいから、トリップ付けてくれよ。
>>630 別に俺のアイデンティティなんて問題にならないような意見を並べているだけだから、名無しで十分。
>>631 分かりにくくて、ごめんな。お前のレスを読みたくないんだ。
634 :
デフォルトの名無しさん :2005/07/17(日) 22:46:03
CleanでOS作るプロジェクトの話は、本で読んだ事ある。 もう20年近く前の話。最近はOCaml同様Game用SDK作ってるみたい(藁 CleanはHaskelのMonadic I/O以前にClean I/Oつうのを作ってるから、 なんか作りやすいんかもしれないね。 あと、OS作るなら最低限でも、port I/O、絶対アドレスアクセス、アセンブラでしか弄れないようなレジスタ操作とのI/F、あとデバイス制御のためのリアルタイム性 くらいは必要なんじゃないかなぁ~。まあCでも書きにくいところはさっくりアセンブラだから問題ナッシングな気がする
LispでOS作る話は、断片的にしか読んだことないが、 ARPAネットワークのためのTCP/IPスタックが全部Lispで書かれてたとか(LMI~Symbolicsあたり)、 一つのインタプリターでマルチプロセス対応するためにいろいろ工夫があったとか(NTT ELIS WS/TAOに関するbit記事)、 etc, etc。 つかLispの場合、MacLisp実行環境としてMultics作ったり、初期のBSD UNIXもやっぱLucid Lispの実行環境だったり、 挙句の果ては専用CPU作ったりする世界だから、ねぇ。 Lisp用に計算機アーキテクチャをカスタマイズしちゃうんだから、LispでOS作れて当たり前な気が
>>628 他人の主観的意見から何かを感じとれない人にとっては
意味ないかもしれないね。
しかし、そうじゃない人もいるから意味がないとはいえないな。
はいはい。客観的に見て、いちいち荒れる対応する
>>626 が痛い。あ、自作自演なら、どっちも痛い。
判ったか?満足したら、さっさと壺に糞を詰める作業に戻れって
一応出てきてるけど、喰いつきが悪いだけ
>>636 主観的意見とは、信用がない人間の意見だとまったく無意味。
一名無しだったら、信用は半々だろうけど、その分必要なのは統計的なデータ。
何の根拠もなく感想を述べているだけでは、釣りとも本気とも判断が付かない。
そして、判断するのは他人の自由だ、と責任を他人に押しつけることが、すでに釣りである可能性も示唆している。
おまえら名無しに依存しすぎ こういう議論は匿名でやってもすぐうやむやになるから 会員制の掲示板でやろうぜ
>責任の押し付け ワラタ やばいこいつw
>>639 OS のソースツリーを見ると、C と ASM と ML のミックスチュアみたいだね。
デバイスドライバは ML で書いてあるね。
話題になっていないという事は、誰も試してないのかな。
そりゃ誰も試さんだろ MLでプログラムを作ることは魅力的でも MLで作ったプログラムはそうではないからな それがMLが普及しない理由だろうし
そんなもんかね。 これが SML か Lisp だったら、qemu の中で飼うくらいはするんだけど。
>>643 情報が正確でないから判断を押しつける、委ねる、どっちでもいいが、のだろう。
え、 qemuて実質x86とppcしかサポトしてますが
そうですか。。
つまり、641が言いたいのはこういうことか? 統計データがない場合は、名無しさんの信用は半々で、 判断は読者にゆだねられる。 その場合、釣りである可能性を示唆している←(ワラ ・・・で?
なんだ、Ocaml のOSか。さもありなん。 Ocamlはある面、Cの代替と成り得る実用MLを目指してたから、 そーゆー展開もありだろう
でもGCとか、低レベルな用途には余計な機能が入ってるよ デバドラなんか動かしたら不安定なんじゃ LISPマシンはどうだったんだろーね
657 :
デフォルトの名無しさん :2005/07/18(月) 06:56:36
16KのROMに入らなければならないような組み込み制御には全く向かないね。 あとハードなリアルタイムもC等のほうがやりやすいだろうな。 結局、ほとんどどんなプログラムでもMLのほうがつくりやすいと言ってる人は 自分の回りしか見ていない、つまり、元々ML関係に持ち込まれる話の中でしか 考えていない大馬鹿者ということだ。
そんなのはその部分だけアセンブリで書けばいいだけ というよりハードワイヤかすればいいだけ。 本質的にソフトウエアな部分はMLで書けば良い。
まあMLを知ったばかりで浮かれているのでしょう。 そういう魅力はある。 かなづちを持った人間にはすべてが釘に見える。
>本質的にソフトウエアな部分 >本質的にソフトウエアな部分 >本質的にソフトウエアな部分
661 :
デフォルトの名無しさん :2005/07/18(月) 08:57:34
>>658 > 本質的にソフトウエアな部分はMLで書けば良い。
結局、
>>657 の言う通り、自分の周りだけを見て「本質的にソフトウェア」とか言ってる
のが丸わかりなのが痛すぎるわけだが、君は自覚しているか?
ねぇ、それって詭弁のガイドラインの何番目? ホント議論展開が稚拙だね。
デバイスドライバが出てくるところまで読んだ
詭弁のガイドライン持ち出して回避しようとする方が稚拙な気が しかも何番目とか言ってるし
>>657 ROMが少ないならROMを増やせばよい。
RAMが少ないならRAMを増やせば良い。
処理速度が遅いなら処理速度をあげればよい。
コーディングの便利さと実行効率とは無関係。
別の議論だよ。
666 :
デフォルトの名無しさん :2005/07/18(月) 12:25:35
>>665 > ROMが少ないならROMを増やせばよい。
> RAMが少ないならRAMを増やせば良い。
> 処理速度が遅いなら処理速度をあげればよい。
爆笑!!おもしろい白痴だな、おまえ。
667 :
デフォルトの名無しさん :2005/07/18(月) 12:58:56
668 :
デフォルトの名無しさん :2005/07/18(月) 12:59:49
【議論の流れ 2/2】
>>634-635 他の関数型言語(Clean, Lisp)によるOS実装の話題
>>639 、
>>644-646 、
>>654-655 >>363 リンク先にOCaml OS実装がある事の指摘と、関連する話題
>>656 LispOSと、LegoによるLisp実装に関する貴重な話題の提供
>>657 二番目のDQN発言「16KのROMに入らなければならないような組み込み制御には全く向かないね。」
話題ずらしまくって、人に迷惑かけんなよ。
16KのROMに入るOSなんて、リアルタイムOSカーネルの事だろ?
そんな話、このスレの流れでは誰も興味持ってねぇんだよバーカ
関連無いこと言い出して議論を荒らすというのは、詭弁のガイドラインに載っている有名な荒らしパターンなんだよ、
このスットコドッコイ
>667-668 あいかわらずの粘着だな
>>668 > 16KのROMに入るOSなんて、リアルタイムOSカーネルの事だろ?
> そんな話、このスレの流れでは誰も興味持ってねぇんだよバーカ
なるほど、
>>657 の言う通りなわけだ。かなりトホホな奴だな。
あーあ。またバカがスレのレベルをズリ下げてる。 おまえのゴタクなんて誰も聞きたかねぇんだよゴミクズ。 関数言語自体の話題か、関数言語を使った実装(OS, アプリ)の話題以外 書き込むなよ
>>671 そうだな。
MLでできないことがあったなら、具体的に言ってもらわないと対処法も何も出るわけがないのにね。
MLを何か作るための言語にしようとしているのは、主にOCamlの連中。 もし何か決定的な欠落とか、欲しい情報があるのなら、IRCAMの開発者とコミュニケーションするよろし。
674 :
デフォルトの名無しさん :2005/07/18(月) 13:24:28
できないこと?いつから、できる/できないの話になったんだ?
自演の上に捏造かい。ほんと馬鹿の考えることは馬鹿だな。
で、おまえは
>>565 に反論あるのか?
From: [565] デフォルトの名無しさん <sage>
Date: 2005/07/15(金) 22:20:35
>>563 MLだと不便なコードもあれば、Cで書かないと非効率的なコードもある。
言語は使い分けることで全体の効率がよくなる。
________________________________________
From: [567] デフォルトの名無しさん <sage>
Date: 2005/07/16(土) 05:04:22
>>565 まあ、MLで書いた方が簡単なコード100に対して、1ぐらいはそういうコードがある
かもね。
===============
DQN
>>674 粘着中。スルーするがよろし。
===============
16KのOSの話なんてどこに出ているんだろ?
>>676 さあ・・・よくわからんが、例のアホにはそういう話が見えているみたい。
まあソフトウェア全体に対する組み込みのシェアは、 本数ベースなら確実に1%以上なことは間違いないな。
組み込みは本質的にソフトウエアな部分じゃないんだよ
MLだと不便なのは、ドキュメントや処理系の選択肢が少ないことだろうな 結局誰も使ってないし
ドキュメントも処理系も本質的にソフトウェアな部分じゃないYO
そういう非本質的なところが、常に勝敗を分けてるのがこの世界だろ
っていうかOSすら作れない言語って一体・・・(pgr
OSは本質的にソフトウエアな部分じゃない
組み込みでも、OSでも、ドライバでもMLの方がいいだろうな。 環境さえ存在するという条件なら。
>> 673 なんで IRCAM (フランス国立音響研究所) が出てくるかな?
BLASなしで行列演算やりたくないよな。
ところで、ML の小さい実装(サブセットでも)ってありますか? Scheme は C で 1000 行程度の実装があったりしますが、ML は見かけた事がないので。
はっきり言ってほとんどなんにもないけどな。MinCaml。
>>689 thanx.
MLer はやっぱり ML で書くのか。
>>686 この前のフランスの行政改革で、INRIAはIRCAMに統合されたってゆってた(嘘800
こうなったら、MLでOS作るしかないでしょ。 オープンソースで。 2chMLOS
IntelCPUでLinuxもどきのOSをMLで作るとしたら、 どうすればいいんだろう。 ブートローダはアセンブラでかくとして あとはMLコードを適切なバイナリで出力できるコンパイラ、リンカが 必要になるのか。
このスレには実は俺以外一人しかいない予感
>>694 特権レベル変更とか、preemptiveなコンテキストスイッチとか、面倒なのが色々あるね。
1 floppy bsd/linux みたいなノリかな。
とりあえず、1 floppy ・ブートローダ(アセンブラ)←ここでプロテクトモードに以降。カーネル先頭にJUMP。 ・カーネル 割り込み処理 (キーボード入力) メモリ管理(ページングなしのフラットモデル) ビデオメモリ直描画ルーティーン スレッド2つ生成してタスクディスパッチ実験 とりあえずここまでできないかな。
適当にOSスレのパクればいいじゃん。 その前にMLで書く意義を見つけたいとこだけど。
やっぱりOS書くとなると状態を扱うことが多いので、 MLでは副作用をおこす処理が必要でどうなんかなと思うことも。 あと、MLではbit単位のデータ構造扱うことできたっけ・・・?
val _ = __asm (...) みたいなのが必要?
どうせgcc入るんだしMLで書くとか奇想天外なことされても迷惑なだけだよ
例えば特権周りってトリッキーな部分が多いんだよ。 例えばプロセッサがx86の場合には、カーネルモードからユーザモードに 移行する命令がない。だからLinuxなんかでは、スタックフレームを直接 イジって、特権割り込みからのIRETを偽装してユーザモードに「復帰」することで initをユーザモードで実行する。これをMLでどう実装するか。 あとシステムコールもユーザモードからカーネルモードに移行するのを 割り込みとして処理するのが一般的だけど、その辺のプロセッサレベルの 割り込みをMLでどう実装するのか、結構面倒だと思うぞ。
>>702 よし、それじゃML.NETみたく、
gccフロントエンド版Ocaml作ってgccと相互呼び出しできるようにする所から・・・
つかさぁ、ML系言語でOS書く事にどんな目的を持ってるの?
例えば今までやりにくかった事が、MLで書く事でこんなに綺麗にスマートにすっきり書ける、とか、
MLの機能を使う事で、OS上にどういった概念を持ち込めるとか、
そーゆー餅ベーションが見えん・・・
餅のないテーマは長続きしないよ・・・。
707 :
705 :2005/07/19(火) 20:30:45
まぁ俺は、直近では
>>705 しか書いていないわけだが
まぁ俺は、直近では
>>708 しか書いていないわけだが
MLで書いたOSのメリット ・バグが少ない ・開発効率が良い ・標準開発環境にSML,OCAMLを採用し、アプリの開発環境も充実 (APIは勿論MLインタフェイス) ・これまで数多くのOSプロジェクトが出てきたがそれらとの差別化を図ることができる。 ・MLでOSかくという行為自体が楽しい
何処まで行っても ML or ASM っていうのは気持ち良いかもしれない。 C の ABI とか考えなくて良いし。
動的なバグだらけだったりして。
712 :
デフォルトの名無しさん :2005/07/19(火) 23:01:07
>>705 > つかさぁ、ML系言語でOS書く事にどんな目的を持ってるの?
ML万能厨のオナニー。
今まったく関係ないけどEXEファイルを展開できるソフトって何だっけ?
Miranda だっけ? OS 作ろうとしてたのは 自分の好きな言語で閉じた環境を作るのは プログラマーのロマンだと思ってたけど
おれは実行ファイル等の出力にしか興味ないが
>>716 インタプリタでOS書くのかYO
それともMirandaの処理系をOS無しで直接IPLからロードして立ち上げる話?
だったらそんなのはロマンでも何でもなくて、一昔前は皆やってたことだ。
MLOSはMLerのためのOSなんだよ。
過去の遺産は受け入れん。 MLOSできたのはいいものの、アプリが少ないからといってC-Lib使えるように、 C-Interface作る・・・とか本末転倒なことはしない。
とりあえずは、 ・MLでのOS基本設計 ・実行形式の定義 ・etc... まずは、2chブラウザ作りたい・・・。
命名:MLOS = PureMLOS MLのコード、それをコンパイルしたオブジェクト、実行形式 それ以外のものはPureMLOSには存在しない。
テキストファイル、画像ファイルなどは除く。
XMLML
726 :
デフォルトの名無しさん :2005/07/20(水) 20:38:46
申し訳ありませんが、教えていただきたいのですが、 MLを勉強したいのですがそのためによい本とかありますか? 教えてください。お願いいたします。
>>726 これを読んでおけば間違いない。
Milner, Tofte, Harper and Macqueen. The Definition of Standard ML, MITPress
>>726 関数型言語そのものを勉強するとともに、数理論理学などを勉強すると良い。
言語の文法自体はすぐに理解できるだろうから、なんでも良い。
○camの○×さん。悩み事があるって言うので、聞いてあげたら、「なんか、 解かんなくなっちゃった」だって。周りからは「別れる様に言われてるらしい」けど、 俺も、そいつの事聞いて、「別れなさい」って言ってやった。それなのに・・・。 俺は、お客さんだぞ。話聞いてやって、ポイント使って、散々だよな。 まあ、こんなチャトレも居るってことが、よ~~~く解かったけどね。 これからは、個人的な相談には、乗らないで、俺のペースで話しよ。 *あほな俺に、ご意見待ってます。
731 :
デフォルトの名無しさん :2005/07/21(木) 20:48:31
>>726 ML for the working programmer
733 :
デフォルトの名無しさん :2005/07/21(木) 22:52:26
PHPで2次関数の解を出すプログラムを教えてくださいm(__)m
PHPなんてゴミ言語はプライベートでみたくないんですが。
735 :
デフォルトの名無しさん :2005/07/21(木) 22:55:06
そこを何とか、お願いします。
次から次へと新しいのが来るな。
Perlでも構いませんので、どうかお願いします。
, -=ゞ'´ニニ>- 、_ /へ_,. -──‐'´ `ー─ヽ、 ゝ=='´ `ヽ、`ヽ、 // / l| | \ `ヽ、`ヽ、 フ / / / / /| |l | ト、_ヽヽ \\ヽ `ヽ、__ /// / 〃 /!/`ト|ヽ |ヽl´>ミ、ヽ、 ヽヽ` `ヽ、 / l/| | / | / r'⌒` ! ヽ | ´ ヾ7/\ ト! ,ィ/ |/| /|∧ト! ! () () / l/ / \| ! / ! .| | ! ヽ ヘ `´´ , ` ̄ レ' ヽ ./ ヽ! `ヘ , --一 ''ヽ /ト 、、 ,. -‐ァ', -''7/ヽ、 | _ノ,.イ|L-‐''´ //>-、 / //rTT´ ̄ ̄ヽ`二 -''´ / /// \ヽ、 カズちゃんの童貞奪っちゃ、ダメーーッ!! / /// | | | |l / // | `ー、ヽ
---- キチガイ一名が放し飼い状態になってるな ----
740 :
デフォルトの名無しさん :2005/07/24(日) 02:47:29
>本質的にソフトウエアな部分 ワロス
OSもソフトウェアです。
742 :
デフォルトの名無しさん :2005/07/24(日) 18:16:18
ocamlc -c -custom aaa.ml aaa.obj ってやると、 aaa.obj をどうしていいかわからないって返されるんだけど c++とは連携できないの?
そんなの誰も釣られないし。 もういーから、誰かもっとタメになる話してくれよ。 MLの情報得られる場所なんて、少ないんだからさ。
世の中give & takeですよ
世の中の全てがgine & takeなわけない。 それと同数の take & giveがあるはずだ。 そこでオレは考えた。 take & escape すればいいことを。
そうなると、 give & killになりかねんな。
オレは最近気づいたことがある。 Cでプログラミングするときより、 MLでプログラミングするときのほうがストレスが少ないことに。
============================== キチガイが狂った独り言を書き込み中 ==============================
オレはC等のめんどくさい言語に愛想をつかし、 プログラミングはもうしまいと思っていたが、 MLと出会い、プログラマ魂が復活した。
============================== キチガイが狂った独り言を書き込み中 ==============================
751 :
デフォルトの名無しさん :2005/07/25(月) 20:50:49
Objective Camlのコンパイラーの使用方法について 教えて下さい。 (当方環境:windowsXP,Ocaml V3.08.3 MinGW版) ocamlc hello.ml -o hello.exe このコマンドでは問題無くexeファイルが作成され 実行も出来ましたが、native codeを 作成しようと下記コマンドを入力したら: ocamlopt hello.ml -o hello 'as' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして 認識されていません。 このようなエラーコメントが表示され コンパイル出来ません。 なお、hello.mlの中味は下記の通りです: let _ = print_string "Hello, World!\n" let _ = read_line() どのようにすればnative codeにコンパイル可能で しょうか?ご教示願います。 以上
回答略 いじょ
753 :
デフォルトの名無しさん :2005/07/25(月) 20:53:59
すいません。751です。 ocamlopt hello.ml -o hello は ocamlopt hello.ml -o hello.exeです。
世の中give & takeですよ
755 :
デフォルトの名無しさん :2005/07/25(月) 21:18:13
私は問題を提供したのですが… 回答をご提供いただけると有難いです。
MinGWがちゃんとインストールされてないだけだろ
>>756 煽りは結構です。
ちゃんとした回答を提供できる方はいませんか?
>>756 asにパス通ってないんだからその手の問題だろうな。
>>751 処理系を入れてみたというだけで、貴重なチャレンジ精神だと思います. 頑張っ
てください.
> 'as' は、内部コマンドまたは外部コマンド、
> 操作可能なプログラムまたはバッチ ファイルとして
> 認識されていません。
これは、as という GNU のアセンブラが見つからないというメッセージです.
cygwin はインストールしましたか? MinGW版 の ocaml でネイティブコードを
出力するためには cygwin が必要です.
http://www.jaist.ac.jp/~fujieda/cygwin/ cygwin をインストールしたら、コマンドプロンプトではなく、cygwin のター
ミナルでコンパイルコマンドを叩いて、再チャレンジしてみてください.
> なお、hello.mlの中味は下記の通りです:
> let _ = print_string "Hello, World!\n"
> let _ = read_line()
ちなみに余計なお世話ですが、
let _ =
print_string "Hello, World!\n";
read_line ()
;;
の方が一般的な書き方だと思います.
こんな奴までOCamlを使い出したということは… ついにOCamlがメジャーになる日がキタワァ*・゜・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜・* !!!!!
ごめん、OCaml厨が増えたのは俺のせいかも。
OcamlでOS作る妄想するより、 OcamlでHaskellとCとLISPとMaximaとRの いい所合わせしたプログラミング言語作ってくれよ。
>>762 そう言うからには、何か構想でもあるのかい?
764 :
デフォルトの名無しさん :2005/07/26(火) 01:32:15
765 :
デフォルトの名無しさん :2005/07/26(火) 11:15:27
いやあMLのプログラムは見通しがよくて ストレスたまらんわ~~~
そうとばかりも限らない。
767 :
751です。 :2005/07/26(火) 15:16:33
>759 ご回答、有難う御座います。 cygwin の最新版をデフォルトで入れました。 1)cygwin上で下記実行。 ocamlopt hello.ml -o hello.exe が、状況は変化なし。 2)そこでcygwinのocamlをダウンロードして cygwin上で実行してみました。 $ ocamlopt hello.ml -o hello.exe C:\Program Files\Objective Caml\lib/libasmrun.a(io.o): io.c:(.text+0x209): undefined reference to `__errno' C:\Program Files\Objective Caml\lib/libasmrun.a(io.o): io.c:(.text+0x213): undefined reference to `__errno' ずらずらと、このようなエラーメッセージが続き 最後は Error during linking で終わっております。 3)ならば、とDOSプロンプトでやってみました。 'as'が見当たらないそうです…状況は1)と同じ。 どうも上記2)が最も正解に近そうですが MinGW版Ocaml+cygwin版Ocamlでダブっているような 気もします。ただcygwin版Ocamlだけではnative codeの コンパイルは出来ないと、マニュアルには書いて ある??? win用native codeのコンパイルに成功した経験の ある方、ご教示下さい。 以上
768 :
751です。 :2005/07/26(火) 15:23:22
なお、 >755 >757 は751ではありませんので念の為。 >753 は間違いなく751です。 って、まあ証明のしようもないのですが…
as がねーってんだから as がねーんでしょう。 それをチェックしてから書き込んでますか? もし、caml 初心者なら、始めのうちは、バイトコードコンパイラで十分です。 なんで、みんなネイティブに突っ走って教えて君モードになるのか…
C++のオブジェクトファイル.objだとOcamlc派認識しないのかよってきいてるだろ? それともやっぱり で き な い の か w
771 :
770 :2005/07/26(火) 18:34:34
おれもOCamlOptは cannot find file libassmrun.a って出て動きません。
>>767 ・as --versionでasが入ってるか確認。
・ocamlopt -whereで意図したocamloptが起動してるか確認。
・cygwin版ocamlを使うときは環境変数OCAMLLIBを消す。(当然nativeにはならない)
確かにここははまりやすいね。
>>770 MSVC版使ってるか?
あれだけの情報じゃ特にどうしろとは言ってやれないが、答えは「可能」だ。
773 :
770 :2005/07/26(火) 19:02:33
>>772 Win版ってことですか…、
Visualスタジオ持ってないけど、やってみる。
Thanks
cygwin binutils (as) の使い方もワカンねぇヤシがネイティブコンパイルなんて、100万秒はぇーんだよ。
一週間くらい勉強汁!
asの所在:
$ which as
/usr/bin/as
$ (cd /usr/bin; cmd /c cd)
C:\cygwin\bin
~~~~~~ これを環境変数PATHに追加しとけ(ワラ
_errnoの所在:
ふつーlibc
libasmrun.aの指定方法へのポインタ:
http://www.google.com/search?num=100&hl=ja&c2coff=1&q=libasmrun.a&lr=lang_ja libasmrun.a の検索結果のうち 日本語のページ 約 4 件中 1 - 3 件目 (0.34 秒)
今週のOCaml - PukiWiki
ocamlopt -ccopt -static collect_events.ml /usr/local/lib/ocaml/libasmrun.a(unix.
o)(.text+0x241): In function `caml_dlopen': warning: Using 'dlopen' in statically
linked applications requires at runtime the shared libraries from the ...
wiki.ocaml.jp/index.php?%BA%A3%BD%B5%A4%CEOCaml - 21k - キャッシュ - 関連ページ
778 :
デフォルトの名無しさん :2005/07/28(木) 22:32:21
質問です。 2次元配列の一部だけ変えたいときってどうしたらいいですか? 例えば、2x2配列の(1、1)だけ変えたくて以下のようにすると、 -- let a = Array.make 2 (Array.make 2 1);; print_endline ((string_of_int a.(0).(0)) ^ " " ^ (string_of_int a.(0).(1)));; print_endline ((string_of_int a.(1).(0)) ^ " " ^ (string_of_int a.(1).(1)));; Array.set a.(1) 1 2;; print_endline ((string_of_int a.(0).(0)) ^ " " ^ (string_of_int a.(0).(1)));; print_endline ((string_of_int a.(1).(0)) ^ " " ^ (string_of_int a.(1).(1)));; -- 出力が以下のようになって、(0,1)まで変わってしまいます。 -- 1 1 1 1 1 2 1 2 -- Array.setの使い方が違うのでしょうか。。。
779 :
778 :2005/07/28(木) 22:34:22
あ、上の778はOcamlです。 初心者なので他の言語との違いが分かんないですけど。 お願いします。
> let a = Array.make 2 (Array.make 2 1);; (Array.make 2 1)の結果はpointerなので、a.(0)とa.(1)は同じarrayを共有することになる。
781 :
778 :2005/07/28(木) 22:52:06
> 780 なるほど。ありがとうございます! let a = Array.make_matrix 2 2 1;; に変えたらうまくいきました。
OCamlでWindowsアプリ作ってる人いる? OCamlでメッセージ処理とかコールバックってどうやってるか教えて。
783 :
デフォルトの名無しさん :2005/07/29(金) 23:05:16
いないみたいな
784 :
デフォルトの名無しさん :2005/08/10(水) 15:46:47
ocamlのcmoファイルはバイナリのバイトコードだけど、 ニモニックのバイトコードを見るにはどうしたらいいの?
>>784 -dinstr オプションつけてコンパイルしてみ。
外してたら失礼。
OCamlおもすれーな。 関数型言語って始めてだったらかちょっと不安だったけど これならなんとかなりそう。
>>786 私も初めはOCamlがML系だということで、面白いと思って、いろいろ試しに作ってみたんだけど、
ライブラリが揃っているように見えて、内実は全く不十分だということに気づいた。
簡単な物ならOCamlでも大差は無いけれど、俗なアプリケーション製作に関していえば、
結局C++の方が楽だということに気づいた。
地震だ。でかいぞ?
790 :
デフォルトの名無しさん :2005/08/16(火) 18:29:00
OCamlで、クラス変数を外から見たいときってどうしたらいいですか? たとえば、 class a = let b = 0 in object (self) method f = b end ;; print_endline (string_of_int (new a)#f);; みたいに一回newすれば見れますけど、 もっといい方法ってないですか?
>>790 インスタンスが一つも無い状態で、クラス変数の中身を見たいって状況が理解できない。
それはもしかしたら、クラスじゃなくモジュールでやるべきことなんじゃないかと、自問してみるのをお薦めする。
あと、一つでもインスタンスがあるのなら、
let obj = new a
let get_b () = obj#f
とでもしておけば、以後いつでも get_b で中身が見れるでしょう。
793 :
790 :2005/08/16(火) 21:06:02
>> 792 他のところでインスタンスを使ってるんですけど、 意味的にクラスに変数をまとめておきたかったんです。 C++書いてるときにはよくやってたんですけど、 あんまりやらないのかな。
>>782 つ[F# + WindowsForms]
>>793 >他のところでインスタンスを使ってるんですけど、
>意味的にクラスに変数をまとめておきたかったんです。
って事は、たぶん、あるクラスの(static)変数を参照したいんだけど、それを
参照したい場所ではインスタンスへのスコープが届かないんでしょ。
module A = struct
let b = 0
class a = object
method foo = 1 + 1
end
end
とかにしとけば、
let _ =
Printf.printf "%d\n" A.b
;;
とかできますよ。
796 :
790 :2005/08/17(水) 00:20:02
>>795 なるほどー。
勉強になります。ありがとうございます。
MLのナニが疑問かって、最後の ;; が理解できない。 コード中にあったりなかったり。 どこに置くべきなのか。 C言語との対応表みたいなの誰か作らない?
自分で作れば? ;;はreplに与える式の区切りと思えば。
>>797 ;;は昔は必要だったけど今は不要な記号。なくてもいいので使わない人もいる
し、宣言が終わりだということを明示的に指示したい時に書く人もいる。
あとトップレベル(対話環境)では必須。
マニュアル 6.11.2 より。
For compatibility with toplevel phrases (chapter 9) and with Caml
Light, an optional ;; is allowed after each definition in a
structure. The ;; has no semantic meaning.
よくわかりました。 対話モード以外では意味ないのか。 BNFで解説してくれる本が手元にあるとありがたいんだけど。
andってなんですか?
>> 800 parsing/parser.mly でも見てよ。 Syntax error がある場合、 ;; があるとエラー場所をほんの少し探し易いという利点があります。
>> 801 and は相互再起な値やデータ型、クラスを定義する時に、 どれが相互再帰的に定義されているかを指定するのに使います: type t = Foo of s | Bar and s = Boo of t ただ、相互再帰でない(例えば、non recursive let)の時でも and は 使えちゃうので、and 自体の意味がわかり憎いかもしれません: type t = Foo | Bar and s = Boo of t これは type t = Foo | Bar type s = Boo of t でもよい。上は切り離せない。
804 :
デフォルトの名無しさん :2005/08/18(木) 14:13:38
MLに関して質問3つです。 1.入力履歴を使えますか?WindowsのF3みたいな。 間違った入力で失敗した後、履歴を取り出して修正できれば便利。 2.環境変数(シェル変数)をどうすれば見られますか? シェルでx=3とした後、MLに入ってxの値を取得したいのですが。 3.出力のリダイレクトはできますか? val x = 1 + 2; > ファイル名、のような感じにして "val x = 3 : int"と画面出力を取り出したい。 よろしくおねがいします。
>>804 ML 扱ったこと無いんで申し訳ないが……明らかに処理系依存かと思われ
806 :
デフォルトの名無しさん :2005/08/18(木) 14:47:56
Emacsの中で使えば1と3は解決。2は処理系依存。
おいらのEmacs 21.4はM-x run-ocamlとかできないけど、どっから拾ってくればいい? Common Lisp用のSLIME並に高機能だとなお嬉すぃ。
>>803 なる程、分かりました。有難う御座いました。
漏れはコマンドライン上で ledit を使っているが、あんまり使いやすくはないのでオススメしない。 run-ocaml なら M-p とか M-n とかで履歴を上下できる筈だけど。 あと、環境変数はともかくシェル変数はそもそもアプリに渡らないだろ。環境変数は、実用的な処理系なら普通は取れるだろうけど。 OCaml なら Sys.getenv とか。 ちょっと調べた感じでは SML では標準ライブラリの Posix.ProcEnv ができそうなので、SMLの実装(SML/NJとかmltonとかmoscow mlとか)も行けるだろうけど、使ってないから詳しくは知らん。
811 :
デフォルトの名無しさん :2005/08/20(土) 18:03:18
どうも、ObjectiveCamlのI/Oの仕組みが良く分かりません。 in_channelとかout_channelとかを使ってやるらしいことは マニュアルに書いてあるがサンプルがない。 誠に勝手なお願いで申し訳ありませんが、 例えば3教科のテスト結果が5名分test.csvに入っているのを 配列に取り出し、プログラム内で各教科の5名平均を計算し、 それをaverage.csvにOPするという、極めて簡単なサンプルを どなたか、ObjectiveCalmで書いて頂けると有り難いの ですが…。
入出力の仕組みを知るためにしちゃ余分な処理が入ったものを要求しているな。 宿題スレへ行け。
>>812 禿同。
入出力は
let ic = open_in "filename" in
...
let line = input_line ic in
...
close_in ic
つうか、こいつは、入出力のこと聞いているけど、
フィールド切り分けはできるのか?はなはだ不安。
Scanf じゃできんかもね。
csvの取り出しなら、Str.splitで十分ですな。
はたして宿題スレにOCamlわかるやつがいるかねw
で、ObjectiveCalmって何ですか?とか言ってみるテスト
>>814 クォーテーションを考えると Str.split は使えない希ガス。 ocamllex か
camlp4 だな。
818 :
811です。 :2005/08/21(日) 13:08:23
811です。質問の内容を明確にするため C言語のサンプルを下記の通り添付します。 (ObjectiveCamlの構文が良く分からないので ご参考になるかどうか…) 但し、下記のプログラムが出来ればかなり 応用が効きます。つまりObjectiveCamlに データ入力するのにExcelを利用したり、 CSV経由で他のアプリとの連携をとったりとか。 前回native code生成の質問をしたのも、この意味です。 言って見ればnative code exeとcsvファイルの操作さえ できれば、DOSのバッチファイルを経由してどんな アプリに対してもやり取りが可能になると考えた 次第です。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define INFILE "test.csv"// 入力ファイル #define OUTFILE "average.csv"// 出力ファイル #define ERR_VALUE -1// エラー値 #define ROW 10// 縦の要素数 #define COL 4// 横の要素数 int read_file(int dat[][COL]); void get_data(int dat[][COL], char *str, int i); float calc_avg(int dat[][COL], int n); int write_file(float avg[]); int main(void) { intdat[ROW][COL];// テストの点数 intret;// 戻り値 float avg[COL];// 平均点 inti;// カウンタ ret = read_file(dat); if (ret < 0) { return ERR_VALUE; } for (i = 0; i < COL; i++) { avg[i] = calc_avg(dat, i); } ret = write_file(avg); if (ret < 0) { return ERR_VALUE; } printf("処理を終了しました\n"); return 0; }
int read_file(int dat[][COL]) { FILE*fp;// ファイルポインタ charbuf[256];// 1行分のデータ inti;// インデックス fp = fopen(INFILE, "r"); if ( fp == NULL ) { printf("入力ファイルをオープンできませんでした\n"); return ERR_VALUE; } i = 0; while ( fgets(buf, 256, fp) != NULL ) { get_data(dat, buf, i); i = i + 1; } fclose(fp); return 0; } void get_data(int dat[][COL], char *str, int i) { char*token;// 次のトークンへのポインタ token = strtok(str, ","); token = strtok(NULL, ","); dat[i][0] = atoi(token); token = strtok(NULL, ","); dat[i][1] = atoi(token); token = strtok(NULL, ","); dat[i][2] = atoi(token); token = strtok(NULL, ","); dat[i][3] = atoi(token); return; }
float calc_avg(int dat[][COL], int n) { inti;// カウンタ floatsum;// 合計 floatanswer;// 平均点 sum = 0.0; for (i = 0; i < ROW; i++) { sum = sum + (float)dat[i][n]; } answer = sum / ROW; return answer; } int write_file(float avg[]) { FILE*fp;// ファイルポインタ fp = fopen(OUTFILE, "w"); if ( fp == NULL ){ printf("出力ファイルを開くことができませんでした\n"); return ERR_VALUE; } fprintf(fp, "英語,%.2f\n", avg[0]); fprintf(fp, "数学,%.2f\n", avg[1]); fprintf(fp, "物理,%.2f\n", avg[2]); fprintf(fp, "地理,%.2f\n", avg[3]); fclose(fp); return 0; }
いや、だからね、csv のフィールド切り出しとか、基本的な file i/o とか caml で出来ない人が、caml と他のアプリとの何の連携が出来るって 言うんですか? あなたは C の file i/o は出来るようだから、 caml の i/o も pervasives.mli を見ればどんな関数があって、どういう型か判るはずだし、コメントから C の 入出力関数との対比も大体判ると思います。フィールド切り出しも string.mli の関数を使えば、あなたの get_data 関数位の物なら自分で書けると思います。 とにかく、どこどこが判りませんっていうならともかく、コードよこせって 言うんじゃ夏休みの宿題厨と思われてもしょうがないし、細かく助けようがない。 取り敢えず自分で書いてみ。動かなくてもいいから。それを張り付けたら みんな喜んで添削すると思うよ。
>> 810 なんで、わざわざフランス語のリファレンス… そもそも環境変数だけだったら Unix なんぞ使わんでも Sys.getenv の方が簡単よ。 F
いいねー俺レベルでわかってないやつがやっと出始めた もっと敷居を低くしてくれ、俺は敷居がどこなんだかわかんねー cのポインタ、c++のテンプレ、javaのインターフェイス 俺の歴史の中で大物だったハードル達だ こいつは何だ!見当つかね、 俺の構築したOCamlはこれであってるのか! 皆はこれすぐ使えるようになったの?? だめだlispから出直してくる
825 :
デフォルトの名無しさん :2005/08/21(日) 18:51:57
>822 そんなに「もったい」つけないで、チョコチョコと書いてくれたって・・・。 Cでさえこの程度の行数だから、Camlであれば半分か3分の1で 済むんでしょう? どっかにあると思われるサンプルをチョコっと直して頂ければそれで 良いんですが。 素人が一からマニュアル見ながらウンウン書くのと、ベテランがチョコと 書くのとではコードROIが段違いです。
このログを例に,ゆとり教育の問題点について説明し(ry
>>818 で明確になった質問の意図とはまさしく
「OCamlでCSVを読むコードクレクレ」
だよなあ。
宿題スレとか作ってくださいスレとかが相当じゃないの。
>>825 ROIなんて投資するのが同じ人でなきゃ比較しても意味ないだろ。
同じ会社に勤めてる人が仕事で書くとかならともかく、
なんで赤の他人がお前の為にコードを書かにゃならんのか。
お前は人に書かせりゃ投資ゼロでROI無限大。書いた人はなんら得しない。
ついでにいうと自分の時間と玄人の時間の価値を同じ価値だと思うなぞ
おこがましいにも程がある。
829 :
822 :2005/08/21(日) 22:42:51
もいい、わかった。811君の純粋さには負けた。 ズバリ教えてあげるから、もう秋まで戻ってこないで。 google で ocaml csv。これだけ。じゃ、バイバイ。 (811 はこれさえしていないのか、、、)
暦の上ではもう秋だという罠
そうですな磯野さん。
磯野さん?
ヒント: google で csv get_data calc_avg
834 :
デフォルトの名無しさん :2005/08/24(水) 18:18:41
>833 >どっかにあると思われるサンプルをチョコっと直して頂ければそれで >良いんですが。 大笑い! 誰か!いい加減チョコっと直してやれよってぇ… と言ってみる。
includeっていつから使えるようになったの? moduleを取り込むやつね。openと何がちがうんだか・・・
includeって初めて知ったけど、本家のマニュアル(表記が正しければ2004年7月13日)にも記載されているな。 open との違いもちゃんと書いてあるが、 module M1 = struct include String end;; module M2 = struct open String end;; などとしてM1とM2の違いを見れば一目瞭然。
既存のモジュールを強化した新モジュールを作るときなんかに便利かな? mystring.ml: include String let my_special_function_for_string = fun ...
LLDN で ML の発表があったんだって? トラックバック読む限りでは、結構好評だったみたいじゃん。 直接聞いた人いる?
オレ聞いたよ。SMLで北陸先端大の人だから大堀先生のところの人なのかな。 ネタっぽくウケも取りつつ、割とポイントを抑えた説明になっていた気がする。 あ、ちなみに LLDN のサイトにある発表資料は、ウケ狙いの部分をぜんぶ削除 されてるね。 こんなややっこしい話を本当にしたわけじゃなくて、知らない人が聞いてもわ からないであろうところはバンバンすっ飛ばして説明してたので、逆に知らな い人でもイメージは掴みやすかったと思う。 しかしSMLでぐぐるとエロゲメーカーのサイトが出てくるとは思わなかった(笑)
>>839 あー、ウケ狙いが聞きたかった...
よさげなプレゼンでML人口が10人は増えたな。そのうち一人はエロゲーと勘違
いしている悪寒。
camlp4 の話ですが、パターンマッチングの拡張って個別にやらないとだめな んでしょうか? 例えば、 match list, queue with [], empty -> () | hd_list :: tl_list, hd_queue @:: tl_queue -> みたいな事がしたいんです。 Queue.match .. with という構文を作ってしまえば出来そうなのは分かってい ます。ところが、通常の match .. with を拡張する方法が分かりません。 もしかして FAQ?
最近 Ocaml を使い始めて試行錯誤やってるものですが、 自分で定義したクラスのインスタンス(の状態)をファイルに保存して、 次にプログラムを起動したときに元の状態に戻す方法ってありますか? シリアライズについて調べたところ、 普通に値を保存するには let f = open_out "save.dat";; output_value f "hogehoge";; close_out f;; let f = open_in "save.dat";; (input_value f : string);; でできたのですが、 文字列"hogehoge"の代わりにインスタンスをまるごと、ファイルに出力したいのです。 はじめたばかりで混乱しているところもあるかと思いますが、よろしくお願いします。
845 :
843 :2005/09/14(水) 09:40:32
>>844 ご助言、ありがとうございます。
いろいろ試した結果、Marshal 使ったらできました。
↓こんな感じです。
class person (name : string) = object
val _name = name
method get_name = _name
end;;
let p = new person "tarou";;
let f = open_out_bin "save.dat";;
Marshal.to_channel f p [Marshal.Closures];;
close_out f;;
let f = open_out_bin "save.dat";;
let p2 : person = Marshal.from_channel f;;
p2#get_name;;
- : string = "tarou"
>>843 の例でも
Pervasives.output_value は Marshal を使っているのですね。
output_value は flags リストが空だけど、
関数値を含む値を直列化するには Marshal.Closures フラグが必要ということでした。
846 :
843 :2005/09/14(水) 21:36:33
うーむ メソッドを増やしたら、失敗するようになった。 method get_name1 = _name method get_name4 = _name Exception: Invalid_argument "output_value: abstract value (outside heap)". method get_name0 = _name method get_name1 = _name ... method get_name7 = _name とかさらに無駄に追加したら成功するし。
847 :
843 :2005/09/14(水) 21:42:12
しまった、途中で送信してしまいました。すみません。 class person (name : string) = object val _name = name method get_name0 = name method get_name1 = name method get_name2 = name end;; だと、次のようなメッセージで失敗します。 Exception: Invalid_argument "output_value: abstract value (outside heap)". ところが、さらにメソッドを増やすと(method get_name7 まで計8個)うまくいきます。 いったい何がおきているやら・・・失敗するときと成功するときの違いがわからないです。 そもそも根本的にやり方が間違っているのでしょうか?
output/input_value はそもそも全く型安全では無いので非常に注意を 払って使用してください。特に関数の output はアドレス書きこみのみ ですので、output したのと、全く同じプログラムへの input 以外しか 安全性は保証されません。 いまいち何をやって問題が発生しているのか、正確にはわからないけど、 object のインスタンスもメソッドの関数アドレスを含みますから、御用心。 偶然うまくいっても、それはただの偶然です。
849 :
848 :2005/09/14(水) 23:17:59
ん?同一プログラム内での同じ型の書き込み、読み込みに失敗している? もしそうだったらそりゃ caml のバグっぽいね。
まあ、その、なんだ。 みんな OCaml とか言いながら、実は Caml の部分しか使ってない罠。 O の部分って、使わないんだよねえ。
852 :
843 :2005/09/15(木) 10:40:46
>>848 >>850 ありがとうございます。
なるほどオブジェクトの永続化はできないようですね。
偶然成功してただけか・・・・(メソッドの総数が1,2,4,8,16(2のべき乗?)の時に書き込みが成功した)
別の方法を考えてみようと思います。
>>851 いままでOOなプログラミングに浸ってたからなぁ。もう少し勉強してみます。
>>843 そのうち map やら iter やら fold やらを使いまくって、
関数合成しまくるようになってくるさ、きっと。
OO って基本的にオブジェクトの状態を変更していくから、
あまり ML では好まれない。基本的に、状態は変更されないっていうスタンスだからなあ。
大堀先生、東北大生のパワーを得てSML#の開発を早く!
855 :
デフォルトの名無しさん :2005/09/23(金) 01:11:29
SML# 意味ワカラナス
SML丼
SML++ SML Markup Language Visual SML
どれもあんまり嬉しくない。
Xavier Leroy ってなんて発音すればよいのでしょう? ザビアー レロイ?
フランスだから、「グザヴィエ・ルロア」となるのかな。
ザビエル (リ|レ)ロイ と読んでる
カタカナで無理に書けば ザビエ ルロワ が一番近い より正確にはザの前にほんのちょっとグが入っていますが、 ほとんど聞き取れません。ワの発音はアとワの中間みたいな物です。 後は l と r さえ注意すれば問題なく彼を振り向かせることが出来ます。
O先生はレロアと言っていました
865 :
デフォルトの名無しさん :2005/10/02(日) 09:01:42
datatype定義をsignature内部でやっている場合、外部からデータ構成子をはずす 関数を書くことはできますか? またそのデータ型のインスタンスを外部で構成することはできますか? つまりあるsignature~structureの中で、datatype aa = AA of int と定義されています。 このときに、内部では fun f (AA n) = n とすればデータ構成子をはずす関数が書け、 val x = AA 2; のようにすれば、そのデータ型のインスタンスを作れるわけですが、 同じようなことを外でやりたい。 signatureが適切に書かれており、structureの名をsとします。 fun f (s.AA n) = n; fun f (AA n) : s.aa -> int = n; val x = s.AA 2; val x = AA 2 : s.aa; こういう物を定義して、データ構成子の向こうのものを見たいのです。 私が質問していることからわかるように、これらの構文はいずれもうまく行きません データ構成子がついていない直積やレコードの場合は内部も見れるんですよね。 たとえば、signature~structureの中で、type ax = int * int と定義されているとき、 fun f (a, b) : s.ax -> int = a; val x = (2, 3) : s.ax などは有効です。 問題意識は伝わったでしょうか?signature~structure内部で定義されているdatatype型の データ構成子をはずした中身を見る方法、よろしくお願いします
そんなことができたら、情報隠蔽の意味が無ぇ…
ocamlしか知らないんだけど、 SMLはコンストラクタを公開できないの? できるならAAを公開すればいいだけだと思うけど。
「datatype定義をsignature内部でやっている」がよくわからんが、これじゃだめなのけ? structure s : sig datatype aa = AA of int end = struct datatype aa = AA of int end; fun f (s.AA n) = n; val x = s.AA 2;
質問です。 SML/NJで、h::t の h がリストの最初の一つを取得できるように、 リストの最後の一つを取得することは可能ですか?
871 :
デフォルトの名無しさん :2005/10/03(月) 10:42:59
>>870 取得そのものはできるけど、定数時間ではできないよ。
exception NIL_LIST; fun get_last [] = raise NIL_LIST | get_last (h::nil) = h | get_last (h::t) = get_last t;
873 :
デフォルトの名無しさん :2005/10/04(火) 16:02:13
signature sigSample = sig val f1: int -> int val f2: int -> int end; structure Sample : sigSample = struct fun f1 x = 3 + f2 x; (*<------------*) (*fun f1 x = if x = 0 then ~1 else f2 x;*) fun f2 x = x * 2; end; このプログラムを読み込むと、f2という名前が無いとの エラーメッセージが出てきます。f1とf2の順序を保ったまま、 動くようにしたいのですがどうすればいいですか? 特にf1で一般的処理、f2でエラー処理、f3でさらに・・・ というように一般から特殊へと並べたいようなときに、 いちいち全て必要な関数をそろえてからというのでは やり切れません。 signatureの中でちゃんと型は定義してあるのに、 だめなのでしょうか?
874 :
デフォルトの名無しさん :2005/10/04(火) 16:24:08
fun f1 s = (case s of "aaa" => ~ | "bbb" => ~ (*| _ => f2 s*) ); fun f2 s = (case s of "ccc" => ~ | "ddd" => ~ (*| _ => f3 s*) ); こういう部分分岐の条件を集めて、 まずf1を適用し、マッチしなければf2、次いでf3、・・・ というような管理関数を作ることはできますか? (もしコメントアウトした部分を外して有効ならば、 デフォルトマッチの場合に次に行くことで実現できますが、 それは前発言に述べた別の質問になるかと思います)
876 :
デフォルトの名無しさん :2005/10/04(火) 23:49:17
(*
>>873 *)
signature sigSample = sig
val f1: int -> int
val f2: int -> int
end;
structure Sample : sigSample =
struct
fun f1 x = 3 + f2 x
and f2 x = x * 2;
end;
877 :
デフォルトの名無しさん :2005/10/04(火) 23:55:11
(*
>>874 *)
fun match [f] x = f x
| match (f::fs) x = f x handle Match => match fs x;
fun f1 s = case s of
"aaa" => 1
| "bbb" => 2;
fun f2 s = case s of
"ccc" => 3
| "ddd" => 4;
val f = match [f1, f2];
- f "ddd";
val it = 4 : int
- f "eee";
uncaught exception nonexhaustive match failure
raised at: stdIn:69.14
878 :
デフォルトの名無しさん :2005/10/14(金) 16:29:11
SMLもOcamlも内部では fun f x y = x+y ↓ val f = fn x => fn y => x+y fun x y -> x+y ↓ function x -> function y -> x+y って変換されてるの?
いちいちコードを変換しているわけはないだろうが、コンパイルの結果として生成される 内部ノードだとか、最終的に生成されるバイトコードだとかは同じになるから、同じようなもの。
>>880 興味あるんで、『いい加減』じゃない説明キボン
>>880 じゃないですが、少なくともocamlの場合は
バイトコードもネイティブコードもそんな変換しませんよ。
今のアーキテクチャだと実行が遅くなりますからね。
ocamlc -dinstrやocamlopt -Sで各コードのアセンブリが読めるので、
applyやcallの回数を見てみるといいんじゃないでしょうか。
>いちいちコードを変換しているわけはないだろうが
「(面倒なのにわざわざ)いちいち変換しない」という意味だったら逆ですよ。
コンパイラ作る側としたら変換してしまった方が楽です。
よく判らんけど、
>>878 はカリー化について訊きたいんじゃないの?
複数引数の関数をどうするか? let f a b = a+b let f (a,b) = a+bとするか let f = function a -> function b -> a+bとするか ???
let f a b = a+b と let f (a,b) = a+b では fの型はそれぞれ int->int->int, int*int->int でそもそも型が違う。 MLでは多引数関数はカリー化されているから let f a b = a+b と let f = function a -> function b -> a+b は 全く同じであるといってもよい。 しかしそれでは、引数を一個適用する度にクロージャを生成するようになって 効率的ではないので、(Ocamlなどでは)複数引数が一度に適用される場合は クロージャを生成しないようにコンパイルする。
じゃあ、let f a b = a+bは、一つだけ引数とって関数返すものと、二つ引数とって足し算実行するものの二通りのコードを生成するの?
887 :
克也 :2005/10/15(土) 23:28:45
昇順にソートされたリストに対する union (論理和) を定義してみよ。 ヒント: match構文は二重の入れ子にして使ってもよい。 自分で書いてみたんですが、サッパリ上手くいきません。ご教授願います。 let rec union a b = match a with [] -> b | h::t -> match b with [] -> [] | g::r -> if h==g then union t b else h::union t b;;
>>886 生成される関数のコードは一つ。
Ocamlのバイトコードには「今実行中の関数に対する引数がスタックに積んであるか」を
判定する命令があり、それでもってクロージャを生成するか否かを実行時に判断している。
>>887 あってるのはmatch b ~の前までですな。
nilのときはtrivial、aとbそれぞれのheadが =, <, > のときはどうするか…がんがって。
>>887 課題みたいだからあまり言わないけど、そのまま突っ走っても頭がこんがらがって
良い答えは出ない希ガス。
少し引いてみて、まずは一般の union から考えてみては?
みなさんアセンブリコードやコンパイラのソース読み込んでるんですか?
891 :
デフォルトの名無しさん :2005/10/24(月) 07:41:14
シリアル化ってできますか? ちょっと計算させて作ったデータ構造などを気軽に保存したいんですけど。
892 :
デフォルトの名無しさん :2005/10/24(月) 08:46:23
自分で書くしかないかな。 serialize : 'a -> bytearray deserialize : bytearray -> 'a こんな関数書けるかな??
marshal?
Marshalモジュールありまんがな。 ファイル(チャネル)をバイナリで開いてoutput_value, input_valueで 読み書きすればよりお手軽に。 但しtype-safeでないことをゆめ忘れるな。
CAML?
897 :
デフォルトの名無しさん :2005/10/25(火) 01:18:07
Caml系のMLにしか目を向けない人が多いよね 活気をみれば仕方ないけど
>>896 >Thread間で割り込みが出来ないことを知り
詳細キボン
やっぱ一部の機関が作った言語は設計がなっとらんな。
ちなみに SML, Concurrent ML にもこのような仕組みはありません。 # Haskell はあるらしい。
ん? 設計っつーか、pthreadで実装されてないからじゃないの。 Haskellは基本的にRubyと同じuser level threadだから *Haskellの範囲内では* raise_toとかできるが、 データベースの通信のようにCレベルで実行してる間は コンテキストスイッチしないからraise_toできないはずだぞ。
Javaでもできない(やらない方がいい)んじゃなかったっけ。 昔はできたけどその後deprecatedになったような。 ちゃんと同期とってやんなさいと。
Javaでもそうなんだ。 やはり非同期例外というのは、諸刃の剣なのだろうか
>>899 データベースへの問い合わせみたいなブロックされてる処理は無理だろうけど、
それ以外ならat_exitとThread.killでキャンセルはできるじゃん。
…と思ってやってみたけど、Thread.killが"not implemented"だよ。
let loop_thread () =
at_exit (fun () -> printf "exit thrread...\n"; flush stdout);
let rec loop () =
Thread.delay 0.1;
loop ()
in
loop ()
let _ =
let a = Thread.create loop_thread () in
Thread.delay 3.0;
Thread.kill a;
Thread.delay 3.0
頑張れ、ocaml。
OCamlの"O"はお飾りなんですね。 とっちゃいば?
「とっちゃえば?」が正しい。
「とっちゃんは?」と空目したのは私だけですか、そうですか。 お飾りCaml 3.09.0 リリース、乙。
lablgtkとかでバリバリ使ってますけど
O'Caml の object の typing の癖を理解して、要所要所で使えば 使えないということは決してない。 Java とかから流れてきた人みたいに何でもクラスで書こうとすると、はまる。
911 :
デフォルトの名無しさん :2005/10/30(日) 22:59:48
>911 あんまりちゃんと見てないけど。 毎回input_lineし、それをsplitして連想配列で持っておくアルゴリズムなの で、メモリ消費が激しいように思う。GCしまくりなのかも。 それから、たぶんこれが主原因だと思うが、比較のたびにdateとtimeをアクセ スしに行っているのは非常に効率が悪い。 なので、行を読み出したときに、 date とか time の値を取り出して date 型 を作っておき、alistを(date型, 元の行)というタプルのリストとしておく、 とかでだいぶ速くなると思う。 あと、 while と破壊的代入を使いまくりなのはあんまり関数的でないですね。 # その方が速かったりするのだが
>>912 同意。
加えて、正規表現をループの度に作ってるのはイタい。これはループの外に外すべし。
let re_eq = Str.regexp "="
let re_amp = Str.regexp "&"
その他にも細かくは色々あるんだろうが、クリティカルじゃなさそうだし。
914 :
911 :2005/10/31(月) 22:24:09
>912 ご指摘有難う御座います。 タプルのリストにしたら、ちょっと早くなりました。 最初の奴が49秒で、タプルのリストにしたら、45秒になりました。 >913 ご指摘有難う御座います。 正規表現の部分をループの外に出したら、結構早くなりました。 最初の奴が49秒で、912さんに指摘していただいた修正と正規表現の部分を 外に出した奴は29秒でした。 ちなみにC#(こっちもほぼ初心者)で書いた奴だと24秒なので(Cでは10秒)、 まだ早くなると思うのですが、他にお気付きの点がありましたら 教えていただけると嬉しいです。
ocamlopt でコンパイルした?
改めて見たけど、urldecodeはかなり凄いことになっているね。Cのコードをかなりそのまま書き写している? 残るボトルネックはここだろうか。 改善案より前に一般的なOCamlのコーディングとして、 1. let _ はプログラムの main 部分以外では使われない傾向が強い。begin ~ end を使う方がいいだろう 2. urldecodestring は、通常は urldecode 内で宣言して外からは参照できないようにする方が一般的だし安全 3. 破壊的代入が無駄に多いので、コンパイラの最適化が効いていないのでは。たとえばこの関数だと c とか というところかな。 それから、いくら速いといってもCコンパイラよりは遅いよ。C#との差は知らない。 細かく知りたければ ocamlprof というプロファイラもあるから使ってみると良いかも。私は使ったことがないので細かいことはよく知りませんが。 あーとそれからもしやと思うけどバイトコードじゃないよね?
というわけでurldecodeを書き直してみました。参考になれば幸い。ちなみに手元の環境で適当なURL(ウィキペディアのトップページ)を100000回ほど実行してみたところ、 (元版) ./a.out 6.51s user 0.26s system 97% cpu 6.915 total (改善版) ./a.out 0.48s user 0.00s system 96% cpu 0.493 total で10倍以上速くなった。何が効いているかはわからないが sprintf/sscanfか、Bufferの効率が良いかどちらか。 私ならこう書く、ということで書き方も含めて参考になれば幸い(でもこの書き方がベストかどうかはわからない)。 let hex = function | '0' .. '9' as c -> Char.code c - (Char.code '0') | 'a' .. 'f' as c -> Char.code c - (Char.code 'a') + 9 | 'A' .. 'F' as c -> Char.code c - (Char.code 'A') + 9 | _ -> failwith "hex" let urldecode' str = let buf = Buffer.create (String.length str) in let rec loop n = match str.[n] with | '+' -> Buffer.add_char buf ' '; loop (n+1) | '%' -> let c1, c2 = str.[n+1], str.[n+2] in Buffer.add_char buf (Char.chr (hex c1 * 16 + hex c2)); loop (n+3) | c -> Buffer.add_char buf c; loop (n+1) in try loop 0 with _ -> Buffer.contents buf
>>914 え?タプルのリストにすれば、もっと早くなる気が。
私の環境だと元44秒が35秒まで落ちたよ。
let make_attribute ((date, time), l) attr =
let hd :: tl :: [] = Str.split (Str.regexp "=") attr in
match hd with
"date" -> ((tl, time), l)
| "time" -> ((date, tl), l)
| _ -> ((date, time), (hd, tl) :: l)
let rec get_value list name =
match list with
[] -> ""
| (key, value) :: xs ->
if (compare key name) = 0 then
value
else
get_value xs name;;
let sort_time ((_, time1), _) ((_, time2), _) =
let temp = compare time1 time2 in
if (temp = 0) then
1
else
temp;;
let print_csv csv ((date, time), list) = let _ = output_string csv (date ^ "," ^ time) in let _ = for i = 1 to 28 do output_string csv ","; output_string csv (get_value list (Printf.sprintf "flag%03d" i)) done in output_string csv "\n" let flush_today_data today_list csv = let sorted_list = List.sort sort_time today_list in List.iter (print_csv csv) sorted_list let read_day_file today csv = let today_list = ref [] in try let buf = ref "" in let decode = ref "" in while true do let _ = buf := input_line today in let _ = decode := urldecode !buf in let slist = Str.split (Str.regexp "&") !decode in let alist = List.fold_left make_attribute (("", ""), []) slist in today_list := alist::(!today_list); done; flush csv; with End_of_file -> (flush_today_data !today_list csv);;
よく見ると917のhexは+9じゃなくて+10だな。結果はちゃんと見てなかったので、そういう小さいミスはあるかも。ただ本質的には速度はそれほど変わらないはず。
921 :
911 :2005/11/01(火) 19:36:00
> 915 一応、 ocamlopt -verbose -o t01.exe unix.cmxa str.cmxa test1.ml のようにしてから、t01.exeを実行しています。 > 916 ご指摘有難う御座います。 おっしゃる通り、urldecodeはCからそのまま移植しました。 やはり、酷いコードですか。。。実を言うと、Ocamlっぽく? したかったのですが、記述方法が分からなかったのです。 また、ご指摘頂いたOcamlコーディングについても有難う御座います。 実際、上記のスクリプトを記述したときも、コンパイルを通すのがやっと でしたので、指摘頂いた事項を参考にして書き直してみようと思います。 > 917 大変参考になりました! 有難う御座います。 上述しましたが、urldecodeは上手く書けなかったのでとても参考になりました。 > 918 サンプルソース有難う御座います。 昨日の44秒ってのは、教えて頂いたタプルのリストを自分なりに実装して 実行したものだったのですが、記述して頂いたコードに置き換えて実行した ところ、オリジナルが49秒に対して39秒になりました。 昨日書いたコードは、ソート時にキーとなる値とalistのタプルのリスト にしたので、本質的には記述して頂いたコードと同じだと思うのですが、 書き方が悪くて遅かったみたいです。。。。
922 :
911 :2005/11/01(火) 19:41:29
結局、Ocamlの書き方とは余り関係ないような所なのですが、 csvファイルに出力する部分だけを、ソートや出力しやすいように リストで管理するように書き換えたところ、かなり早くなりました。 read_day_fileを以下のようにしたら、16秒になりました。 (* 日付ファイルを読み込む *) let read_day_file today_file csv = let today_list = ref [] in let rec get_today_list today_file = let buf = input_line today_file in let decode = urldecode buf in let slist = Str.split re_amp decode in (* データを属性毎に別ける. string list *) let alist = List.map make_attribute slist in (* 各属性のname=valueを[name;value]に. string list list *) let klist = List.filter fliter_key alist in (* 必要なもののみ抜き出す. string list list *) let sortlist = List.sort sort_key klist in (* アクセスしやすいようにソートする. string list list *) let vlist = List.map get_only_value sortlist in (* 値だけのリストにする。string list *) today_list := vlist::(!today_list); (get_today_list today_file) in try get_today_list today_file with End_of_file -> (flush_today_data !today_list csv);; 一応、C#(24秒)よりも早くする事が出来たので、満足してます。 後は、Ocamlというか関数型言語に慣れる事が必要ですね。。。。 いろいろ有難う御座いました!
やっぱ質問、質問者がちゃんとしてると盛り上がるな。
Thread.kill について caml-list で議論中。 除いてまえという話もあるが、便利といえば便利だしなぁ。
>>927 Gerd Stolpmann 氏が示したコードを実行したら、確かに kill っぽい事はできた。
ただし、複数のスレッドを落とそうとすると苦しい。
やっぱり"soft-kill"というのが現実的な解じゃなかろうか。
ちょっと質問です。 Ocamlは昔IBMのプログラミングコンテストで優勝して その生産性の高さを証明したと聞いています。 Ocamlの生産性の高さを説明するときに欠かせないエピソードなのですが 肝心のソースがインターネット上でも探しても見つかりません。 どなたかご存知の方は教えてもらえませんか?
> これを見てもしかして関数型言語が本格的にやばいな 日本語おかしいんちゃう?と思ってしまうオレはもうオヤジだろうか。
>>930 「もしかして」の結びがないってこと?
それとも「やばいな」のこと?
前者なら俺もそう思う。
後者ならオヤジかも知れない。
つまり「関数型言語危ないー! 逃げてー!」とかいった感じに読める、ということ?
933 :
sage :2005/11/07(月) 20:32:05
OCaml初心者です。 OCamlのソースで let a = 10 let b = 20 というように、let を and,やinや ;; で 区切らずに並べて書いてあるものを見ましたが、マニュアルを見たり検索を してもそのような文法を解説してあるところが見付からなくて、気になって 夜も眠れません。 どなたか解説or解説の紹介お願いします。
934 :
930 :2005/11/07(月) 21:06:06
>>932 そうそう、それそれ。
>>931 の言う前者も思ったけど、特に気になったのはこっちだった。
……オヤジなんだな orz
いや、意味がつかめないわけじゃないんだけど、
どうしても一瞬考えちゃうんだよな。
おれもオヤジかなあ。意味はわかったけど「やばい」はないなと思ったよ。 >933 OCamlでは文(?)を開始するためのキーワードはあるけど、終わりは明示的に指定しなくてもよいことになっている。;;は入れても入れなくてもいい。 だからその例だと、2つめの let が出現した時点でコンパイラは let a = 10 が一塊であることがわかるわけ。するとのこりの let b = 20 も取り出すことができて、めでたく a に 10、bに20を束縛できる。 確かにそういう文法の解説ってあまりないかも。
>935 ありがとうございます。謎が解けました。 勉強に励みます。
やばい、やばい。
ソフト納品したとき、若い担当者から「このプログラムやばいですよ。」 と言われた。クレームかと思って身構えて対応してたら、実は誉められていた。 という経験がある。
>>929 を読んでやばいと思ったら。みんなもやばいと思ってて安心した
ヤバイ。宇宙ヤバイ。まじでヤバイよ、マジヤバイ。 宇宙ヤバイ。 まず広い。もう広いなんてもんじゃない。超広い。 広いとかっても 「東京ドーム20個ぶんくらい?」 とか、もう、そういうレベルじゃない。 何しろ無限。スゲェ!なんか単位とか無いの。何坪とか何ヘクタールとかを超越してる。無限だし超広い。 しかも膨張してるらしい。ヤバイよ、膨張だよ。 だって普通は地球とか膨張しないじゃん。だって自分の部屋の廊下がだんだん伸びてったら困るじゃん。トイレとか超遠いとか困るっしょ。 通学路が伸びて、一年のときは徒歩10分だったのに、三年のときは自転車で二時間とか泣くっしょ。 だから地球とか膨張しない。話のわかるヤツだ。 けど宇宙はヤバイ。そんなの気にしない。膨張しまくり。最も遠くから到達する光とか観測してもよくわかんないくらい遠い。ヤバすぎ。 無限っていたけど、もしかしたら有限かもしんない。でも有限って事にすると 「じゃあ、宇宙の端の外側ってナニよ?」 って事になるし、それは誰もわからない。ヤバイ。誰にも分からないなんて凄すぎる。 あと超寒い。約1ケルビン。摂氏で言うと-272℃。ヤバイ。寒すぎ。バナナで釘打つ暇もなく死ぬ。怖い。 それに超何も無い。超ガラガラ。それに超のんびり。億年とか平気で出てくる。億年て。小学生でも言わねぇよ、最近。 なんつっても宇宙は馬力が凄い。無限とか平気だし。 うちらなんて無限とかたかだか積分計算で出てきただけで上手く扱えないから有限にしたり、fと置いてみたり、演算子使ったりするのに、 宇宙は全然平気。無限を無限のまま扱ってる。凄い。ヤバイ。 とにかく貴様ら、宇宙のヤバさをもっと知るべきだと思います。 そんなヤバイ宇宙に出て行ったハッブルとか超偉い。もっとがんばれ。超がんばれ。
最近の言い回しは 感情の動きの量と言葉の強さを一致させることのみ重視されていて、 動きのベクトルと意味との一致については割と大胆に軽んじるからな。
昔「すごい」が辿ったのと同じような用法の変化だな。 国語学的には別に珍しいことではない。
コンストラクタ同士の比較について質問です。 # type hoge = A of int | B of string;; type hoge = A of int | B of string # let a = A 10 and b = B "foo";; val a : hoge = A 10 val b : hoge = B "foo" # a < b;; - : bool = true # a > b;; - : bool = false # a = b;; - : bool = false というように、比較演算で trueやfalseが返ってきます。 同じ型だから比較演算の適用ができるのでしょうが、 その結果は定義されているのでしょうか?
944 :
943 :2005/11/08(火) 19:14:13
↑ 誤:その結果は定義されているのでしょうか? 正: その結果はどのように定義されているのでしょうか?
たしかに929の使い方はやばいよな。
>>943 こういうくだらないネタ(失礼)は好きなので、ソース見てみた。
たぶん、byterun/compare.c の compare_val 関数辺りだと思うが、
実質 int 同士、string 同士、float 同士、同じコンストラクタの値同士
くらいしか意味のある結果は返ってこないように見えるね。
>>929 程度の人間でも関数型言語のスレを覗いているってのがスゴス
いわゆるデータ型の比較では、まず構成子を比較して、構成子が同じなら中身 を比較する。 構成子の比較は型宣言の時の順序による。 ゆえに、 # type hoge = B of string | A of int;; なら、 # let a = A 10 and b = B "foo";; val a : hoge = A 10 val b : hoge = B "foo" # a < b;; - : bool = false # a > b;; - : bool = true # a = b;; - : bool = false となる。 こういうのってマニュアルのどこに書いてあるのかなあ。
int 、string 、float 以外の比較は基本的に未定義 (実装依存) じゃなかったっけ、 と思ってマニュアル探してみたけど見付からないな。 少なくとも Object に関しては > The relation < defines an unspecified but strict ordering on objets. と書いてあったんだけど。
O'Caml の実装は O'Caml しかないので、「実装依存」という部分はありません。 多分アーキテクチャ依存の部分はありますけど。variant に関する大小は 決まってます。 コンストラクタは 949 がポイントを押さえていますが、厳密には 引数の無いコンストラクタに関しては当てはまりません。 type t = A of int | B ここでは、A 1 は block、B は integer になります。この時、 # A 1 < B;; - : bool = false # A 1 > B;; - : bool = true です。
続き 引数のある(ない)コンストラクタ間の大小関係は、引数のある(ない) コンストラクタ間の定義順序で決まります。 O'Caml の大小は型に依存せず、値の内部表現のみを使って計算します。 上の例のように、int < block で、block 間の比較はまず tag を比較。 tag が同じ場合は内部を比較します。(ちなみにレコードは tag 0 の block です。) より詳しくは byterun/compare.c を見てください。極端な話、型は関係ないので、 # (Obj.repr (A 1)) = (Obj.repr (Some true));; - : bool = true ってことも出来ます。 まあ、集合をリストとして表して、ソートすることで正規化するとか言う以外、 あんまりコンストラクタ間の大小を仮定するようなプログラムは書かない方が いいけどね。 大昔の Caml はたしか、コンストラクタの大小、つまり付加される tag の値は コンストラクタ名の alphabetical order で決まっていた記憶しています。
954 :
デフォルトの名無しさん :2005/11/13(日) 18:35:23
sMLで書かれた 分解を用いた命題論理の範囲(論理結合子の推論規則のみ)での 定理証明のソースってどこかにありませんか? 作り方がさっぱりわからないので、参考にさせてもらえるといいのですが・・・。
>>954 詳しくないけど, ML for the working Programmerの10章に
述語論理の定理証明のソースがあるから,それ参考にしたら?
956 :
デフォルトの名無しさん :2005/11/15(火) 22:55:55
10章がそれでしたか・・・。 わかりました。 難しそうですが、参考にしてみます。 ありがとうございます。
sage
958 :
:2005/11/18(金) 09:25:20
Cだと enum { MONDAY = 1, TUESDAY = 5, ... } みたいに列挙に値をもたせられるよね Ocamlでも type day = MONDAY | TUESDAY ... でやれば MONDAY < TUESDAY は真だけど値は直接指定できないし・・ 次のような値の列挙を実現する方法はないですか? 1~9はA1~A9という名前で定義し、 11~19はB1~B9という名前で定義(以下同様)
列挙型に値を持たせたいってのが、すでに設計ミスじゃないの?と思わなくもないが、 (少なくとも C の enum みたいな単なる通し番号ならいらんと思う) あえてやるなら type hoge = A1 | A2 ... を作って、それをキーにした Hashtbl とか?
>>958 let A1 = 1 and A2 = 2 ...
let B1 = 11 and B2 = 12 ...
>>958 type t1 = A1 | A2 | A3
type t2 = B1 | B2 | B3
type t = A of t1 | B of t2
これらに順序を定義したいなら、compare を実装すればいいのでは?
let rec make_big_assoc l =
match l with
[] -> []
| hd :: tl -> (hd, tl) :: make_big_assoc tl
let bigs = make_big_assoc [A A1; A A2; A A3; B B1; B B2; B B3]
let compare a b =
if a = b then 0
else if List.mem b (List.assoc a bigs) then -1
else 1
let _ =
print_int (compare (B B1) (A A2))
;;
全順序じゃなく、もっと手が込んだ順序を定義したいなら、
compare を工夫すればいい。
そもそもバリアント型とC言語で言う列挙を結びつけない方が幸せかもー。
バリアント型はバリアント型なので。
>961の「そもそもバリアント型とC言語で言う列挙を結びつけない方が幸せかもー。」というのは良い言葉だと思った。 説明するときには楽ですけどね。オレは「今どのメンバの値を持ってるかがタグで識別できる共用体」と説明してるけど。 それでもたとえば、曜日や月名なんかを数値にしたい場合もあると思うが、それには 959 のように Hashtbl を作るか、 let int_of_wday = function | MON -> 1 | TUE -> 2 : という関数を作るか、というのが一般的だと思う。 ってか Calendar モジュールがまさにこれをやってる。
963 :
958 :2005/11/19(土) 10:16:11
>>959 - 962
えらく勉強になりました。有難うございます
caml 使って間もないんですが物を考えるときに
Cの頭使い?みたいなものが未だに抜けない
もっと抽象的に大枠を掴めるようになりたいっすわ
つーわけで、素直に let A1 = 1 and A2 = 2 and ...
ということにしますた
バリアント型はバリアント型か・・・
Scheme の場合、map 手続きで複数のリストを扱えますが、OCaml ではどうやって同じようなことをやるんでしょうか。イディオムというか。 Scheme: (define hoge (map (lambda (x y) (+ x y)) '(1 2 3) '(2 3 4))) => '(3 5 7) OCamlのイメージ: let hoge = List.map (fun x y -> x + y) [1; 2; 3] [2; 3; 4];; => エラー
List.map2 or GCaml
967 :
デフォルトの名無しさん :2005/11/24(木) 07:45:18
科学技術系のプログラマですが、 科学技術系のプログラム、FORTRANとかCとかみたいなやつで、 MLみたいな型推論してくれる言語ないですか?
968 :
デフォルトの名無しさん :2005/11/24(木) 08:36:55
Ocaml の signature って使ってる? これって書くの激しくめんどくない? これで外部アクセスを防ぐぐらいなら Private Method 使った方がいいように思ったんだけど
>>968 まぁ、単純にモジュール内部へのアクセス制限なら private でもいい気がす
るのには同意。
ただ、signature には型の抽象化という機能もあるし。signature と functor
の合わせ技で抽象的なモジュールの輸入という技法も使えるし。
なきゃないで困る訳よ。
caml-list より。 for i = 0 to 3 do let s = "bbbb" in s.[i] <- 'a'; Printf.printf "string s is now %s\n" s; done さて結果は?
971 :
デフォルトの名無しさん :2005/11/24(木) 21:09:13
>>967 FORTRANとかCみたいなのって何だよ。
HASKELLに比べれば十分Cみたいだよ。
アセンブラみたいなCは使わないだろwwwww
>970 最初は、let s で毎回 "bbbb" が束縛されなおすのかなぁと 思いきや引き継ぐんですね・・・ なんで?
どうして?
sは束縛され直すだろ、普通に。毎回同じオブジェクトに束縛されるだけで。
camlのfor構文てどうやって定義されてるの?
976 :
デフォルトの名無しさん :2005/11/25(金) 15:31:42
val res = ["A", "B", "C"] : string list val tmp = "result = " : string とします。 これらをつないで result = ["A", "B", "C"] と表示したいのです。 tmp ^ res は型違いのため連結できません。 > print res; というコマンドは、有効なのに。 1。 ["A", "B", "C"] の「文字列表現」を取得する方法はどうするのですか? また、文字列を表示すると、"result = ..."と引用符がついてしまいます。 2。文字列を表示するときに引用符を書かないようにする方法はありますか? よろしくおねがいします。
宿題は自(ry
print res; によって正しく表示できる処理系って何?
>> 978 G'Caml.
>>975 for はここでは関係ないよん。
string constant の問題。
G'Caml って使ったことないんだけど、OCamlベースじゃないの? 976 のコードはどう見ても SML だと思うんだが。
>>974 つまり、let束縛は4回起こるが、文字列"bbbb"の初期化(生成)は
1回しか起こらない、ってことかな。
つーかエラーにならんの? もしかしてOcamlってヤパイ?
>>983 最初っから破壊的操作なんかしなきゃ良いのさ。
って言うか、なんで OCaml の string は mutable なのかと小一時間(ry
immutableなstringって作れないの?
987 :
デフォルトの名無しさん :2005/11/26(土) 01:38:19
むり
効率上の妥協なのかな。 でもimmutableかどうか、なんて型推論に組み込めると思うけど。^^;
おいおい何でもかんでも型推論に組み込めばいいってもんじゃないんだよw
990 :
↑ :2005/11/26(土) 01:46:31
あほ。
>> 981 SML, O'Caml の違いでガタガタいわんといて。まあ、おおらかに。 なんか本題の質問からどんどん離れていくけど、 $ gcaml G'Caml version 3.09.0 # Gprint.eprint ["A"; "B"; "C"];; [ "A"; "B"; "C" ] - : unit = () まー、G'Caml は型定義情報を持ってるからプリントできて当り前なんだけど。
SMLで法政大学のpdfファイルの6-7問題の答えがわからないのですが・・・。 再帰をうまく使うんでしょうけど、 最大の高さを再帰の中でどうやって保存しておくかと、すべてのノードを調べるというのがうまくできなくて・・・。 誰かよろしくお願いします。
宿題は 自分でやろう タンジェント
>>992 俺が直感でわかった程度の問題だぞ
自分でやれ
995 :
デフォルトの名無しさん :2005/11/26(土) 20:10:01
996 :
デフォルトの名無しさん :2005/11/26(土) 21:06:01
996
997 :
デフォルトの名無しさん :2005/11/26(土) 21:06:21
997
998 :
デフォルトの名無しさん :2005/11/26(土) 21:06:42
998
ダー
1000 :
デフォルトの名無しさん :2005/11/26(土) 21:26:44
本当の通は1000より999を選ぶ。1000取って喜んでる奴はまだまだ甘ちゃんだ。 俺は違いの解かる漢 _、_ ( ,_ノ` )y━・~~~
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。