関数型言語ML(SML, OCaml, etc.), Part 3

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
関数型言語MLについて語るスレッドです。

MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても
優れています。

過去スレ
ML!!!!!! http://pc.2ch.net/tech/kako/1002/10021/1002111468.html
関数型プログラミング言語ML http://pc5.2ch.net/tech/kako/1012/10124/1012445015.html
let t = 関数型プログラミング言語ML 2 http://pc5.2ch.net/test/read.cgi/tech/1058630709/

リンク集 http://www.summa.jp/lang/func/ml/

総本山
Standard ML http://www.smlnj.org/
Objective Caml http://caml.inria.fr/ocaml/

チュートリアル
Standard ML
http://www-2.cs.cmu.edu/afs/cs/usr/rwh/public/www/introsml/
http://www.dcs.napier.ac.uk/course-notes/sml/manual.html
http://www.dcs.ed.ac.uk/home/stg/NOTES/
http://yk.i.hosei.ac.jp/smlbook/smlbook.pdf
http://www.summa.jp/tutorial/plain/mlkouza.txt
Objective Caml
http://www.csc.vill.edu/~dmatusze/resources/ocaml/ocaml.html
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html
http://www.biocaml.org/~bannai/ocaml-intro/
http://www.ocaml.jp/archive/document/
2デフォルトの名無しさん:04/12/21 18:59:30
   _,ヾゝ'"'" " '"、,;
   ,ラ   、_   〃,、
   イ  r-'ー゙ "ー‐、, ミ
   i!  ,! /     \ |ミ
   ,j i    -     - |
   ,,(6     ,,.. ↓..,,  |   <モ2ワが2げっと!
    メ,     ー   /       
    ,.-'\ ...,, ーー、,/、      
   //:::;;:::::::::::::::::::::▽:::::::ヽ
   |||::::|::::E N E O S::|::::::| 
   |||::::|:::::::::::::::2:::::::::::|:::::|
3デフォルトの名無しさん:04/12/23 16:09:59
おいおいいくらなんでもこのままだとdat落ちするぞ
4デフォルトの名無しさん:04/12/23 17:27:57
んーじゃそれはちょっと悲しいので提議をしてみます。

ML 系言語だと SML/NJ と OCaml が有名だという認識なんですが、他の処理系
を使ってる人っていますか? どう違うとかどう嬉しいとか、そもそもどうい
うのがあるかとか(Moscow ML くらいしか知らないんですが)。
5デフォルトの名無しさん:04/12/23 17:53:43
>>4 LML(Lazy-ML)
6デフォルトの名無しさん:04/12/24 02:00:49
>>1乙!…………と言いたいところだが、


このスレには消えて貰うわけにはいかないのですよ。
ちょっと立てるの早かったかな。でも乙。
7デフォルトの名無しさん:04/12/24 17:43:07
MLってオブジェクト指向?
ってそんな話じゃない?
8デフォルトの名無しさん:04/12/24 17:50:55
関数型言語だと書いてあるでしょうに
9デフォルトの名無しさん:04/12/24 18:01:49
OCaml はオブジェクト指向もあり。
10Aransk:04/12/24 18:01:52
>現実的なソフトの開発にも使用できる実用性を備えた言語です。
使用できるじゃなくて、使用して開発「された」ソフトは
あるのでしょうか?
11デフォルトの名無しさん:04/12/24 20:46:05
今の時代、関数型であろうと手続き型であろうと、
オブジェクト指向、STLとかないと非常に開発効率・保守が悪くて
使い物にならないわけだが。。。
12デフォルトの名無しさん:04/12/24 21:44:01
>>11
STL って何? C++ の Standard Template Library くらいしか思いつかない
んですけれど……。
13デフォルトの名無しさん:04/12/24 21:58:09
説明するのも面倒だが
ただの用語聞きかじり厨だからほっとけ
STLが何の略なのかもわからなかったんだろ
14デフォルトの名無しさん:04/12/25 03:20:07
>>4
知ってると思うが

http://www.faqs.org/faqs/meta-lang-faq/

正直、実装としてはSML/NJがもっとも汚いような気がするんだがどうよ?
Shaoのせいだと思うが。
15デフォルトの名無しさん:04/12/25 07:13:04
SMLの中間語はCPS?
そのせいもあったりして。
1614:04/12/25 07:16:31
きれいさだけで言えば、むしろCPSのほうが見やすいコンパイラにならないか?
効率を気にし始めると、CPSは妙な最適化が要るようになって汚くなるのかもしれんが。
17デフォルトの名無しさん:04/12/25 14:24:15
mltonそこそこ速いみたいだけど
cygwin/gcc依存しまくってんなorz
単体実行ではOCamlかねえ
18デフォルトの名無しさん:04/12/25 23:42:29
使ってる奴いないの?

というかMLで何すんの?

C++じゃいかんの?
19デフォルトの名無しさん:04/12/25 23:47:30
使ってる奴いるよ?

というか聞いてどうすんの?

そもそも1行ずつあける必要あんの?
20デフォルトの名無しさん:04/12/26 01:28:06
行間よめってことじゃない?

でもこの話題に行間もくそもありゃしない!

残念!
21デフォルトの名無しさん:04/12/26 02:01:32
VMになってからのML Kitはどうなの?
regionには魅かれる
22デフォルトの名無しさん:04/12/26 02:03:23
どうなの?
って自分で確かめろよ
そして報告しろ自作自演しろ!
ひといないんだから!

残念!
23デフォルトの名無しさん:04/12/26 03:09:32
Haskellみたいな関数の合成ってMLにあるの?
24デフォルトの名無しさん:04/12/26 03:14:23
25デフォルトの名無しさん:04/12/26 12:38:54
>> 23
fun f x = x + 1;
fun g x = x * 2;
val h = f o g;
26デフォルトの名無しさん:04/12/26 13:47:09
deforestationします。
27Aransk:04/12/26 16:58:26
>オブジェクト指向、STLとかないと非常に開発効率・保守が悪くて
>使い物にならないわけだが。。。
CとかCobolなんかそんなものが無くても
結構実用的な開発に利用されています。
MLはどうなんでしょう?
28デフォルトの名無しさん:04/12/27 02:55:15
http://www.npc.de/ocaml/linkdb/list.cgi?type=classification&frames=true

っていうかあ、もうちょっとレベルの高い話しよーぜー

ML KitっていつからVMになったの? 知らなかったorz
29デフォルトの名無しさん:04/12/27 08:23:36
ここで Aransk 降臨!とかあるとおもしろんだが。

どうせ厨しか集まりませんからぁー! 残念!
30デフォルトの名無しさん:04/12/27 08:24:21
>>27
>>29 orz

31Aransk:04/12/27 17:33:58
ttp://web.yl.is.s.u-tokyo.ac.jp/kobalab/kadai98/kadai3.html
より引用:
>通常のMLのプログラムに、Cでいうところのmalloc や
> free を自動的に挿入することにより、ガベージコレクション
>なしでもプログラムを走らせることができます。
これって正しくは:
「Cでいうところのmallocやfreeを自動的に挿入することに
よりガベージコレクション機能を実現しております。」
ではないでしょうか?
32デフォルトの名無しさん:04/12/27 18:05:46
一時期研究したことがあるけれど、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 を埋め込む)
あと、リージョンはスタックで取るので、スタックの下のほうにゴミがあっても、
上の方が使われていたりすると破壊されない。リージョン推論がちゃんと出来てれば
防げるのかもしれんが、もう半分忘れた。
33デフォルトの名無しさん:04/12/27 18:06:10
ここはおまえのメモ帳じゃねえんだ
34Aransk:04/12/27 18:35:06
ttp://www.ps.uni-sb.de/alice/
ついにalice1.0がリリースされましたが
これなんか専門家の皆さんの評価は
どうなんでしょう?
35デフォルトの名無しさん:04/12/27 18:55:22
region関係は一時期D. Walker達が盛んにやっていたようだが、今はどうしてるんだろうね。
36デフォルトの名無しさん:04/12/28 02:45:51
>>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
37Aransk:04/12/28 12:59:16
最近VM付きでない言語を探すほうが
難しい。それほどVM技術が一般化した
ってことじゃないでしょうか。
上記のAliceもしかりです。
その内ハードディスクがVMだらけに
なって、バッティングを起こしたりしてね?W
38デフォルトの名無しさん:04/12/29 06:06:30
さびれてんなあ。しょうがないなあ、つっこみ入れるよ…
>>37
・ML Kitは「言語」じゃねえだろ!
・「VM技術」ってなんだよ。VMにすること自体は技術なんてもんじゃねーよ。
・「ついに」とか言われたってAliceなんてしらねえよ(作者の一人は知ってたけど)。ざっと見たが何もオリジナリティないじゃん。
・JVM同士とかならともかく、違うバイトコードのVMがどうバッティングするんだよ!
39Aransk: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を全角にしましたから…)


40デフォルトの名無しさん:04/12/29 15:15:12
アホを相手にすんなよ。
41Aransk:04/12/30 15:59:46
>>40
黒田さん並におっとりしておりますんで…。
42デフォルトの名無しさん:04/12/30 16:09:51
すまん
Aransk = アホ
43デフォルトの名無しさん:04/12/30 16:27:35
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
44Aransk:04/12/31 18:38:07
畏れ多いことを発言してはいけません。
黒田さんは=内親王の夫君となられるお方です。
黒田さん=おっとり=Aranskですからして、
おっとりー>アホは黒田さんにも関数適用
されます。W

45デフォルトの名無しさん:05/01/01 05:20:58
Aransk = アホ は真であるが
Aransk = おっとり は偽だな。
46デフォルトの名無しさん:05/01/01 17:43:45
 ま た A r a n s k か
47デフォルトの名無しさん:05/01/01 18:07:14
Aransk関係は↓でやれ

Aransk自身も↓から出てくるな

超準関数型言語Aransk
http://pc5.2ch.net/test/read.cgi/tech/1082176723/
48デフォルトの名無しさん:05/01/01 19:02:09
Aranskに項と関数の区別がつけられないのはよくわかった。
49デフォルトの名無しさん:05/01/02 00:13:21
>>25
ocaml だと、

let (^.^) f g = function x -> g (f x);
let h = f ^.^ g;;

みたいに定義しないとダメ? 標準装備じゃないの?
50デフォルトの名無しさん:05/01/02 01:01:03
>>49
書き方はともかく、その通り。自分で定義しないといけない。

調べてみたが、missinglib で、そのような用途の演算子
% : ('a -> 'b) -> ('c -> 'a) -> 'c -> 'b
%%: ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c
$ : ('a -> 'b) -> 'a -> 'b
が定義されていた。
http://gopher.quux.org:70/devel/missinglib/html/Composeoper.html
うーむ、しかし他はともかく $ は左結合だから使いづらい気がするが……。
51デフォルトの名無しさん:05/01/02 23:52:54
>>50
Thanks!

ところで、話題になってる「VM」って抽象機械の事?
ocaml だと ZINC とか聞いたことあるけど、対応表キボン。

Java -> JavaVM
ocaml -> ZINC?
SML -> ???
52Aransk:05/01/04 17:41:59
>話題になってる「VM」って抽象機械の事?
1.中間コードを生成することにより
  インタプリターの速度をアップする。
2.OS間の差異を吸収し、コーディングの
  統一を図る。
これらを目的としたもの全て、MSのCLRも
含むと個人的には解釈しております。
53デフォルトの名無しさん:05/01/04 17:59:44
それとこれまでの発言を踏まえると、
Aranskは現存の言語の実装を全くわかってないという結論が導かれるがよろしいか。
54デフォルトの名無しさん:05/01/18 00:20:55
>>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
MLtonの方向性について、何か言ってやって下さい。

http://mlton.org/Survey
56デフォルトの名無しさん:05/01/29 23:59:01

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
#


57デフォルトの名無しさん:05/02/01 23:14:21
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
#
58デフォルトの名無しさん:05/02/13 00:10:26
ここに書き込むのが適切なのかどうかわからんのだけど、
コンビネータ理論とラムダ計算の同等性がわからず、詰まってます。

λ|- M=N ⇔ CL+ (ζβ)|- M_cl = N_cl

らしいんだが、なんでζβじゃないといけないんだろう・・・
59デフォルトの名無しさん:05/02/13 08:01:39
λにおけるη展開に相当する規則がCLにないから補う必要がある。
60デフォルトの名無しさん:05/02/13 16:32:41
>>59
仰る通り、字面では分かるんですが、それはなぜかと言うところで…
というか、とある問題を解いていて、

(ζβ) : Px → Qx ⇒ P = Q

という規則の代わりに

(ξ):P→Q ⇒ λx.P → λx.Q

をCLに追加するだけでは不十分である事を示せ、とあって、
詰まっていたりします。

…うう、スレ違いスマソ。
6160:05/02/13 16:34:48
すいません、規則書き間違えました。
(ζβ) : Px = Qx ⇒ P = Q
(ξ):P = Q ⇒ λx.P = λx.Q
でした。重ね重ねスマソ
62デフォルトの名無しさん:05/02/16 11:44:02
つーか、プリミティブなλにη展開は存在しないんだが。
63デフォルトの名無しさん:05/02/16 15:16:42
ここは横内さんの本を輪読するスレになりました。
         \(            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
65デフォルトの名無しさん:05/02/23 22:59:47
>>61
(ξ):P = Q ⇒ λ^*x.P = λ^*x.Q
の間違いじゃない?あとλかληかはっきりさせて。
66デフォルトの名無しさん:05/02/23 23:29:21
p.44 練習問題2.6の2です。
67デフォルトの名無しさん:05/02/25 10:41:53
>>63>>65>>66
ご明察で、横内さんの「プログラム意味論」(共立出版)
p.44 練習問題2.6の2です。

(ξ)の正しい定義は>>65さんの通り、ληではなくλです。
理解が足りてなかったので混乱させてしまいました。
68デフォルトの名無しさん:05/02/25 20:41:19
CL+(ζβ)は強すぎじゃないか?
λη|-M=N iff CL+(ζβ)|-M_cl = N_cl
λ|-M=N iff CL+(ξ)|-M_cl = N_cl
という感じがするのだが(根拠はない)
69デフォルトの名無しさん:05/02/26 12:40:47
横内さんの本の内容が上手くイメージできない…。
そんな話を聞くたびに代数の勉強を先に済ませておけばいいのにと思う。

よくよく話聞いてたら、プログラム意味論固有の部分が分からないというより
代数的考え方の準備が出来ていない事情が多々目に付いてしまう。

http://www.amazon.co.jp/exec/obidos/ASIN/4320026578/250-0355581-1002631
↑この本読んで苦労を感じるようなら、その前に↓この本買って読んどけ。悪いこと言わんから。
http://www.amazon.co.jp/exec/obidos/ASIN/4000056344/ref=lm_lb_15/250-0355581-1002631
70デフォルトの名無しさん:05/02/26 16:07:30
俺にとっては横内さんの本はわかりにくかった。
GunterやMitchellを読んで、横内さんの言いたかったことがやっとわかった。
71デフォルトの名無しさん:05/02/26 23:34:22
>>69
しかし、上で揉めてる話は純粋なラムダ計算周りで、代数系の知識はあまり
要らないんじゃないかと思うんだが。
72デフォルトの名無しさん:05/02/27 00:49:33
GunterはSemantics of Programming Languagesのことだと思うが
http://www.amazon.co.jp/exec/obidos/ASIN/0262071436/qid=1109432532/sr=1-1/ref=sr_1_0_1/250-0355581-1002631

俺はWinskelの意味論入門書のほうが分かりやすくて絶対お奨め。
http://www.amazon.co.jp/exec/obidos/ASIN/0262731037/qid=1109431978/sr=1-1/ref=sr_1_10_1/250-0355581-1002631

横内さんの本よりよっぽど分かりやすい。
Mitchellは読んでないから知らん。 Schemeインタプリタとかどうでもいいし。。
73デフォルトの名無しさん:05/02/27 02:56:32
Winskelも読んだが、あれは横内さんのような(というか元ねたのGunterのような)
カテゴリーに基づく意味論を扱ってなかったように思う。代わりに自分の専門
(の一つの)information systemに1章割いていたが。

まあWinskelは学部レベルの入門書、Gunterは専門書という位置づけだろうな。


74デフォルトの名無しさん:05/02/28 14:45:50
アマゾンを見たら
『プログラム意味論』と『プログラミング言語の基礎理論』、どちらもおすすめ!
って書かれてるけど、横内さんの本を読もうという人が、まともに大堀さんの本など
読めないのでは? 日本語限定だと他にどうともしようがない事情も分かるけれど。
75デフォルトの名無しさん:05/02/28 21:00:09
横内は誰にでもわかる本を作れない時点で低脳
76デフォルトの名無しさん:05/03/01 03:53:04
せめて劣化コピーry
77デフォルトの名無しさん:05/03/01 18:38:51
今、75が本質的な事を言った
78デフォルトの名無しさん:05/03/01 20:40:08
スレのレベル低下中・・・
79デフォルトの名無しさん:05/03/01 20:45:19
今、78が本質的な事を言った
80デフォルトの名無しさん:05/03/02 15:05:29
スレの法則が乱れる!
81デフォルトの名無しさん:05/03/02 15:18:07
OCamlの勉強をはじめてみようと思うんだが、OCamlのユーザーって日本に何人ぐらいいるもんなの?
82デフォルトの名無しさん:05/03/02 15:34:29
8381:05/03/02 16:24:23
う〜ん、OCamlをインストールしてちょっと触ってみた感想として、標準で
グラフィックスライブラリやパーサージェネレータが付属していて、
よく出来てそうな環境という印象だったんだけど、あんまり流行ってないのかな。
84デフォルトの名無しさん:05/03/02 20:30:08
例外処理とかどうなってんの?
WindowsのOCamlはSEHとか使ってんの?
85デフォルトの名無しさん:05/03/04 09:32:08
86デフォルトの名無しさん:05/03/05 21:57:51
>>81
表には書いていないけれど、私はOCamlで作ったツールとかも公開したりしている。
87デフォルトの名無しさん:05/03/05 23:34:43
おれも心のなかでは公開してるよ
88デフォルトの名無しさん:05/03/05 23:35:23
>>84
使ってない。
つまりエラー処理グダグダ。
89デフォルトの名無しさん:05/03/07 16:08:21
www.ocaml.org が 404 Not Found なんだけど……なにかあったのか?
90デフォルトの名無しさん:05/03/07 16:12:49
91デフォルトの名無しさん:05/03/09 00:10:21
92デフォルトの名無しさん:05/03/09 12:49:44
ベツノヒトデス >>91
93デフォルトの名無しさん:05/03/09 13:21:47
スルーされてるが>>85に期待。
いくら貰えたの?
94デフォルトの名無しさん:05/03/09 19:30:37
現段階ではSparcマシンが必要七日
95デフォルトの名無しさん:05/03/09 20:13:50
96デフォルトの名無しさん:05/03/09 21:06:39
ATLを生成してGCCのバックエンドを使えばいいと思うんだけど、難しいの?
97デフォルトの名無しさん:05/03/10 02:39:03
ATL(Active Template Library)?
98デフォルトの名無しさん:05/03/10 03:41:02
RTLですた。
99デフォルトの名無しさん:05/03/10 14:10:09
・RTL(Register Transfer Level)
 HDLの記述形式。レジスタの振る舞いに注目し、回路構成を記述。

難しそうね。
100デフォルトの名無しさん:05/03/10 14:41:35
ゲートレベルよりははるかに楽。
101デフォルトの名無しさん:05/03/13 06:46:15
楽?
102デフォルトの名無しさん:05/03/15 15:24:55
いつのまにか http://caml.inria.fr/ のデザインが一新されてる。
いつのまにか http://www.ocaml.org/ が caml.inria.fr にリダイレクトされるようになってる。
103デフォルトの名無しさん:05/03/15 15:37:58
おフランス万歳
104デフォルトの名無しさん:05/03/15 18:23:19
>>102
使いやすいデザインになったね。
105デフォルトの名無しさん:05/03/15 19:14:44
>>102
つーか入れないんですが。
106デフォルトの名無しさん:05/03/16 01:25:12
ドキュメント類が3.07のときのやつに戻ってるような。。。
107デフォルトの名無しさん:05/03/16 02:38:51
>>102
IEからだとファイルのダウンロードになってしまう。
おれの環境がおかしいのか?
108デフォルトの名無しさん:05/03/16 13:19:51
>>107
たしかになるね。
http://caml.inria.fr/index.en.html
だと正しく見えるみたい。
109デフォルトの名無しさん:05/03/17 23:10:36
OCaml 3.08.3
http://caml.inria.fr/ocaml/release.en.html
バグフィックス版らしい。
110デフォルトの名無しさん:05/03/20 18:04:49
MLってどこがいいのよ?

動的型付けのLispみたくパワフルでないし、
JAVAみたいにわかりやすくもないし、
Cみたいに高速でもないんでしょ?
111デフォルトの名無しさん:05/03/20 20:45:31
>>110
型について、LispとMLでどちらがパワフルかといったらMLだろうなぁ…
解かりやすさについては…う〜ん、解かりやすさってなんだろう…それが解からない。
C++よりも速いがCよりは遅いと巷では言われています。
112デフォルトの名無しさん:05/03/20 20:48:46
そうして個々に見るといい言語なんだよなML。

しかし日陰者。
113デフォルトの名無しさん:05/03/20 22:00:21
>>112
OCaml!!!!!!!!!!!!!!!
114デフォルトの名無しさん:05/03/20 22:08:28
これって日本語回りはどんなもんです?
115デフォルトの名無しさん:05/03/20 23:25:34
116デフォルトの名無しさん:05/03/21 00:51:06
むしろ Camomile では?
117デフォルトの名無しさん:05/03/21 01:07:56
MLがマイナーな理由の1つに、
コード生成アルゴリズムがほとんど認知されていないという事があると思う。
どういう記述をすれば良いコードが生成されるとかいった情報。

例えばC言語は高級アセンブラと言われるぐらい単純で、
実際アセンブラからCへの写像も簡単だし、
そういった情報は豊富にあるから、C=速いという結論へすぐに
帰着することができるけど、MLではベンチマークサイトの結果等から漠然と
「速いらしい」という認識しかしてない人が多いと思う。
ほとんどの人がなぜ速いのか?、まで追求しない。
これは型推論からなるMLの基礎理論のハードルが他と比べて高いのが1つの原因だと思う。
言語処理系がコードを処理していく行程というか、仕組み想像できないゆえに敬遠される。
きっとMLにはGCが存在する事さえあやふやな人もいるはず。
CやLISPを自作できるという人はかなりの人数に上ると思うけど、
MLはどうかな?たぶんここには一人もいないよね。
118デフォルトの名無しさん:05/03/21 01:39:00
minicaml!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
119デフォルトの名無しさん:05/03/21 01:43:10
前半は正しいっぽいのに後半はむちゃくちゃだな。

>CやLISPを自作できるという人はかなりの人数に上ると思うけど、
>MLはどうかな?たぶんここには一人もいないよね。

MLがその力を真に発揮するのは言語処理系を書くときだよ。
MLマニアの大半もそういうことに興味あるやつだと思ってたけど…。
むしろCの処理系を自作できることのほうがすごい。
120デフォルトの名無しさん:05/03/21 03:02:19
>>119
処理系書くとかいう話ではないんだけど。
121デフォルトの名無しさん:05/03/21 03:19:51
>>111
> 型について、LispとMLでどちらがパワフルかといったらMLだろうなぁ…

???>>110は型自体がパワフルなんて言ってないと思うんだけど???
122デフォルトの名無しさん:05/03/21 03:23:28
>>117
言ってることはまさにその通りだと思うんだけど、みんなが知りたい
そういったコアな情報を分かりやすく公開してくれる熱心なグルが
現れん限り状況は改善しそうにないな。
123デフォルトの名無しさん:2005/03/21(月) 11:09:32
アホか。大学で普通にならうっちゅうねん。
124デフォルトの名無しさん:2005/03/21(月) 11:36:33
↑馬鹿注意
125デフォルトの名無しさん:2005/03/21(月) 18:37:00
むしろ学校でしか縁がないとも言えるな。
126デフォルトの名無しさん:2005/03/21(月) 19:57:47
Windowsでちゃんとした実行ファイルが作れるMLってありますか?
127デフォルトの名無しさん:2005/03/21(月) 20:00:19
128デフォルトの名無しさん:2005/03/21(月) 20:02:24
↑何?怖くて見れません。
129デフォルトの名無しさん:2005/03/21(月) 20:05:14
桜まつり??
130デフォルトの名無しさん:2005/03/21(月) 20:07:30
あ、OCamlにします。
131デフォルトの名無しさん:2005/03/21(月) 20:12:38
今話題の岡村がどんなものなのかざっと知るのに
よいページを教えてください
132デフォルトの名無しさん:2005/03/21(月) 20:16:13
>>115
亀だけどd

家かえって早速インスコ。
軽く触ってみた。。。第一印象は「いい感じ。」

ここのところPython三昧だったけど、ちょっと浮気してみようかな、と思ってみたり。。。
(ググッたらwxCamlもあるし。ちょっと期待)
133デフォルトの名無しさん:2005/03/21(月) 21:06:18
>> 126
Moscow MLのWindows版を使ってるよ。
開発元のページにあるやつ。
http://www.dina.kvl.dk/~sestoft/mosml.html
134デフォルトの名無しさん:2005/03/30(水) 08:51:47
135デフォルトの名無しさん:2005/03/30(水) 22:59:43
136デフォルトの名無しさん:2005/03/31(木) 02:14:01
>>136
下の方のは実用目的ではないよね。
(その分、処理系の存在自体が楽し感じる)

まぁ、>>126 の用途もよく分らないけど。
137デフォルトの名無しさん:2005/03/31(木) 03:44:43
>>>135
その中に日本語のサイトが1つも無いのは仕様ですか
138デフォルトの名無しさん:2005/03/31(木) 08:36:02
139デフォルトの名無しさん:皇紀2665/04/01(金) 05:01:30
>>135 追加
http://www-2.cs.cmu.edu/~fox/tilt.html
http://www.cs.cornell.edu/home/jgm/tilt.html

SML には珍しく Native Thread が使える?
SPARC or ALPHA or SML/NJ で動くらしい。
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 の違いが今一つ理解できないんですけど、教えてプリーズ
141デフォルトの名無しさん:int 2ch =05/04/02(土) 02:48:11
>>140
それはパターンマッチを使うべきではない気がする。というか、できない。

if i = 0 then "zero"
else if i = size then "size"
else "_"

(int * int) と int * int は同じでしょう?
(int * int) list と int * int list は違うけど。
142デフォルトの名無しさん:int 2ch =05/04/02(土) 03:20:03
>>141
訂正。when 使えばできるかも。

match i with
0 -> "zero"
| _ when i = size -> "size"
| _ -> "_"
143デフォルトの名無しさん:int 2ch =05/04/02(土) 12:05:42
>>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) はできない。
大して深い意味がある違いじゃないと思うけどね。
144140: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)
となって、悩んでます。
145143: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) と書けばいい。

こういう仕様になってる理由はよくわからん。
歴史的な理由か実装上の都合かなと思ってるけど、誰か知ってる?
146デフォルトの名無しさん:2005/04/03(日) 05:03:02
>>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 なんでしょう。

どう直すべき?
147デフォルトの名無しさん:2005/04/03(日) 07:28:53
data constructorのarityの定義が気になる。
直感的には、すべてのdata constructorのarityは1だと思うのだが…。
A of int * intはintの組を1つ引数とするものだと思うし。
148デフォルトの名無しさん:2005/04/03(日) 16:53:08
気持ちはわかる。けど本当に大した理由がないことなのかは自信が持てない。

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 書き換える方向で。
149デフォルトの名無しさん:2005/04/03(日) 21:48:47
A of int * intの場合(かっこがつかない場合)、
parse時にちょっとデータ構造を最適化しているが、
matchの方を修正し忘れている…という可能性もあるね。
150デフォルトの名無しさん:2005/04/04(月) 01:29:16
>>149
よくわかんないけどバグってこと?
>>143 の例で言うと、
The constructor B expects 2 argument(s), but is here applied to 1 argument(s)
なんていうエラーメッセージが出るくらいだから、
多分バグではなくて意図した仕様と動作みたいだよ。
151デフォルトの名無しさん:2005/04/04(月) 02:57:34
何を意図しとるんだ?
152& ◆D3ra0B2LiQ :2005/04/06(水) 04:53:13
それはOCamlの有名な、というか悪名だかい仕様。148のいってること↓が正解。

> A of int * int のほうが tuple を構築、分解しなくてすむ分
> メモリ効率や実行効率が若干いいかも。
> そういうのは最適化の方でやってほしい気もするけど。

Unboxingっていう最適化を実装すればよいんだが、多相性との関係で意外と大変なので、OCamlではやってない。
MLtonあたりならやってそうだけど。
153デフォルトの名無しさん:2005/04/06(水) 06:47:00
どこで有名なんですか?
154152:2005/04/06(水) 12:10:47
俺の周囲と脳内。

…ってのは冗談で

http://caml.inria.fr//cgi-bin/search.en.cgi?words=the+constructor+expects+argument%28s%29+but+is+here+applied+to+argument%28s%29&corpus=all&mode=default&page=1&number=10

とか。ちょっと関係ないのもヒットしてるけど。
155デフォルトの名無しさん:2005/04/06(水) 19:24:32
詳しいことは知らんが、マニュアルに

> The type expression ( typexpr ) denotes the same type as typexpr.

と書いてある以上、int * intと(int * int)で動作が異なるのを仕様と言い張るのは
無理があると思う。そもそも()はtype levelのconstructorではないだろう。

それと揚げ足を取るようだが、最適化の実装の有無で言語仕様が変わるのはおかしい。
156デフォルトの名無しさん:2005/04/06(水) 20:16:57
OCamlは.+とか、汚い部分を消していけばよいと思う。
157デフォルトの名無しさん:2005/04/06(水) 20:21:06
Microsoft の F# ってどうなの?調べるのめんどいからおせーて。
158デフォルトの名無しさん:2005/04/06(水) 20:37:58
構文は SML の方が読み易い様に感じるけど、処理系は OCaml の方が機能豊富だね。
159デフォルトの名無しさん:2005/04/06(水) 20:57:02
言語仕様を見るとHaskellの方がはるかに機能的に見えるのだけど、実用面を見るとHaskellはボロボロ。
結局、開発するならOCamlに軍配があがるんだよね。
160デフォルトの名無しさん:2005/04/06(水) 21:08:07
おい。疎外されてるぞ。
ttp://codezine.jp/a/default.aspx?cid=137
161152: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で解決できないのかな?
163デフォルトの名無しさん:2005/04/08(金) 01:10:39
164163:2005/04/08(金) 03:28:40
ってgcamlのことか。じゃあよく知らんスマソ
165デフォルトの名無しさん:2005/04/09(土) 02:12:31
>>156
単純に消すだけなら、camlp4使えばできる。
http://martin.jambon.free.fr/extend-ocaml-syntax.html

let x = FLOAT 3/2 - sqrt (1/3)

みたいな感じ。
166デフォルトの名無しさん:2005/04/09(土) 02:22:59
Camlp4のp4て何?
167デフォルトの名無しさん:2005/04/09(土) 02:26:05
Camlp4 is a Pre-Processor-Pretty-Printer for OCaml
http://caml.inria.fr/pub/docs/manual-camlp4/manual001.html
168デフォルトの名無しさん:2005/04/09(土) 15:26:34
>>166
Pentium4
169デフォルトの名無しさん:2005/04/09(土) 18:13:14
>166
ばーか
170デフォルトの名無しさん:2005/04/20(水) 21:20:32
p4 はフランスの徴兵検査でお馬鹿か何かで不適格になった時の分類らしいです。

どーも campl4 と手が動いて困る。campl4 だけバイナリ名が ocaml から
始まってないのも好かん。改造するときに統一的に名前が変えられない、、、
171デフォルトの名無しさん:2005/04/20(水) 21:21:37
リネームしたら、ええんちゃう・・・?
172デフォルトの名無しさん:2005/04/20(水) 21:22:34
>>162
汚いです。すいません。

173デフォルトの名無しさん:2005/04/20(水) 21:26:20
>>171
ocaml を改造して acaml を作るとすると、
ocaml => acaml
ocamlc => acamlc
ocamlopt => acamlopt
ocamldep => acamldep
なんだけど、
camlp4 camlp4o camlp4r ocpp
は統一的な名前変更が出来ん。作者が違うからしょうがないけど、
ocamlなんとか って名前にしてほしい。
174デフォルトの名無しさん:2005/04/20(水) 21:34:28
それ苦情申し立てした方がいいね
名前ごときで使えないなんてもったいない
175デフォルトの名無しさん:2005/04/21(木) 10:58:30
いつのまにかGCaml3.xキテター!
ttp://www.yl.is.s.u-tokyo.ac.jp/~furuse/gcaml/index.html
176デフォルトの名無しさん:2005/04/23(土) 04:28:44
>>175
すごい! すばらしい!

で、早速コンパイルしたいのですが、
./configure; gmake world すると、.depend がないとか言われてしまいます...

どなたかご助言下さい


177デフォルトの名無しさん:2005/04/23(土) 13:01:10
今日付けの version ではなおっているみたい。
178デフォルトの名無しさん:2005/04/23(土) 18:39:15
どうもfuruseさんはこのスレッドをチェックしているような気がしてならない。
それはそうとGJ!
179デフォルトの名無しさん:2005/04/23(土) 20:45:28
別にGJじゃないよ
180デフォルトの名無しさん:2005/04/23(土) 20:46:06
普通チェックすると思う。
181デフォルトの名無しさん:2005/04/24(日) 02:08:54
>>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 の作者に聞けばいいじゃん。
184デフォルトの名無しさん:2005/04/26(火) 18:30:47
いいじゃん、いいじゃん
185デフォルトの名無しさん:2005/04/26(火) 23:25:53
>183
失礼しました。で調べましたら
>ttp://sourceforge.net/forum/forum.php?thread_id=1143008&forum_id=371922
>Sorry, but this is not possible with the current version of the plugin. The next version will address this and other features.

つーことでしたので、所望のライブラリを勝手にリンクするスクリプトを介してコンパイルするように指定して
取り敢えずどうにか致しました
186デフォルトの名無しさん:2005/04/27(水) 22:23:17
といいつつ、camlclispは現状全然便利クナイ(゚Д゚)
てことで、これ↓

ttp://www.pps.jussieu.fr/~emmanuel/Public/Dev/eclipse/

を使ってみた…結構高機能・便利そうでいい感じだけど
フランス語のドキュメント読めないので、山勘でしか使えてない…orz
187デフォルトの名無しさん:2005/04/27(水) 23:36:54
コレを気におフランスの言葉を覚えるざます
188デフォルトの名無しさん:2005/04/28(木) 11:49:00
>> 186
ドキュメント書いているのはどうやら学生さんみたいね、、、
だから、英訳はすぐには期待できないかな?
Chailloux は O'Reilly O'Caml 本の著者。
気さくなオッサンだから彼に英語で質問するのが吉。
189デフォルトの名無しさん:2005/04/28(木) 22:33:40
merd ってのを最近見つけたんだけど、
どなたか詳しい方いますか?
現在開発されてますか?
190デフォルトの名無しさん:2005/04/28(木) 23:14:14
>188
ご助言ありがとうございます

解んない事が明確なら質問しようとかも思いまするが
フランス語の入門書と辞書でも買ってもう少し足掻いてみようかと。
その前に社内にいるフランスの学生さんに掻い摘んで読んで貰おうとか

それ以前に、山勘で使えてると思っているのも思い過ごしかもしれないし… orz
191デフォルトの名無しさん:2005/04/29(金) 05:21:30
>>186 フランス語を英語にできますよ
http://www.freetranslation.com/

自分はフランス語を1文字も読めません…
192デフォルトの名無しさん:2005/04/29(金) 12:15:11
つーかフランス語のフォントって英語と違うよね?
193デフォルトの名無しさん:2005/04/29(金) 14:00:22
はぁ?
194デフォルトの名無しさん:2005/04/29(金) 17:48:57
関数型言語コミュニティには>193のようなイジワルな人が多い気がする。
195デフォルトの名無しさん:2005/04/29(金) 22:15:51
そう言う人はどこにでもいるけど、人数が少ないから目立つだけのような気がする。
Javaスレで同じようなことが起きても誰かが答えて終わりじゃん。
196デフォルトの名無しさん:2005/04/30(土) 04:45:22
>>189
http://www.kmonos.net/alang/etc/merd.php
これだっけ。

変った型システムの言語というイメージが。おもしろそうなので調べようとずっと思ってたけど結局ちゃんと調べてないなぁ。
開発はあまり進んでいない様子。
197189:2005/05/01(日) 09:43:26
失礼。
関数型言語全般のスレと間違えました。
198デフォルトの名無しさん:2005/05/01(日) 10:17:49
merdは確かOCamlで書かれてるし、別にスレ違いというほどでもないと思うけど。
漏れもちゃんと調べてはいないなぁ。
199デフォルトの名無しさん:2005/05/01(日) 10:26:27
コーダ臭ぇスレだなw

>変った型システムの言語というイメージ

おぃおぃw
Haskelやった事ないだろw
200デフォルトの名無しさん:2005/05/01(日) 10:35:20
関数型プログラミング言語Haskell Part3
http://pc8.2ch.net/test/read.cgi/tech/1076418993/
201デフォルトの名無しさん:2005/05/01(日) 11:08:10
>>199
haskell知らなかったらコーダなの?
202デフォルトの名無しさん:2005/05/01(日) 12:50:52
>>199
Haskellのlはふたつ。
ところで Haskell には SoftTyping はないと思うんだけど。
203デフォルトの名無しさん:2005/05/01(日) 13:06:24
ゴールデンウィークなんだ
察してやれ
204デフォルトの名無しさん:2005/05/05(木) 12:57:02
幸田です。
この言語は基幹系システムを組むのに向いていますか?
205デフォルトの名無しさん:2005/05/05(木) 12:58:12
>>204
OCamlは向いてる
206デフォルトの名無しさん:2005/05/05(木) 13:01:42
Goferでいいんじゃね?
2ちゃんに常駐してるようなのには。
207デフォルトの名無しさん:2005/05/05(木) 13:02:58
>>204-205
 脳タリン
208デフォルトの名無しさん:2005/05/05(木) 13:05:22
>>207
なんだと!
だったらお前の意見を言ってみやがれ
209デフォルトの名無しさん:2005/05/05(木) 13:09:20
基幹系というと、あれか。
ボラクルに繋いだり、バッチ処理をやったり・・・
210デフォルトの名無しさん:2005/05/05(木) 13:10:41
リレーショナルなデータベースから何から何までOCamlで組むんだよ。
211デフォルトの名無しさん:2005/05/05(木) 13:12:49
ML系の言語は、当初、定理証明系の記述言語として作成されたものなので、
汎用的プログラミングには向いていませんでした。
その後、HOPEの型推論等を取り入れた、汎用の関数型言語として、
Caml、SML等が開発されました。

特にCamlは、Category Abstract Machineと呼ぶ抽象機械の上に実装されており、
実用プログラミング言語としての地位を目指しています。

212デフォルトの名無しさん:2005/05/05(木) 13:13:20
まぁ目指すだけならボンクラにもできるわけだがw
213デフォルトの名無しさん:2005/05/05(木) 13:14:11
>>208
最近の中学生って暑いな
214デフォルトの名無しさん:2005/05/05(木) 13:17:57
>>211
んなこた知ってんだよ!!だから何だってんだよ。
>>204の答えになってねぇ。
215デフォルトの名無しさん:2005/05/05(木) 13:20:30
バカは相手にしない。
216デフォルトの名無しさん:2005/05/05(木) 13:21:39
表面しか見ないで発言する奴もバカ。
217デフォルトの名無しさん:2005/05/05(木) 13:32:30
>>216
本当にお願いだからそういうレスでスレを腐らせるのはやめてくれ
218デフォルトの名無しさん:2005/05/05(木) 13:46:55
俺の学生時代の記憶では、
十数年前にmirandaかなんかでOSとか実用分野のプログラムを記述する試みがあったな。
SMLやgoferがでる前。
219デフォルトの名無しさん:2005/05/05(木) 13:47:14
>>217(=>>215)
人のことが言えるのか?自分も悪いと思ったら謝れ!!!!
220デフォルトの名無しさん:2005/05/05(木) 14:09:07
職場の古老が言うには、RDBのSQL言語は、関連代数を扱う宣言型言語で、
ライバルはPrologという大変トンがった言語だそうな(笑。

歴史的経緯を度外視すると、COBOLのお仲間に見えちまうんだが
221デフォルトの名無しさん:2005/05/05(木) 14:18:46
ObjectDB商売やXMLDB商売、Alt RDB商売も、
パッとしないねぇ
222218: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.

223デフォルトの名無しさん:2005/05/05(木) 14:47:45
関数型言語でDatabase作ろうって話も、同じ本に載ってた。

[Bun90]
P. Buneman. Functional Programming and Databases. In D. Turner, editor, Research Topics in Functional Programming, pages 155--169. Addison-Wesley, 1990.
224デフォルトの名無しさん:2005/05/05(木) 15:01:18
> 職場の古老が言うには、RDBのSQL言語は、関連代数を扱う宣言型言語で、
実際そうだよねえ。SQLじゃ手続きは一切記述しないし。

> 歴史的経緯を度外視すると、COBOLのお仲間に見えちまうんだが
計算機科学の基本的な勉強してないと、そう見える場合もあるってことですね。
225デフォルトの名無しさん:2005/05/05(木) 15:07:01
DDLは手続きそのものだけどね。

> > 歴史的経緯を度外視すると、COBOLのお仲間に見えちまうんだが
> 計算機科学の基本的な勉強してないと、そう見える場合もあるってことですね。

おバカ?
226デフォルトの名無しさん:2005/05/05(木) 15:09:51
>>222-223
monadic I/O 以前の話のような気がする。
そして、OCamlもSML NJも monadic I/Oなど使っちゃいないのさ(w

つまりML系関数型言語 特にOCalmlで 実用プログラミングをするのに、
大きな障害はないんじゃないか、と。(やる人が居るかどうかは別として)
227デフォルトの名無しさん:2005/05/05(木) 15:28:02
やる人など居ない
228デフォルトの名無しさん:2005/05/05(木) 15:37:09
>>225
> DDLは手続きそのものだけどね。
まさか。宣言型の意味がまるでわかってないの?
229デフォルトの名無しさん:2005/05/05(木) 15:38:31
中学生の煽りカッコイイ

DDLってなんの略?
230デフォルトの名無しさん:2005/05/05(木) 15:40:26
DMLってなんの略?
231デフォルトの名無しさん:2005/05/05(木) 15:42:49
関数型言語のスレで暴れるDBエンジニア、カッコイイ
232デフォルトの名無しさん:2005/05/05(木) 15:47:40
CAMLでグタグタな事務プログラミングする人柱、きぼんぬ
233デフォルトの名無しさん:2005/05/05(木) 15:59:00
DDLの記述は宣言的だが、
DDLの実行は、関数定義の変更と同様、手続き的になされる

ということ
234デフォルトの名無しさん:2005/05/05(木) 16:05:00
> > 職場の古老が言うには、RDBのSQL言語は、関連代数を扱う宣言型言語で、
> 実際そうだよねえ。SQLじゃ手続きは一切記述しないし。

まさか。実際のRDBでSQL使った事ないだろ。
235デフォルトの名無しさん:2005/05/05(木) 16:09:15
SQL-99のPSMの件だな。
236デフォルトの名無しさん:2005/05/05(木) 16:45:40
>>226
Haskelじゃなくて、Clean流のmonadic I/Oね。
237236:2005/05/05(木) 16:47:01
訂正

>>226
Haskelのmonadic I/Oじゃなくて、
Clean I/O につながった話だね
238デフォルトの名無しさん:2005/05/05(木) 17:18:08
>>211
ご存知でしたら教えて頂きたいのですが、ocamlって今でもcamに基づいて実装されてるんですか?
pushとかcarとかswapとか。
今の高レベルの言語機能をcamで実現するのは結構大変かもと思うのですが…
239デフォルトの名無しさん:2005/05/05(木) 17:58:40
SQL で手続き的な部分ってトランザクションとかストアドプロシージャとか?
歴史的経緯を考えれば SQL は宣言型言語と言って間違いは無いと思うけど。
240デフォルトの名無しさん:2005/05/05(木) 18:18:55
>>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の内側に入り込んできている。
241デフォルトの名無しさん:2005/05/05(木) 19:51:37
camlも最初はcamに基づいていたが、今は全く使っていない。
242デフォルトの名無しさん:2005/05/05(木) 21:47:10
>>240
> 宣言型とか関数型という概念自体、当時とは随分変わってきている。
ついには宣言型とか関数型とをごっちゃにするヤツまで登場か。
243デフォルトの名無しさん:2005/05/05(木) 21:50:12
>>242
部外者だが、おかしいぞ
244デフォルトの名無しさん:2005/05/05(木) 22:14:28
えぇーと、じゃぁ「宣言型」と「関数型」と「手続型」の区別を
定義してみて。
245デフォルトの名無しさん:2005/05/05(木) 22:20:11
246デフォルトの名無しさん:2005/05/05(木) 22:25:12
宣言型={論理型, 関数型}

SQLは述語論理型

247デフォルトの名無しさん:2005/05/05(木) 22:29:35
幼稚な揚足ばっかで不毛なスレだな。

最初の話題に戻って、
関数型言語でデータベースやOS作るという話はどうなんだ。

DBに関して、例えばこの本が非常に気になるんだが

Purely Functional Data Structures by Chris Okasaki
248デフォルトの名無しさん:2005/05/05(木) 22:34:21
>>247
いや、ここに居るのは「DBは宣言的言語の適用分野」って丸暗記しているだけで、
実際のDB (dbmじゃないヨ)はあまり知らないだけだろう
249デフォルトの名無しさん:2005/05/05(木) 22:44:25
>>246
SQL言語は述語論理だが、SQL言語が提供する
INSERTやUPDATE、DELETEはDBに対する手続き的操作

なんだよ
250デフォルトの名無しさん:2005/05/05(木) 22:47:15
あと、こっちのバカにもレスしとくか。

>228
DDLの、DROP、ALTERってナニするか知ってる?(激藁
251デフォルトの名無しさん:2005/05/05(木) 22:48:26
>>249
> INSERTやUPDATE、DELETEはDBに対する手続き的操作
> なんだよ
違うでしょ。「手続き型言語」なら、INSERTやUPDATEの中身を手続き的に記述する必要がある。
それをせずにINSERTと書くだけですむから宣言型。
252デフォルトの名無しさん:2005/05/05(木) 22:51:54
ANSI SPARC 3層モデルの話かよw
253デフォルトの名無しさん:2005/05/05(木) 22:55:03
「関数型言語でDBを作る」という時、
いわゆる代入や参照不透明性を持たない、
純関数的にDBをどうやって作るのか?
という点が気になった。

だけどここは CleanでもHaskellでもない、
「なんとなく関数型」言語(ML)のスレだから、
そんな拘りを持ってもしょうがない、
という事か。

じゃあ、思い切ってDBは有り物使う事にして、
例えば OCamlでPostgreSQL呼び出せば済む。

終了。
254デフォルトの名無しさん:2005/05/05(木) 22:56:26
ラベル低ぅ〜。
255デフォルトの名無しさん:2005/05/05(木) 23:09:54
情報処理二級程度の知識しか持たないのが、
関数型言語スレに粘着してるからな。
どうしようもないさ
256デフォルトの名無しさん:2005/05/05(木) 23:20:56
おぃおぃ。
257デフォルトの名無しさん:2005/05/05(木) 23:37:49
>>247
Chris Okasakiの本は、ほとんどすべてがキューの話。ちょびっとだけ木構造
の話もあるけれど。

遅延評価なんかを使ってO(1)なキューの話をしたりとか、内容それ自体は面白
いのだけど、DBとは全然関係ない。
たぶんもとはこの人のD論で、D 論の方はPDFが公開されている。
http://www-2.cs.cmu.edu/~rwh/theses/okasaki.pdf
内容は、たぶんあまり変わらないと思う。本の方にあった演習問題とかが(さ
すがに)ないっぽいくらい。
258デフォルトの名無しさん:2005/05/05(木) 23:46:00
DB無関係?

Amazon のreviewには、red-black trieとかwide-range of datastructure
と書いてあるから、関数言語によるDBの内部データ構造を議論するのに役立つと
思ったんだけど。

おっしゃる通り (cue中心)なら、よく使い道がわかんないですね。
259デフォルトの名無しさん:2005/05/05(木) 23:47:01
DB無関係?

Amazon のreviewには、red-black trieとかwide range of data structure
と書いてあるから、関数言語によるDBの内部データ構造を議論するのに役立つと
思ったんだけど。

おっしゃる通り (queue中心)なら、よく使い道がわかんないですね。
260デフォルトの名無しさん:2005/05/05(木) 23:48:48
二度書き申し訳ない。
しかも良く見たら red-black treeだし・・・。
261デフォルトの名無しさん:2005/05/05(木) 23:56:09
>>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
262デフォルトの名無しさん:2005/05/06(金) 00:23:45
単に Chris Okasaki氏の本は
(純関数型言語をそれ自体で実装するのに必要な、純関数型言語向けデータ構造だから)
で〜たべ〜すぷろぐらまのような下賎の民には無関係だよ、
って逝ってるだけじゃねぇか、と
263デフォルトの名無しさん:2005/05/06(金) 00:59:14
>>262

 >>257
 >Chris Okasakiの本は、ほとんどすべてがキューの話。
 >演習問題

ほら、ここが笑うとこですよ
264デフォルトの名無しさん:2005/05/06(金) 01:07:52
本当いい加減にしてくれ。
>>203-263の削除依頼出すぞ。いいな。
265デフォルトの名無しさん:2005/05/06(金) 01:12:54
どうぞ。無視されますが。
266デフォルトの名無しさん:2005/05/06(金) 01:18:36
>>264
もちつけ。GWが終われば夏までは平和なんだから、辛抱しる。
267デフォルトの名無しさん:2005/05/09(月) 21:48:01
ちょっと興味を持ったのでOCamlの超入門だけ読んだんですが
{Windows,UNIX}で日本語でGUI使えますか?

日本語の処理の事情(単にバイト列のままなのかunicodeなのか)とか
GUIの事情とか書いてあるページがあれば知りたいのですが、
ぐぐってみても探し当たりませんでした。

268デフォルトの名無しさん:2005/05/09(月) 21:51:35
>>267
Cで使えるライブラリは使えると思う。
269デフォルトの名無しさん:2005/05/09(月) 22:01:29
それじゃよくわからんです。
270デフォルトの名無しさん:2005/05/09(月) 23:15:53
Windowsでは使ってないので知らんが、 TclTk も Gtk+ も Gtk+2 もあるよ。

stringの実体はバイト列。unicodeにするなら camomile あたりを噛ませて変
換すればよい。
271デフォルトの名無しさん:2005/05/10(火) 02:34:38
超入門で GUI に直接 attack すると玉砕するかも、、、
label とか poly-variant とかあるからねえ。
焦らずゆっくりどうぞ。
272デフォルトの名無しさん:2005/05/10(火) 02:37:11
>>267
超入門だけで足りるか?
それだけで、あとはリファレンスを読んだら分かるっていうのなら問題ないが。
273デフォルトの名無しさん:2005/05/10(火) 02:49:03
>>267
窓を出すだけなら一行。
let window = GWindow.window () in let _ = window#show () in GMain.Main.main ()
274デフォルトの名無しさん:2005/05/10(火) 12:35:29
なんやかんや言って、みんな関数型言語ユーザーが増えるのはうれしいので、
267 は失速しない程度にがんばれ。
275デフォルトの名無しさん:2005/05/10(火) 18:43:30
C++におけるSTL・BOOSTの設計思想など、関数型言語が普及する道筋はできている。
276デフォルトの名無しさん:2005/05/10(火) 19:06:24
OO が流行っても Smalltalk が普及しなかった様に…
277デフォルトの名無しさん:2005/05/10(火) 19:51:52
relational databaseが流行ってもdatalogが普及しなかった様に…
278デフォルトの名無しさん:2005/05/10(火) 19:53:29
OOらしいOOの本格的流行は、Javaの出現以降だった様に、
メジャーでポップな関数型言語が現れないと、流行はブレークしないだろうな。

・・・MSR発Visualなんちゃらではない事を祈るw
279デフォルトの名無しさん:2005/05/10(火) 19:58:22
normal reductionが流行ってもHaskellが普及しなかった様に…
280デフォルトの名無しさん:2005/05/10(火) 20:07:14
DSMが流行ってもHPFが普及しなかった様に…
281デフォルトの名無しさん:2005/05/10(火) 20:11:11
マ板ができても、ム板はネタスレだらけの様に…
282デフォルトの名無しさん:2005/05/10(火) 20:21:25
>>276
別に特定の言語が普及してほしいなんて思ってないよ。
肝心なのはスタイルだね。
283デフォルトの名無しさん:2005/05/10(火) 20:51:29
impredicativityが流行ってもFωが普及しなかった様に…
284デフォルトの名無しさん:2005/05/10(火) 21:46:58
267です。
教えていただいてありがとうございます。
先は長そうなので次はもうちょっと詳しそうな解説を探して読んでみます。


文字列はバイト列なんですね。私もString.lengthやString.getで試してみて
納得しました。

lablgtk2を入れて、>>273の1行だけやってみました。
エラーばっかり出て???でしたがチュートリアルを見て
gtkInit.cmoというのが必要なのがわかって、ウィンドウをおがむことができました。

文字列がただのバイト列ということは、gtkで日本語を表示させようと思うと
自分でエンコーディングを変換してやらないといけないんでしょうか。
285デフォルトの名無しさん:2005/05/10(火) 22:09:20
>>282
276じゃないけど、あのブロックの独特のスタイルが普及して欲しいでつ。
286デフォルトの名無しさん:2005/05/10(火) 22:25:03
ruby!!!
287デフォルトの名無しさん:2005/05/10(火) 22:51:25
>>284
270でも書いたけど、camomile
http://camomile.sourceforge.net/
で変換できるよ。

GetTextのようなものはない。……と思ったら、 ocaml-gettext なるものがあった。
http://webperso.easyconnect.fr/gildor/ocaml-gettext.html
ぜんぜん触ったことないから、どんなものなのかは不明。
288デフォルトの名無しさん:2005/05/10(火) 22:53:19
どっちもdebは無いんだよねぇ。
289デフォルトの名無しさん:2005/05/11(水) 03:29:57
ocamlfindがなんか勝手に世界作っちゃってていけ好かないって感じ。
しかも、何か変。
ocamlfind installに一回め失敗しちゃったし、removeしようと思ってもできないし、
手動でインストール失敗したファイル消さないと、続けられなったし。
素人の俺様にも使い易いようにならないかなー。
290デフォルトの名無しさん:2005/05/11(水) 03:32:46
しかも、makeしただけでインストールするなんて変態!
291デフォルトの名無しさん:2005/05/11(水) 03:47:13
MLに限らず処理系特有のライブラリパッケージ管理ツールができるとみんなが不幸になる法則
292デフォルトの名無しさん:2005/05/11(水) 16:17:06
mlgladeのHomeページになぜかアクセスできないんですが…
293デフォルトの名無しさん:2005/05/11(水) 17:23:29
1年半くらい前の話ですまんが、mlglade 使うより、glade2 使って
lablgtk2 の lablgladecc を使ったほうが楽だったよ
294デフォルトの名無しさん:2005/05/12(木) 17:36:10
どうか素人で愚鈍な俺様にお知恵をお貸しください。
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モジュールをリンクしないといけないのではないかと思うのですが、コンパイラオプションに何をどう指定すれば良いのかわかりません。
295デフォルトの名無しさん:2005/05/12(木) 18:03:45
http://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk-list/
のメーリングリストを読んでいたら何だか解決しそうな気がしたので、もう少し良く考えてから発言すれば良かったと思いました。
でも、先に答えを教えてくださった方が楽なので教えてください。
296デフォルトの名無しさん:2005/05/12(木) 18:42:10
lablglade.cma てのがあるみたいだから、それも一緒にリンクしないといけないんちゃう?
297デフォルトの名無しさん:2005/05/12(木) 18:51:49
スレ違いかもしれませんが関連レスとして、
GTK+ではXMLから動的にウィジェッツを作るのが流行りなのですか?
298デフォルトの名無しさん:2005/05/12(木) 19:42:26
>>296
ほんとですねー。READMEにちゃんと書いてありました^^;
The executable must be linked with lablglade.cma.

299デフォルトの名無しさん:2005/05/13(金) 00:25:58
ML勉強して将来的にうれしいことある?
と疑問に思ってる大学生なんですが・・・どうなんでしょ?
300デフォルトの名無しさん:2005/05/13(金) 00:32:07
>>299
どんな将来像を思い描いているの?超エリート中学生の俺様が聞いてやるよ。
301デフォルトの名無しさん:2005/05/13(金) 00:34:42
嬉しいことやりたきゃ、理工系辞めちゃえば。
302デフォルトの名無しさん:2005/05/13(金) 00:36:27
理工系って趣味人だよね。
303デフォルトの名無しさん:2005/05/13(金) 00:39:09
ってかお前ら今の仕事なり何なりに
MLやってたことが役立ってんの?
304デフォルトの名無しさん:2005/05/13(金) 00:44:13
中学生だし。
プログラミングには便利だから使っている。処理系作るのにもOCamlは便利だし、リストが楽に使えるから便利だし。
305デフォルトの名無しさん:2005/05/13(金) 00:46:28
>>303
だからどんな仕事かによるだろ。
306デフォルトの名無しさん:2005/05/13(金) 00:46:47
無駄の無いプログラムの指標で普通の言語を醜いと感じるためにある。
数値計算するんなら R や Scilab があるし。
307デフォルトの名無しさん:2005/05/13(金) 05:25:43
小学生です。
自動定理証明器を作るのに使ってます。
308デフォルトの名無しさん:2005/05/13(金) 11:16:36
>>307
そんなもんに興味持つ小学生がいるわけねーだよ
309デフォルトの名無しさん:2005/05/13(金) 11:43:26
ML勉強して将来的にうれしいことある?とか受身に思わずに、
もしMLが個人的に便利、マンセー、だと思うのなら、
将来はMLを使ってうれしい環境を自ら作る!
ぐらいの気概が欲しいと思われ。

欧米ではそういう奴らが大学外でも既に少数ながら出てきている。
(大学からスピンアウトした人々とか、じゃなくてね)
「強い型付けによる安全性」というフレーズはマーケティングにも
使えないことはない。

じゃあ、俺は?すいません。大学内の人です。
310デフォルトの名無しさん:2005/05/13(金) 14:58:18
逆に言えば、勉強する前から嬉しいことあるか考えるような
現実派にとっては嬉しいことないかもね。

俺も以前はCやJavaとかしか使ったことなかったけど、MLを学んで世界が変わった。
とは言い過ぎか、少なくともプログラム設計の考え方は変わった。
でもMLを学んだせいでCやJavaのプログラム書くのがひどく億劫になった…。
こうなると大学出るのが辛くなるわけです。
311デフォルトの名無しさん:2005/05/13(金) 17:52:40
リストが便利で高速なネイティブ吐ける処理系っていったらOCamlしかない!
312デフォルトの名無しさん:2005/05/13(金) 18:34:49
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って答えを出したいのですが、どうもうまくいきません。
何がまずいのでしょうか?
313デフォルトの名無しさん:2005/05/13(金) 18:50:54
>>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;;
314デフォルトの名無しさん:2005/05/13(金) 18:56:01
誰もが通る道だなw
315デフォルトの名無しさん:2005/05/13(金) 19:07:11
MLの優位性としてあげられる、「型システムによって実行時型エラーが
存在しないことが保証される」という性質って「強く型付けされている」よりも
もっと強い性質だよね。

Cだって強く型付けされている(コンパイル時に型が一意に決まる)
けど、この性質は持っていない。

こういう性質(型システムがsound)のことを一般にどう呼称してるのでしょう?
316デフォルトの名無しさん:2005/05/13(金) 19:09:30
>>313
解決しました。ありがとうございます。


http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/text/eopl006.html
を見て、Exerciseやってる途中でした。
317デフォルトの名無しさん:2005/05/13(金) 19:16:13
好きなの選べ

type safe
type soundness
318デフォルトの名無しさん:2005/05/13(金) 19:26:20
>>309は「強い型付けによる安全性」って言ってるよ。
319デフォルトの名無しさん:2005/05/13(金) 19:39:35
>>315
Cだと領域のサイズが同じなら、全然関係ない型の値でも型変換して代入できたりするけど、これは問題だよね。
320デフォルトの名無しさん:2005/05/13(金) 19:44:49
try
run()
with _ -> print_string 例外の名前

という処理を行うために、例外の名前を取得したいのですが、何か関数はあるのでしょうか?
321デフォルトの名無しさん:2005/05/13(金) 19:50:36
>>318
 >309 「型システムによって実行時型エラーが存在しないことが保証される」という性質って
 >   「強く型付けされている(Strong typed)」よりももっと強い性質だよね。
322320:2005/05/13(金) 21:10:04
解決しました。
Printexc.to_string
323デフォルトの名無しさん:2005/05/13(金) 21:53:24
ML最高
324デフォルトの名無しさん:2005/05/13(金) 21:56:56
ファイルから文字列を読み込みたいです。以下のものを書いてみたのですが、うまくいきません。
2行目でエラーがでるようですが、何が原因なのでしょうか?

let s = ref ""
let f = open_in "test.txt" in
while true do
s <- ref (!s ^ (input_line f))
done
print_string !s

325デフォルトの名無しさん:2005/05/13(金) 21:58:33
エラーの内容を書こうな
326324:2005/05/13(金) 22:03:07
エラーの内容です。お願いします。

ocaml test-openin.ml
File "test-openin.ml", line 2, characters 27-29:
Syntax error
327デフォルトの名無しさん:2005/05/13(金) 22:04:54
さっぱりわからんが構文エラーだそうだ。
328デフォルトの名無しさん:2005/05/13(金) 22:22:37
let s = ref ""
let _ =
let f = open_in "test.txt" in
while true do
s := !s ^ (input_line f)
done;
print_string !s

がんばれ。
329デフォルトの名無しさん:2005/05/13(金) 22:24:33
File "test-openin.ml", line 2, characters 27-29:
Syntax error

これで何をわかれというのか
コンパイラ不親切すぎ
いかにもフリーソフトって感じ
330デフォルトの名無しさん:2005/05/13(金) 22:28:08
>>329
Emacs+tuareg-modeを導入するとエラーの箇所までジャンプしてくれて便利。
331デフォルトの名無しさん:2005/05/13(金) 22:34:12
>>329
ならば是非エラーメッセージの所を書き直してくれ。
改定案を出すだけでもきっと喜ばれると思うぞ。
332324:2005/05/13(金) 22:42:22
>>328
ありがとうございます。やっと解決しました。
333デフォルトの名無しさん:2005/05/14(土) 01:52:59
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 () *)
334デフォルトの名無しさん:2005/05/14(土) 02:10:08
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;
:

インデントを適切にしてくれるエディタを使った方がいいよ。わかりやすいから。
335333:2005/05/14(土) 02:26:23
>>334
なるほど、()で囲むか、begin-endで囲む方法があるのですね。
まだまだ知らないキーワードがありそうですね。
どうもありがとうございます。
336デフォルトの名無しさん:2005/05/14(土) 07:23:10
OCamlのインデントってどうなってるの?
letで下がったりする?
まあいいや。
337デフォルトの名無しさん:2005/05/14(土) 07:56:57
>>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
338デフォルトの名無しさん:2005/05/14(土) 08:17:15
↑馬鹿?
339デフォルトの名無しさん:2005/05/14(土) 22:46:46
>>335
とりあえずemacsでcaml-modeを設定しる
340デフォルトの名無しさん:2005/05/15(日) 17:24:43
みんなocamlのインデントルールってどうしてる?
letのinの前後での改行にいつも悩んでて、どれもすわりが悪い。
あと、引数がいっぱいある関数の適用で、一行にすると長すぎる場合も。
341デフォルトの名無しさん:2005/05/15(日) 18:01:42
MLで書くときはエディタの横幅を160文字にしてる。
342デフォルトの名無しさん:2005/05/15(日) 20:08:23
昔、ocamlのインデントガイドラインていうドキュメントがあったんだけど、いつのまにかなくなってるな。
343デフォルトの名無しさん:2005/05/15(日) 20:23:02
本物のocamlユーザはインデントをしない
344デフォルトの名無しさん:2005/05/15(日) 21:13:01
短ければ
>let i = ... in
>...
長ければ
>let i =
> ...
>in
>...
って書くかな。
自分でもいまいち納得してないんだけど。
345デフォルトの名無しさん:2005/05/15(日) 22:27:18
インデントは臨機応変。
O'Caml のソースを見てもらえばわかりますが、
担当者が変われば細かい部分が変わります。
無理せず、状況に合わせて自分の見易いように
するのがいいかと。
346デフォルトの名無しさん:2005/05/15(日) 22:48:27
>>345
頼むからインデントの方針を統一してくれ。
お前のソースは場所によってインデントの仕方がばらばらだから、読みにくくてかなわん。
347デフォルトの名無しさん:2005/05/16(月) 00:46:22
>>346
人に頼む前に自分でインデント整形フィルターを作った方が楽なのでは?
ocamlプログラマー全員にインデントの方針を統一させるよりよっぽど簡単。
348デフォルトの名無しさん:2005/05/16(月) 01:07:32
346じゃないけど、インデント整形フィルターを作ろうにも、
肝心のインデントルールをどう設定したものか。
349デフォルトの名無しさん:2005/05/16(月) 04:12:30
クオリティテラ高杉
350デフォルトの名無しさん:2005/05/16(月) 15:43:55
おらいりーのML本って結局、出版されるの?
351デフォルトの名無しさん:2005/05/16(月) 16:20:49
ところで、心底、読みたいの?
352デフォルトの名無しさん:2005/05/16(月) 17:20:02
自分で読む気は全くないが、
「オライリーが本出してる言語」という紹介がしたい。
353デフォルトの名無しさん:2005/05/22(日) 15:33:44
五十嵐先生のぐらい網羅的な英語での入門 or チュートリアルってありますか?
354デフォルトの名無しさん:2005/05/22(日) 15:34:07
↑Objective Camlの、です。
355デフォルトの名無しさん:2005/05/22(日) 16:51:04
フランス語ならあるのだが。
356デフォルトの名無しさん:2005/05/22(日) 17:56:38
>>354
http://caml.inria.fr/pub/old_caml_site/tutorials-eng.html
のいくつかは結構良いと思う。
357デフォルトの名無しさん:2005/05/24(火) 18:47:17
OCamlってすごいね
358デフォルトの名無しさん:2005/05/24(火) 23:18:09
OCamlのSet.singletonというのは、
与えられた要素だけを含む集合を新しく作るという理解であっているでしょうか?

標準ライブラリについて詳しい解説のページがあったら教えてください。
http://caml.inria.fr/pub/docs/manual-ocaml/manual034.html では
シグネチャしかわからない……。

359デフォルトの名無しさん:2005/05/24(火) 23:25:34
>>358
その通り。lib/ocaml/set.mli を見ると、

val singleton: elt -> t
(** [singleton x] returns the one-element set containing only [x]. *)

と書いてある。そのまま。

http://caml.inria.fr/pub/docs/manual-ocaml/manual034.html はちょっと
ひどいね。

module type S = sig .. end
Output signature of the functor Set.Make.

sig end の中が消えているので、これでは全くわからん。
いずれにせよ、 http://caml.inria.fr/pub/docs/manual-ocaml/
のライブラリ関係の記述はすべて、 lib/ocaml/*.mli から生成されているので、
そっちを見た方がいいです。それ以上の内容は載っていない。

360デフォルトの名無しさん:2005/05/24(火) 23:39:34
なるほど、lib/ocaml/*.mliを見ると確かに説明が入っています。
教えていただいて非常に助かりました。ありがとうございます。
361デフォルトの名無しさん:2005/05/24(火) 23:56:04
>>358-360
モジュールは別のファイルとして生成されるんだよ。モジュール名のところがリンクになってるじゃん。そのリンクを辿って
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Set.S.html
を見れば、
> val singleton : elt -> t
> singleton x returns the one-element set containing only x.
と同じことが書いてあるよ(当たり前だけど)。
ただ、いちいちwebページ見るのは面倒だというのは同意。
ocamlbrowser は?
362デフォルトの名無しさん:2005/05/25(水) 00:25:54
>>361
module type S = の S がクリックできるんですね。
全然気がつきませんでした。
ページの見出しの「Set」がクリックできるのには気付いたのですが、
そこにあるシグネチャが情報の全てだと思っておりました。

ocamlbrowserというのも初めて知りました。
Intfというボタンで*.mliの中身を表示させられるんですね。
欲を言うとここからドキュメンテーションを抽出してウィンドウ内に表示して
くれるともっといいですね。
363デフォルトの名無しさん:2005/05/29(日) 19:01:02
364デフォルトの名無しさん:2005/05/29(日) 22:38:09
>>363
超燃える。
って言うか、OCaml で書かれた OS だって説明が無いと、誰もクリックしないワナ。
365デフォルトの名無しさん:2005/05/29(日) 23:04:16
ほぉ、凄いね
366デフォルトの名無しさん:2005/06/02(木) 14:01:51
OCamlでサウンドプログラミングがしたいのですが、そういう用途に便利なライブラリはありますか?
367デフォルトの名無しさん:2005/06/02(木) 15:06:43
>>366
ねーよ。 昔、正規表現を使おうとしたとき、ライブラリがオートマトンの教科書レベルで
唖然とした記憶がある。 今は知らないが大して事情は変わらないだろう。
368デフォルトの名無しさん:2005/06/02(木) 15:57:39
>>366
使ったこと無いんで、役に立つかどうかは知らんけど、こんなんはあるみたいよ

ttp://sourceforge.net/projects/ocamlsdl
369デフォルトの名無しさん:2005/06/03(金) 06:28:25
正規表現ライブラリはだめだめだったからサウンドライブラリなんてあるわけない。

↑ナンダソリャー、というのはおいといて、
確かにocamlって正規表現、というか文字列操作(とくに分解)全般に弱いよね。

ocamllex/yaccや簡易パーサは仰々しすぎる。Scanfは表現力に欠ける。
Strは教科書的な正規表現しかなくて、マッチ結果の参照もめんどい。
ocaml-regexpは見た目はいいんだけどpcre必須というのがめんどい。

やっぱりocamlをスクリプトっぽく使おうという発想が間違ってるのかな。
370デフォルトの名無しさん:2005/06/03(金) 06:41:08
haskellとかのライバルはどうなんだろうね
371デフォルトの名無しさん:2005/06/03(金) 07:51:23
鬼車を使ってghcのText.Regexで日本語が使えるようにするパッチがあるらしい。
http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20050209
372デフォルトの名無しさん:2005/06/06(月) 00:50:15
>>369
> ocaml-regexpは見た目はいいんだけどpcre必須というのがめんどい。

pcre 再実装の手間を考えれば、一個の下位ライブラリのインストールくらい
つきあってあげてもバチは当たらないと思われ。

> やっぱりocamlをスクリプトっぽく使おうという発想が間違ってるのかな。

http://martin.jambon.free.fr/micmatch.html
373デフォルトの名無しさん:2005/06/06(月) 01:01:27
pcreが必要で、pcre-ocamlが必要で、そのためにfindlibが必要。findlib嫌い。

micmatchってocaml-regexpとどう違うの?
374デフォルトの名無しさん:2005/06/07(火) 23:02:15
>>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 をスクリプトっぽく使おうという発想だから紹介してみたんだけ
ど、お気に召さないのであれば仕方がない。
375デフォルトの名無しさん:2005/06/08(水) 09:58:39
>いまさらだけど、ocaml-regexpって Yutaka Oiwa の Regexp/OCaml の事だよね?
そうです。

気に入らなかったというより、新規性がわからなかっただけです。つまり、
(micmatch - Regexp/OCaml) = iter_lines_of_channelのような便利関数群
という認識でOK?

正規表現の部分は既存のものがあるのに、使い勝手も変わらなくて、
便利関数群と密接に絡んでるわけでもないのなら何で再発明したのか。
せめて構文くらいあわせりゃよかったのに。
376デフォルトの名無しさん:2005/06/11(土) 08:41:08
いつの間にか、こんなページが…

お気楽 Standard ML of New Jersey 入門
ttp://www.geocities.jp/m_hiroi/func/index.html

参考まで
377デフォルトの名無しさん:2005/06/13(月) 21:02:39
alphaCamlって何するモノ?
378デフォルトの名無しさん:2005/06/17(金) 03:52:15
OCamlのグラフィクスライブラリ使おうとすると、なんかうまくいかないんだけど
(WindowsXP)

例えば
# Graphics.open_graph;;
Reference to undefined global `Graphics'

ってなる。りゆうおしえて。
379デフォルトの名無しさん:2005/06/17(金) 05:21:01
#load せよ。
380デフォルトの名無しさん:2005/06/17(金) 05:44:16
なにお?
381デフォルトの名無しさん:2005/06/17(金) 05:51:34
>>379 thanks
#load "graphics.cma" でなんか動いたような気分になった。
382デフォルトの名無しさん:2005/06/17(金) 07:00:27
let x = e1 in
let y = e2 in
...
のような場合、e1とe2の評価される順序は不定ですよね?
(もちろんe2がxに依存したら話は別ですが)

383デフォルトの名無しさん:2005/06/17(金) 07:55:04
MLはstrictだよ
384デフォルトの名無しさん:2005/06/17(金) 08:39:47
あまり用語に明るくないので、もうちょっと噛み砕いてお願いします…
385デフォルトの名無しさん:2005/06/17(金) 09:49:28
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)
386デフォルトの名無しさん:2005/06/17(金) 18:16:56
>>385
痛み入ります。理解できました。
これはe1,e2に副作用がある場合にその順序を保証するためと考えてよろしいでしょうか?
e1,e2が純粋に計算で副作用がない場合、最適化により順序を入れ替えたり
特定の計算を遅らせるのは問題ないですよね?
387デフォルトの名無しさん:2005/06/17(金) 18:38:02
>>386
無限ループにも注意。
388デフォルトの名無しさん:2005/06/17(金) 20:01:32
Ocamlのグラフィクスライブラリおもしろいね。
でもさ、リファレンスポイントって言うやつ2つ出せないの?
アニメーションで一点しか動かないよ。これじゃあさ。
389デフォルトの名無しさん:2005/06/17(金) 21:36:06
何が面白いのかわからない
390デフォルトの名無しさん:2005/06/18(土) 00:41:57
>>388 Ocmlみたいなショボイ言語じゃ無理。
素直に、Javaにすればいいだけ。
なんだかんだいったって、結局こういうところがいい加減なんだよw
391デフォルトの名無しさん:2005/06/18(土) 00:47:16
所詮見かけ倒しのおフランス産か。
392デフォルトの名無しさん:2005/06/18(土) 01:17:45
Javaもずいぶん偉くなったもんだな。
393デフォルトの名無しさん:2005/06/18(土) 02:01:05
って言うか、>>390 はスレタイを声に出して 3.08.0 回、嫁。
そんでもってこの辺↓逝って好きなだけ叫んでこい。

http://pc8.2ch.net/test/read.cgi/prog/1092882933
394デフォルトの名無しさん:2005/06/18(土) 02:50:35
GraphicsLibひとつとっても、この有様w

Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
Java最強、Ocamlへたれ
ava最強、Ocamlへたれ
395デフォルトの名無しさん:2005/06/18(土) 02:57:30
そうそう,最強だよ Dancing Queen とか Money, Money, Money とかね
岡村なんてめじゃない
396デフォルトの名無しさん:2005/06/18(土) 04:39:30
>>388 二つ出せるだろ?
397デフォルトの名無しさん:2005/06/18(土) 05:45:18
こいつこの間 Lisp スレにも来てたな
無知が露呈して、総スカン喰らってたけど
398デフォルトの名無しさん:2005/06/18(土) 07:13:00
来てたっけ。多分そのときは鬱陶しかったんだろうけど、忘れちゃうもんだな、荒らしが来ても。
399デフォルトの名無しさん:2005/06/18(土) 10:48:02
ヒント:
ignore: 'a -> unit = <fun>
400デフォルトの名無しさん:2005/06/18(土) 11:01:13
>>399
それだ!
401デフォルトの名無しさん:2005/06/18(土) 16:57:21
>>399 何のヒント?
402デフォルトの名無しさん:2005/06/18(土) 17:07:32
>>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スレも低レベルになったもんだな
405デフォルトの名無しさん:2005/06/18(土) 18:08:00
まML自体低レベルだからいんじゃね
406デフォルトの名無しさん:2005/06/18(土) 18:08:56
MLは高レベルだよ
407デフォルトの名無しさん:2005/06/18(土) 18:15:58
アニメーションで一点しか動かないって嘆いている人がいるのに対して
Javaにうつれっていうのが精一杯なのに高レベルなのかよw
408デフォルトの名無しさん:2005/06/18(土) 18:18:00
>>407、放置してほしくて言っているのか?
409デフォルトの名無しさん:2005/06/18(土) 18:20:14
正規表現にしろ、グラフィックにしろMLはだめだめだね。
410デフォルトの名無しさん:2005/06/18(土) 18:22:43
>>408 初心者が間違ってOcamlみたいなインチキ言語
で時間をつぶさないよう、警告してるだけw
411デフォルトの名無しさん:2005/06/18(土) 18:31:35
ここにもキチガイが粘着してるのか。
Ocamlでグラフィックやってるフリって、、、クオリティ超タカスギ
412デフォルトの名無しさん:2005/06/18(土) 18:33:55
普通Haskellやるよね。
だってMLって関数型のフリしたイカサマ言語だもん。
413デフォルトの名無しさん:2005/06/18(土) 18:34:29
>>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より前に評価される。
414デフォルトの名無しさん:2005/06/18(土) 18:41:16
ありゃりゃ、よく見たら随分間抜けな質問だな
415デフォルトの名無しさん:2005/06/18(土) 18:47:20
DQNな発言は控えてください
416デフォルトの名無しさん:2005/06/18(土) 18:47:44
MLこそプログラム言語界のキチガイなんだけどw
417デフォルトの名無しさん:2005/06/18(土) 18:50:00
キチガイに吉外呼ばわりされたMLはもうだめぽ
418デフォルトの名無しさん:2005/06/18(土) 18:58:50
Haskellは無駄の塊。ただのC言語ソースジェネレータ。
MLこそ高速で美しい至高の言語。
419デフォルトの名無しさん:2005/06/18(土) 19:02:02
何に価値を置くかは人の自由だけど、私の勝手な想像では、君等は勉強不足なんじゃないかな?と思う。
420デフォルトの名無しさん:2005/06/18(土) 19:07:19
>MLは、確固とした理論的背景を持つ言語でありながら、

これはそうかもしれんがね、

>現実的なソフトの開発にも使用できる実用性を備えた言語です。

うえの議論でわかるように
グラフィックにしろ正規表現にしろイイカゲン杉
口が滑っても実用的だなんていえないねw

>また、プログラミングの初心者が最初に学習する言語としても
>優れています。

ファw、MLのどこが初心者が最初に学習するのに優れてるんだよw
関数型プログラム -→初心者には意味不明、マズは手続きがただろw
型推論? -→初心者にはわけわからん、っていうか大半のプログラマにとって不要
多相型? -→初心者どころか大半のプログラマにとってわけわからんw

以上。
421デフォルトの名無しさん:2005/06/18(土) 19:12:34
以上、視野の狭いJava厨の意見でした
422デフォルトの名無しさん:2005/06/18(土) 19:12:44
自分=大半
423デフォルトの名無しさん:2005/06/18(土) 19:12:51
………………………… き り と り せ ん …………………………
424デフォルトの名無しさん:2005/06/18(土) 19:15:02
今時 Java 使いでも大半は多相型くらい理解してると思うんだが。GJ で。
425デフォルトの名無しさん:2005/06/18(土) 19:21:35
>>412>>420
>だってMLって関数型のフリしたイカサマ言語だもん。
>関数型プログラム -→初心者には意味不明、マズは手続きがただろw
どうせ荒らすなら最低限意見を統一してから荒らせよって思った。
426デフォルトの名無しさん:2005/06/18(土) 19:23:22
よるするにMLってのは
理屈ではHaskellに負け
速度ではCに負け
実用性ではJavaに負け
いいとこなしの中途半端言語ジャンw
427デフォルトの名無しさん:2005/06/18(土) 19:39:10
………………………… き り と り せ ん ……………………………
428デフォルトの名無しさん:2005/06/18(土) 20:10:06
まあ、とりあえずパターンマッチを勉強してから言いたいことを言ってくれ
429デフォルトの名無しさん:2005/06/18(土) 20:54:09
まあ、実際のところ
MLが誇れるものってパターンマッチングだけだからねw
430デフォルトの名無しさん:2005/06/18(土) 21:35:14
C/C++とPerlぐらいしか使えなかった俺が最近ocamlを始めた訳です。
パターンマッチングだけをとってみてもSugeeeeeeeeeeeeeeeYO と思いました。
haskellもjavaも良いのかもしれないけど、俺はこの先ocamlと共に生きようと思いました。


だから、お願い。このスレ荒らさないでね。
431デフォルトの名無しさん:2005/06/18(土) 21:39:00
だったらグラフィクスで2点同時に動かしてみろ世w
432デフォルトの名無しさん:2005/06/18(土) 21:49:02
グラフィックス…ごめん、興味わかねーや。自分でやって。
433デフォルトの名無しさん:2005/06/18(土) 22:06:36
と言ったもののあんまり邪険にするのもなんだし、参考までに。

ttp://aa.2ch.net/aastory/kako/1033/10334/1033401566.html

一応俺の環境ではすごく動いた。
434デフォルトの名無しさん:2005/06/18(土) 22:54:03
↑imifume
435デフォルトの名無しさん:2005/06/19(日) 01:56:00
>>401
今さらだが…
おれは>>399ではなくて>>400だが、
>>399>>398のヒントだと思うぞ。

つまりは、餌を与えずに ignore でスルーしる。
そういう事だな。
436デフォルトの名無しさん:2005/06/19(日) 02:04:45
pattern matchingの実装について書かれた日本語資料知っている人いない?
英語版ならいっぱいあったし、たとえば
http://caml.inria.fr/pub/ml-archives/caml-list/2005/03/e86bc87bc8fbc81715dedfedd1687cdb.en.html
この辺の議論から辿れたんだけど。
日本語版の資料を知っている、という人がいたら検索用のポインタでも示してくれないだろうか。
お願いします。

どーでもいーけどperl使いの人に「パターンマッチが素晴らしいんだよ!」と言ったら
「文字列処理ならperlでもできるよ」って言われた。文字列じゃないよ……。
437デフォルトの名無しさん:2005/06/19(日) 02:52:34
オリジナル資料読め
438デフォルトの名無しさん:2005/06/19(日) 02:54:21
「perl使いの人に言ったら」=「2ちゃんのperl関連スレでMLの話題で荒らしをやったら」
439デフォルトの名無しさん:2005/06/19(日) 04:35:48
理屈ではHaskellの次、
速度ではCの次、
実用性ではJavaの次だったら
間違いなく現時点で最強クラスの言語だよ。

OCamlのGraphicsははっきり言ってできの悪いライブラリなので、
OCamlSDLを見てみるといいんじゃないかな。
何がやりたいのか全然わからないけど。
440デフォルトの名無しさん:2005/06/19(日) 05:45:30
Graphics.open_graph で1つグラフィクスウィンドウが開くじゃないですか。

Graphics.current_point();;
で現在のreference pointの位置が返ってくるんです。
このreference pointってのを使って絵とか描くんですけど、
これ2つ以上だせないのかってことなんです。
1つしか出せないとアニメーションで1点しか動かないことになるじゃないですか
それはめんどうなので4ッツくらい動かしたいわけなんですが。
どうしたらよいかというところなんです。
できるって書着込みもあったんで調べてみたんですけど。わからないので。
441デフォルトの名無しさん:2005/06/19(日) 06:32:52
>1つしか出せないとアニメーションで1点しか動かないことになるじゃないですか
>それはめんどう

できないと思ってるのか、面倒だと思ってるだけなのか。
前者なら可能だ。順番に描いていけ。後者なら諦めろ。
OCamlのGraphicsを本気で使うやつなんかいない。
442デフォルトの名無しさん:2005/06/19(日) 06:36:33
>>441 訂正
OCamlを本気で使うやつなんかいない。
443デフォルトの名無しさん:2005/06/19(日) 06:55:02
荒らしはともかく、実際問題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;;
446sage:2005/06/20(月) 19:23:20
日本人はアンマ使わんかもしれんが、mldonkey はなかなかすごいと思うよ。
他は、The Hump (http://caml.inria.fr//cgi-bin/hump.en.cgi) に行って
調べてください。
447デフォルトの名無しさん:2005/06/21(火) 00:30:05
>>437
了解。なさげなのであきらめてちゃんと読みます。
448デフォルトの名無しさん:2005/06/21(火) 11:19:06
パターンマッチの実装について述べた日本語文書で見たことあるのは

纓坂 智, 『型に基づくパターンマッチングコンパイル方式の構築と実装』
北陸先端科学技術大学院大学 修士論文, 2004

PDF直リンするのは気が引けるのでググって頂戴。
449デフォルトの名無しさん:2005/06/21(火) 21:10:37
日本語プログラム言語「なでしこ」板
http://pc8.2ch.net/test/read.cgi/tech/1098179243/544
>俺ならMLでスマートに書くけどねw



さすが、ML・・・
450デフォルトの名無しさん:2005/06/21(火) 21:36:38
ocamlってわりと早いよね。C++より早いのに、どうして誰も使おうとしないんだろう??
451デフォルトの名無しさん:2005/06/21(火) 21:59:43
Python並にライブラリが整備されてたら使う。
452デフォルトの名無しさん:2005/06/21(火) 22:08:57
でもPythonはスクリプト言語として使うために作られた言語でしょう?
453デフォルトの名無しさん:2005/06/21(火) 22:14:22
>>436

関数型言語でいうパターンマッチングって、正規表現とは異なるコンセプトなんですか。
正規表現によるパターンマッチングの対象はテキストですが、
こちらで話題になるパターンマッチングとは、どういったものなのでしょうか。


他言語の仕様では実現されていない機能なのでしょうか?
説明を聞いてみたいのですが・・
454デフォルトの名無しさん:2005/06/21(火) 22:26:29
>>452
だから何?

ocamlってコンパイル言語界のRubyだと思う。
言語仕様の信者はいるが、普及も中途半端。ライブラリも中途半端。
455デフォルトの名無しさん:2005/06/21(火) 22:30:49
関数言語界の Eiffel
456デフォルトの名無しさん:2005/06/21(火) 22:38:24
>>453
Prologの単一化(ユニフィケーション)を一方通行にしたイメージ。
特にリスト操作はPrologとソックリ、だった気がする
457デフォルトの名無しさん:2005/06/21(火) 22:39:07
海外では流行って…
458デフォルトの名無しさん:2005/06/21(火) 22:45:50
積極的に使っていかないと。
そして、「このプログラムはMLで書かれてます」
と再生紙の様な宣伝もする。
459デフォルトの名無しさん:2005/06/21(火) 22:55:00
つかあれは専門教育用プログラミング言語として流行っているだ(略
そもそも専門教育で関数言語やって奥の奥まで理解しちゃった奴を
業務命令で集めてソフトウェア開発しても
いったいどれだけ人件費が^H^H^H^H^H^H^H^H船頭多くして舟、陸に(略
460デフォルトの名無しさん:2005/06/21(火) 22:56:33
だからM$やGoogle、ThoughtWorksのような企業は奇跡的なんだよな
461デフォルトの名無しさん:2005/06/21(火) 23:10:16
>>459
そんだけ打つなら ^W か ^U で良いだろw
462デフォルトの名無しさん:2005/06/21(火) 23:24:39
>>459
こいつの意見に賛成なんだけど↓
http://www.shiro.dreamhost.com/scheme/trans/gh-j.html
463デフォルトの名無しさん:2005/06/21(火) 23:28:34
>>462
>とびぬけてセクシー
は読んだ。
464デフォルトの名無しさん:2005/06/21(火) 23:48:22
>>448
指導教官と審査委員がその筋の人だね
465デフォルトの名無しさん:2005/06/21(火) 23:53:58
>>453
自分で説明するのがめんどいので適当にURL貼り

バリアント型に対するパターンマッチが強力な例として適当かな
ttp://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html#htoc58

簡潔に説明するのは難しいな……式の形というか、変数の値と種類にマッチするという感じか
466デフォルトの名無しさん:2005/06/21(火) 23:56:34
>>465
補足。
OCamlだけでなく、SMLやHaskellにもある。

ついでに、C++にboostで同様の機構をつけようという試み
ttp://lists.boost.org/MailArchives/boost/msg54133.php

まーパターンマッチのありがたみは使ってみないとわからんかもなぁ。
467デフォルトの名無しさん:2005/06/22(水) 00:05:44
>>453
>他言語の仕様では実現されていない機能なのでしょうか?

Lisp だとこんな感じ

ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/cmuclMemo.html#0019
468デフォルトの名無しさん:2005/06/22(水) 00:14:55
関数型言語におけるパターンマッチングの解説をしてくださった皆さん、ありがとうございます。
文章の咀嚼を試みてみます。

どうやら、正規表現よりも広い概念なんですね。
その機能を有効に用いる場面とは、どのような事例が考えられるのでしょうか。
469デフォルトの名無しさん:2005/06/22(水) 00:24:05
C で言うと、case 文の超強力版?
470デフォルトの名無しさん:2005/06/22(水) 00:26:17
>>468
というか、正規表現による文字列のマッチングとは基本的に無関係。

よく使うのは……というかOCamlでプログラム書いたらほとんどパターンマッチだからな。

一番良く使うのはリストの空リスト/空でないの場合分けと先頭の取り出しや、
バリアント型の種類による場合分けとかかね。

と説明しても多分理解できないだろうから、理解したければ書いてみてください、としか言いようがないが…
471デフォルトの名無しさん:2005/06/22(水) 00:42:56
>>454
関数型言語からオブジェクト指向言語にアプローチしたのがOcaml
オブジェクト指向言語から関数型言語の考え方を取り込んだRuby

どちらも共通しているのは道具としては優れてるが何に使うのか目的がない。

個人的には高速性を生かしてWindowsAPIラップしまくって
軽量級アプリケーションを作ることに特化すればまだ生き残れるのではないかと思う。

C++とC#の間のニッチを狙うことになるけどね
472デフォルトの名無しさん:2005/06/22(水) 00:46:30
………………………… き り す て …………………………
473デフォルトの名無しさん:2005/06/22(水) 16:05:18
結局、ライブラリそろったもん勝ちだろ
そのためには、ユーザーが多くいなきゃならんが
マイナーだから拍車をかけるかな
474デフォルトの名無しさん:2005/06/22(水) 16:28:57
………………………… き り す て …………………………
475デフォルトの名無しさん:2005/06/22(水) 16:43:02
>>471
OCamlのオブジェクト指向の機能はオマケだよ。
476デフォルトの名無しさん:2005/06/22(水) 18:37:11
そうだね
全く必要ない

結局あれだろ?
名前空間がツリー構造にでもなってて、
object.methodみたいな呼び出しができれば、
それがオブジェクト指向かどうかは問わないんだよ
477デフォルトの名無しさん:2005/06/22(水) 21:48:40
関数型だとObject思考はオマケになりがちですが、
その理由は透明参照性ですか。
それとも、構造に汎用性もないし駄目ポってことですか。
478デフォルトの名無しさん:2005/06/22(水) 22:08:03
>>477
> 関数型だとObject思考はオマケになりがちですが、
この発言は関数型言語を広く知ってないと出来ないが、

> その理由は透明参照性ですか。
これを見るとその知識(not 知恵)に疑問符がつく。
479デフォルトの名無しさん:2005/06/22(水) 22:12:06
猿の相手する必要ナッシング
480デフォルトの名無しさん:2005/06/22(水) 22:13:41
http://www.google.com/search?q=%22%E9%80%8F%E6%98%8E%E5%8F%82%E7%85%A7%E6%80%A7%22&num=50&hl=ja&lr=lang_ja&c2coff=1&filter=0
"透明参照性" の検索結果 15 件中 日本語 のページ 1 - 15 件目 (0.55 秒)

ぷぷ。日本に三人しか居ないや
481デフォルトの名無しさん:2005/06/22(水) 22:20:08
>>477
メジャーなオブジェクト指向表現ではフィールド変数をメソッド関数で操作するよね。
その操作自体が副作用だからだよ。
482デフォルトの名無しさん:2005/06/22(水) 22:31:20
だから透明参照性を保つためかってこと。
逆の事言ってんだからわかるだろ。
483デフォルトの名無しさん:2005/06/22(水) 22:43:15
オブジェクト指向設計の場合何があるかを最初に考えるけど、関数型の場合は何を何にするか(具体的な値の計算方法ではなく、入力と出力の型がどうなるか)を考えるからかなぁ。

2つは別ものじゃない気もするが、なんとなく、考え方が違うような。
484デフォルトの名無しさん:2005/06/22(水) 22:59:56
>>481
レコード型で解釈するんじゃなかったっけ、
オブジェクト指向計算の理論では
485デフォルトの名無しさん:2005/06/23(木) 02:27:19
>>481
関数型ベースでなくてもimmutableなオブジェクトを扱えるOOPLなんて
掃いて捨てるほどありますが、何か?
486デフォルトの名無しさん:2005/06/23(木) 02:54:56
>>485
immutableなオブジェクトを扱えるかどうかではなくて、immutableなオブジェクトだけかどうかが問題なのでは。
487デフォルトの名無しさん:2005/06/23(木) 04:20:54
>>486
わざわざimmutableなオブジェクトを作れるようになっているぐらいだから、
副作用の有無はオブジェクト指向の本質ではないということ。
488デフォルトの名無しさん:2005/06/23(木) 04:42:41
オブジェクト指向言語にimmutableを求めるのは筋違いだろう。
実際、SingletonやStrategy,Functorばかりの設計は、
眩暈がするほどCOBOLソックリだ
489デフォルトの名無しさん:2005/06/23(木) 06:27:17
え、funtorがcobolって・・・
詳しく(藁
490デフォルトの名無しさん:2005/06/23(木) 07:04:37
典型的なcobolプログラムは、構造化された入力データ圏から出力データ圏への準同型写像
になりそうではあるな。両者を項代数とみなせばfunctorと言える。
491デフォルトの名無しさん:2005/06/23(木) 10:21:47
>>490
> 典型的なcobolプログラムは、構造化された入力データ圏から出力データ圏への準同型写像
> になりそうではあるな。

・・・ならないと思われ・・・
492デフォルトの名無しさん:2005/06/23(木) 10:47:45
493デフォルトの名無しさん:2005/06/23(木) 13:21:30
>>487
作れるがそれは補助的なものであって、あるから本質的ではないというものではないかと。

例えばCamlは副作用のある式がそのまま書けるが副作用が無いことは関数型言語の本質ではないかというと違うわけで。本当は書きたくないが、書かざるを得ないか、書いたほうが便利だったり楽だから使っているわけで。

オブジェクト指向だって本当はオブジェクト同士のメッセージパッシングだけでやりたいけど利便性とか速度とかのためにメソッドやら静的メソッドやら実装の継承やらがあるし。
494デフォルトの名無しさん:2005/06/23(木) 15:43:38
>>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に相当する部分が
手続き的であろうが関数的であろうが関係なく、計算能力と
コミュニケーション能力を持つ「実体」であればそれでよいのです。

> オブジェクト指向だって本当はオブジェクト同士のメッセージパッシングだけでやりたいけど利便性とか速度とかのためにメソッドやら静的メソッドやら実装の継承やらがあるし。

あのー、メッセージとメソッドの関係、ちゃんと整理できてます?
495デフォルトの名無しさん:2005/06/23(木) 16:17:42
>>494
関数型が素直に「実体」を扱えるか、って話じゃないの。
「実体」なんてものが「activity」を持つには、変化できることが必要でしょ。
関数型の世界ってのは、実体のない関数と、永遠に変化しない値の世界。
「実体」なんて Monad の中くらいにしか存在できないんじゃない。

immutable なオブジェクトだけで何もかもを組み上げるような OO があるなら、
それは関数型でも実装できるかもしれないけど。
496デフォルトの名無しさん:2005/06/23(木) 20:47:28
>>495
> 関数型の世界ってのは、実体のない関数と、永遠に変化しない値の世界。

違うだろ。状況計算。
497デフォルトの名無しさん:2005/06/23(木) 20:49:10
>>494
煽るのも良いが、実装例を示す等の具体的な話が無いと議論にならないと思われ
仮想的な、関数型オブジェクト指向言語 hoge についてでも良いけど
498デフォルトの名無しさん:2005/06/23(木) 21:16:45
>>495
副作用がなければactivityにならないということ?
煽り抜きで、関数型スレでそんな意見が出てくるのって、
すごく新鮮だと思った。
499デフォルトの名無しさん:2005/06/23(木) 21:18:06
>>495
実体のない関数ねえ・・・
関数型言語の関数が実体でないのなら、一体何が実体なんだろう??
500デフォルトの名無しさん:2005/06/23(木) 21:27:27
実態 == 状態って事じゃないの
501デフォルトの名無しさん:2005/06/23(木) 22:43:53
俺ならMLで簡潔に書くんだけどね。
502デフォルトの名無しさん:2005/06/23(木) 22:47:45
OOP の本質でない private 変数は廃絶だ!
503かわいそうな人だねえ:2005/06/23(木) 23:15:56
504デフォルトの名無しさん:2005/06/23(木) 23:17:23
#define private public でいいじゃん

若しくは全部すけすけに見えちゃう Python に乗り換えて、
Pythonで関数プログラミングをかじったら、MLへ。

んで、たくましくなった >>502 が上の議論のばっさり切る。
505デフォルトの名無しさん:2005/06/23(木) 23:24:27
変なのがしつこく粘着してるな、
506デフォルトの名無しさん:2005/06/24(金) 14:56:02
さてさて、わりとMLに縁のあるICFPプログラミングコンテストが
日本時間今晩23時から始まりますよ。

http://icfpc.plt-scheme.org/
507デフォルトの名無しさん:2005/06/29(水) 04:22:36
OCamlでbignumを扱うにはどうすればいいですか?
1048576 * 1048576を計算したら0になってしまいました (i386)。
508デフォルトの名無しさん:2005/06/29(水) 12:28:52
(* #load "nums.cma" *)
open Nums
num_of_int 1048576 */ num_of_int 1048576

結果を可視化するなら string_of_num。
巨大数だけなら Bit_int もあるけど、Nums は 1.演算子が定義されている、2.有理数が扱える、という点で楽。
509デフォルトの名無しさん:2005/07/02(土) 11:25:05
http://www.speakeasy.org/~hchomsky/ocaml-win32.html
これはWin32のAPIが使えます。

をCygwin環境でmakeするんですがエラーが出ます。
もし使ったことある方いましたらビルドの仕方教えてください。
510デフォルトの名無しさん:2005/07/03(日) 08:15:47
Requirements:
- OCaml version 3.04 or higher (3.06 or higher recommended), native Win32 port
- Microsoft Visual C++ version 6
511デフォルトの名無しさん:2005/07/03(日) 10:18:59
相変わらず低スキルなのが粘着しているな。
ビルドのやり方もわかんねぇガキは、
cygwin ming gcc版バイナリでも使ってろ
512509:2005/07/03(日) 13:23:04
Cygwin(比較的最新バージョン)+Ocaml-3.083

でocaml-win32の中にMakefileがあるのでmake打ったのですが、
Makefile:75: *** missing separator. Stop
と出てしまいます。

環境が悪いのか、ビルド方法自体間違ってるのかわかりません。
よければ教えてください。
513509: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.

パッケージはこれを使ってます。
514デフォルトの名無しさん:2005/07/03(日) 13:45:04
>>510が読めないのか?
コンパイルにVC++6が必須なんだよ。
そのMakefileはnmake用だ。
515509:2005/07/03(日) 14:54:02
VC++6は持ってるんですが、
具体的なビルド方法がわからない・・・orz
516デフォルトの名無しさん:2005/07/03(日) 15:06:38
Visual C++ の bin/ にパスを通して nmake すればいいんじゃないかな。
INCLUDE や LIB 環境変数も適当に設定する必要があるかも。

こういうのもなんだけど、ビルドできたその先も茨の道だから
それなりの問題解決能力や VC++ についての知識がないなら
やめた方がいいんじゃないかな。
517509: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
がエラーの原因だと思うのですが、よくわかりません。

テストプログラム動作確認までどうしてもやりたいのでよろしくお願いします。
518デフォルトの名無しさん:2005/07/03(日) 18:41:27
>>517
cmd.exe上でnmakeしろ。

こういうのもなんだけど、ビルドできたその先も茨の道だから
それなりの問題解決能力や VC++ についての知識がないなら
やめた方がいいんじゃないかな。
519デフォルトの名無しさん:2005/07/03(日) 19:47:59
>>517
-ccopt 〜
ってのはCコンパイラに渡すオプションを指定する。
だから /W3 /YX /Fpwin32.pch /Fowin32_c ってのはCコンパイラのオプション。
でも、gccにはそんなオプションは存在しなくて、
Cygwinのgccでは / はパス区切りと認識するからそのようなエラーが出る。

結局、516, 518が言っているように、
Cygwin上ではなくて、cmd.exe上でVC++のコマンドラインコンパイラが使えるように
環境変数を適切に設定した上でnmakeしなければビルドできない。
520& ◆SQ2C4WavXQ :2005/07/03(日) 20:22:05
度々ありがとうございます。
cmd.exeでVC++のbinとOcamlのbinのパスを環境変数に設定しました。
そしてnmakeすると、

CL.EXE - コンポーネントが見つかりません

mspdb60.dllが見つからなかったため、このアプリケーションを開始できませんでした。
アプリケーションをインストールし直すとこの問題は解決される場合があります。

となりました。
これは、VC側の問題・・・?

今、手元にVC++6のCDがないため、明日再インストして試してみます。
521509: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のサイトライセンスがあるのなら、
ライセンス管理者か、詳しい人に聞きゃええやん(大笑
524519:2005/07/03(日) 21:51:32
> 環境変数を適切に設定した上で
と言ったのに

> cmd.exeでVC++のbinとOcamlのbinのパスを環境変数に設定しました。
PATHだけ設定してもな。

516が
> INCLUDE や LIB 環境変数も適当に設定する必要があるかも。
って言ってるんだから、VC++ 環境変数 でぐぐるぐらいしなさいな。

とりあえず 522 が挙げてくれたキーワードでぐぐってみ。
525509: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デフォルトの名無しさん:2005/07/03(日) 22:35:55
>>524
知らない人は答えなくていいです。
527デフォルトの名無しさん:2005/07/03(日) 23:03:17
>>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 ですよね。
529デフォルトの名無しさん:2005/07/04(月) 02:46:20
いみふめ
530デフォルトの名無しさん:2005/07/04(月) 03:19:58
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html#htoc70
とかかな。
簡単にいうと、副作用が含まれる場合には型安全でなくなるからかな。
531デフォルトの名無しさん:2005/07/04(月) 07:00:49
相変わらずお前の質問は、間抜け過ぎて解答しようがない&元ネタ付きだな。
哀れな奴
532デフォルトの名無しさん:2005/07/04(月) 07:02:28
質問>>528と解答>>530のズレっぷりが、痛々しさを増幅している
533デフォルトの名無しさん:2005/07/04(月) 07:54:02
そんで元ねたは言わないのな
534デフォルトの名無しさん:2005/07/04(月) 07:59:25
朝からファビョるな。鬱陶しい。
535warorz:2005/07/04(月) 11:42:54
祈念化キコ挙げ
536デフォルトの名無しさん:2005/07/04(月) 11:55:24
>>528
value polymorphismという言葉を知っているのに、
何故その理由が解らない?
537デフォルトの名無しさん:2005/07/04(月) 11:59:21
取り敢えず学校で出て来てくだしあ
538デフォルトの名無しさん:2005/07/04(月) 14:37:07
>>533
T大のML演習の課題だった
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という型付けが
可能ということですか。
540デフォルトの名無しさん:2005/07/04(月) 16:42:05
>>530がはってくれたリンク先にすべて書いてあるだろ?
日本語は書けても読めないのか?
どうしてもわからんのなら明日の夜教えてやるw
541sage:2005/07/04(月) 20:01:47
どこで?7号館?
542デフォルトの名無しさん:2005/07/04(月) 20:22:16
明日じゃ遅いのです
543デフォルトの名無しさん:2005/07/04(月) 21:35:12
学部生のプログラム演習受講者レベルで
大学名晒す厨房っぷりに萎え萎え
544デフォルトの名無しさん:2005/07/05(火) 03:21:00
やれやれ
また東大コンプレックスかい?w
545デフォルトの名無しさん:2005/07/05(火) 04:45:04
小学生レベルの煽りだな
546デフォルトの名無しさん:2005/07/05(火) 06:06:28
俺も東大ですが何か
547デフォルトの名無しさん:2005/07/05(火) 06:13:30
お兄ちゃん、わたしその学校知ってるよ。
神田にあるやつだよね!
548デフォルトの名無しさん:2005/07/05(火) 06:27:45
マジレスしてみる。

項を多相型として扱えるかどうかを判断することは一般的に不可能(決定不能)。
なので確実に多相型として扱える値だけを多相型として扱う、
というのがOCamlが採用しているvalue polymorphism。
もちろんこれは十分条件で、多相型として扱えるはずのものが
多相型として扱えなくなる場合がある。例えばid id。
この項は多相型として扱えるはずだが、
関数適用であり値ではないため多相型にならない。
549デフォルトの名無しさん:2005/07/06(水) 23:37:25
質問ですが、
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;;)
解決法ありませんか?
550デフォルトの名無しさん:2005/07/07(木) 01:10:08
SMLにはOcamlのocamlcとかocamloptに相当するものは無いの?
551デフォルトの名無しさん:2005/07/07(木) 07:07:31
>>549
環境変数OCAMLLIBがおかしくない?
Windows版のOCamlをいれると勝手に設定されるよ。

それで解決しなければocamlc -verbose -custom f.mlした結果を貼ろう。
552デフォルトの名無しさん:2005/07/07(木) 08:56:53
・cygwinの開発環境パッケージ、特にbinutilsが入っていないとか、
・gccのインストール状況が不完全で、gccが内部使用するツール(binutils)を呼び出せない
といったレベルの問題だと思う。
まずはC コンパイラーが動作する事を確認汁
553デフォルトの名無しさん:2005/07/07(木) 13:44:03
>>550
mltonは普通にコンパイルできるよ。
554デフォルトの名無しさん:2005/07/08(金) 15:38:06
gccの内部には詳しくないが、>>549のエラーログを見る限り
ldはちゃんと起動してるからbinutilsが入ってないことはないだろう。
というか、libcamlrun.aを見つけられないだけじゃないのか。

>>549
もしまだ悩んでるようならocamlc -whereの結果をみせてみ。
555デフォルトの名無しさん:2005/07/08(金) 18:53:37
> (省略)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}
してやればいーんじゃねぇの?
556デフォルトの名無しさん:2005/07/11(月) 05:05:32
>>445 なんだかわからないけど、
グラフィック画面にすごい数のポイントが行ったりきたりしてますよ。
これつかえるかもしれないんで、試してみます。どうも。
557デフォルトの名無しさん:2005/07/12(火) 20:12:06
>>445のやつはUnbound value plot_pointって出るけど何で?
558デフォルトの名無しさん:2005/07/13(水) 13:38:52
let plot_point p = plot (fst p.p) (snd p.p);;
とでも定義しておけ。
559デフォルトの名無しさん:2005/07/14(木) 23:28:40
The external function `caml_gr_plot' is not available
560デフォルトの名無しさん:2005/07/14(木) 23:45:27
>>559
#load "graphics.cma";;
561デフォルトの名無しさん:2005/07/15(金) 10:44:58
445 ですが、、、
>> 557, 559
いくらなんでも自助努力が足りないんでないかい?
562デフォルトの名無しさん:2005/07/15(金) 18:20:34
教えてくれる人がいるなら頼るのが正解
563デフォルトの名無しさん:2005/07/15(金) 21:27:55
MLに手をだして数ヶ月。
久々にCのプログラム書くことになった。
配列処理が必要だったので、
for (int i; i <
ここまでかいて、
「うわっ、やってらんね。」とMLの偉大さを知った。

マンセー房ぽいが、まじめな話、
1年くらいやったら、ループがかけなくなりそう・・・orz
564デフォルトの名無しさん:2005/07/15(金) 21:37:25
配列処理が一番楽なのはfortran(90以降)だと思う。
565デフォルトの名無しさん:2005/07/15(金) 22:20:35
>>563
MLだと不便なコードもあれば、Cで書かないと非効率的なコードもある。
言語は使い分けることで全体の効率がよくなる。
566デフォルトの名無しさん:2005/07/16(土) 02:55:13
久々に書いたCで関数宣言に型をつけ忘れてコンパイルエラーになったことはあるな。
567デフォルトの名無しさん:2005/07/16(土) 05:04:22
>>565
まあ、MLで書いた方が簡単なコード100に対して、1ぐらいはそういうコードがある
かもね。
568デフォルトの名無しさん:2005/07/16(土) 14:34:06
>>567
では、MLでデバイスドライバ書いてください。
569デフォルトの名無しさん:2005/07/16(土) 15:11:53
MLは文字列処理に弱いと思う。Cはその数百倍弱いけど。
570デフォルトの名無しさん:2005/07/16(土) 15:24:17
>>568
ML で OS が書けるんだから、デバドラも当然書けるんじゃね
Windows のドライバを書けとかなら厳しいかもしれんが
571デフォルトの名無しさん:2005/07/16(土) 15:54:07
>>568-570
ドライバを書いたこともないやつがほざくなよ。
572デフォルトの名無しさん:2005/07/16(土) 16:18:31
>>570
> ML で OS が書けるんだから、デバドラも当然書けるんじゃね

ポカーン
573デフォルトの名無しさん:2005/07/16(土) 17:17:49
しぃー、可哀想な人のことじっと見ちゃダメ!
574デフォルトの名無しさん:2005/07/16(土) 20:15:17
>>568
世間に存在する全ソースコードは、世間に存在するドライバの
全ソースコードの100倍以上あるだろうけどね。
575デフォルトの名無しさん:2005/07/16(土) 20:22:48
あたまわる。
576デフォルトの名無しさん:2005/07/16(土) 20:26:09
あまりのことにひっくりかえった。なんだこりゃ。
577デフォルトの名無しさん:2005/07/16(土) 20:40:16
>>575-576
論破されて必死ですねw
578デフォルトの名無しさん:2005/07/16(土) 20:41:22
>>577
スレの質落としたいのか?
579デフォルトの名無しさん:2005/07/16(土) 20:42:11
>>578
575と576のことかい?
580デフォルトの名無しさん:2005/07/16(土) 20:49:54
=====================
談話解析と文章生成プログラムのテスト中です。
ときどき暴走しますが、所詮プログラムのする事で
悪意も善意も一切ありませんので。よろしく。
=====================
581デフォルトの名無しさん:2005/07/16(土) 20:59:27
もうMLスレもおしまいだな。
なぜかOCaml使いが増えて、スレが賑わってきたと思ったらバカな連中ばかりで、議論の質もずいぶん下がった。
2ちゃんねるはもはや何の情報源にもなりそうにない。
582デフォルトの名無しさん:2005/07/16(土) 21:06:55
よっぽどCのファンなんだろうけど、多くの場合のおいて
MLの方が優れているという現実を見つめよう。
他人が馬鹿なせいにするのは簡単だけどねw
583デフォルトの名無しさん:2005/07/16(土) 21:12:00
>>581
まぁ今荒らしてるバカは、
かつてはRubyスレやOOスレに居座って荒らしを続け、
最近はデザパタスレや推薦図書スレを猛烈な勢いで荒らしてるばかちんなわけだが。
つかもともと学生と教官の対話しかねぇじゃんこのスレ。
584デフォルトの名無しさん:2005/07/16(土) 21:19:24
初心者練習用コードの集合って大きいなあ。
585デフォルトの名無しさん:2005/07/16(土) 21:44:11
まあ、ただCよりMLが優れてるって言われただけでムキになって
大暴れするような奴よりは、このスレはレベル高いんじゃない?w
586デフォルトの名無しさん:2005/07/16(土) 21:49:03
恥ずかしい奴だな
その粘着力を実生活に活かせよ
587デフォルトの名無しさん:2005/07/16(土) 22:30:58
>>585
誰も彼もひとまとめにするなよ。
誰に言っているのか自分でも分かっているのか?
588デフォルトの名無しさん:2005/07/16(土) 23:07:44
>>572
ML で OS を書いたら、当然その OS のドライバも ML で書くようにするんじゃないの?
少なくとも、TCP 等の仮想デバイスのドライバは ML で書くんじゃないかね
良く知らんけど、LispM 用のドライバは Lisp で書かれてないの?
589デフォルトの名無しさん:2005/07/16(土) 23:09:04
唐突に質問ですが、

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
で型指定してるのになぜ・・・?
590デフォルトの名無しさん:2005/07/16(土) 23:55:15
自己解決しました。

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のデバイスドライバは、な。
593デフォルトの名無しさん:2005/07/17(日) 04:48:47
MLでOSを書いた場合、GCはOSに必要でしょうか
594デフォルトの名無しさん:2005/07/17(日) 04:51:03
C で書かれた UNIX のデバイスドライバは、C で書かれる事が多いと思うけど?
595デフォルトの名無しさん:2005/07/17(日) 05:07:38
>>594
ほんとそうだよね。>>570にもわかるように教えてやってよ。
596デフォルトの名無しさん:2005/07/17(日) 05:11:10
Cで書いた方がいいプログラム

・Cで書かれたUNIXなどのデバイスドライバ

以上
597デフォルトの名無しさん:2005/07/17(日) 05:21:19
で、>>591 はどうなったの?
598デフォルトの名無しさん:2005/07/17(日) 05:56:44
>>597
591のどこかに問題あるのか?
599デフォルトの名無しさん:2005/07/17(日) 05:57:36
問題があるとすれば、588のどこがアホ丸出しなのか
さっぱりわからないということぐらいかな。
600デフォルトの名無しさん:2005/07/17(日) 06:00:54
>>599
588が572への反論として成立するためには
(1) ほとんどのOSがMLで記述されている、または
(2) ML以外で実装されているOSのデバイスドライバを記述するのにMLが向いている
のいずれかが成立していなければならないが、
(1)は呆らかに成立しないし、(2)は591にある通り588自身の主張に矛盾する。

以上により588はマヌケな粘着バカであることが証明された。
601デフォルトの名無しさん:2005/07/17(日) 06:06:52
夏ですなぁ。
602デフォルトの名無しさん:2005/07/17(日) 06:18:08
>>600
>(1) ほとんどのOSがMLで記述されている、または
>(2) ML以外で実装されているOSのデバイスドライバを記述するのにMLが向いている
>のいずれかが成立していなければならないが、

この前提が間違い。
もともと588は

>では、MLでデバイスドライバ書いてください。

に対する反論であったはず。
MLで書いたOSのデバイスドライバなら書けることを示すだけで十分。
603デフォルトの名無しさん:2005/07/17(日) 06:24:35
なお、

>では、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%以上にならなければ反論として成立しないのか、
ほんと精神病患者の考えることは理解できんよ。

頭悪杉
606デフォルトの名無しさん:2005/07/17(日) 08:52:21
ドライバについて知らないだけかと思ったら、それ以前かよ...
607デフォルトの名無しさん:2005/07/17(日) 09:09:34
デバイスドライバが全体の1/100より大きくなければ568は反論になってないだろウンコ頭
608デフォルトの名無しさん:2005/07/17(日) 09:13:00
どっちの夏厨もOSもドライバも書いたことねーよ
609デフォルトの名無しさん:2005/07/17(日) 09:15:51
OSはともかく、ドライバくらいは書けるだろ
610デフォルトの名無しさん:2005/07/17(日) 09:37:55
デバイスドライバなんて俺にとってはどうでもいいことだけは確かだ。
611デフォルトの名無しさん:2005/07/17(日) 10:00:09
>>607
「世界の人口のうち日本人以外は95%以下」という主張をして、
「違うというのなら具体的な証拠を挙げろ」と言う香具師がいたとする。
そいつに対する反論として「まず中国人がいるだろ、、、」と列挙しはじめたら
「中国人が日本人の20倍いるってのかよ?
20倍いなければ反論になってないだろ」とか言い出して暴れてるようなもんだ。

ほんとお目出たい人間のゴミだな。
612デフォルトの名無しさん:2005/07/17(日) 10:14:17
>>611
中国人が20倍いなきゃ、中国人だけでは確かに反論になってないだろ。

まあその例だと、あとはインド人とアメリカ人あたりを挙げれば
十分だがな。
613デフォルトの名無しさん:2005/07/17(日) 11:47:46
========================
頭悪いのが粘着して自作自演中。全部スルーでよろし。
========================
614デフォルトの名無しさん:2005/07/17(日) 12:13:56
>613 自演オツ
615デフォルトの名無しさん:2005/07/17(日) 14:05:07
MLコア自身をMLで書けないのにOS作れるんですか?
616デフォルトの名無しさん:2005/07/17(日) 14:07:05
どんなOSかによるんだろうけど、仮に

OSを作ろうpart9
http://pc8.2ch.net/test/read.cgi/tech/1076217479/

スレの現状の成果物と同じものを目指すとして。
617デフォルトの名無しさん:2005/07/17(日) 16:40:29
>>615
>MLコア自身をMLで書けないのにOS作れるんですか?

不可能って訳じゃないよ。面倒くさいから誰もやらないだけで。
618デフォルトの名無しさん:2005/07/17(日) 17:12:17
プログラムをどの言語で書いてもどうせCPUとこでは機械語になってんだから細かいことは気にしなさんな。プログラム言語は書いてて楽しければ良いんだよ楽しければ。
MLでOS書いて楽しいならとっても結構なことだと思う。俺はやらんけど。

え、仕事?C/C++/Java/C#.....いろいろあるから好きなの使って書いとけ!
619デフォルトの名無しさん:2005/07/17(日) 17:20:41
>>617
MLって何の略か知ってる?このスレにいるんだから知ってて当然だよね?
620デフォルトの名無しさん:2005/07/17(日) 17:34:44
何でおかしな奴がこんなに湧いてんの?
それとも一人なのか?
621デフォルトの名無しさん:2005/07/17(日) 19:06:02
>>619
例えば、シグナルハンドリングとか GC とかネイティブスレッド対応とか FFI とかを
ML のみで書くのは面倒くさくないのかね?
FFI がコアかどうかは異論もあるだろうから、GC だけでも良いけど。メモリ管理が
コアじゃないって事は無いよね?
622デフォルトの名無しさん:2005/07/17(日) 19:30:30
>>619じゃないが、そんなもん面倒に決まってんだろう。
Cで書いてもそんなに簡単だとは思わないが。

今Cを使うと楽なのは、機械語、アセンブリ、他低レベルな言語いろいろを経て
蓄積された過去の資産が生かせる状況だろう。
Cがそういう地位にあるのはCの人気や魅力によるものなのかもしれないが、
資産自体がCの潜在的な能力というわけではない。

って、何の議論をしてるのかよくわかってないんだけどね。
的はずれだったら無視して。
623デフォルトの名無しさん:2005/07/17(日) 20:00:36
>>622
>Cで書いてもそんなに簡単だとは思わないが。

ML で書いた方が「より」簡単かって話。
624デフォルトの名無しさん:2005/07/17(日) 21:12:16
>>622
>資産自体がCの潜在的な能力というわけではない。

そこだよな。言語仕様だけを比べるなら
ほぼ100% ML>>>>>>>>C
625デフォルトの名無しさん:2005/07/17(日) 21:38:22
>>624 これがML厨と云われる種類のバカの一種ですか?
何が上とか下とか、どうやって決めるの?
基準は?それは客観的なのか?
「農業と工業どっちが偉い?」というのとレベルが変わらないような議論なんじゃないの?
626デフォルトの名無しさん:2005/07/17(日) 22:08:25
基準は、マトモなプログラマが同等の内容のプログラムを
書くのにバグが少なく、短時間でわかりやすい
コードを書けるということかな。
そして、この場に書いた意見ははほぼ主観的。

やれやれ、ここまで詳しく言ってやらないとわからないのかな。

これもゆとり教育の弊害か。
627デフォルトの名無しさん:2005/07/17(日) 22:14:07
========================
頭悪いのが粘着して自作自演中。全部スルーでよろし。
========================
628デフォルトの名無しさん:2005/07/17(日) 22:19:30
>>626
つまり、主観的である以上、他人にとっては意味のない意見だということだね。
意味の内ことを書くなよ。
629デフォルトの名無しさん:2005/07/17(日) 22:21:37
>>615
>>363

中身を観たわけじゃないんで、自分で判断してくれ
630デフォルトの名無しさん:2005/07/17(日) 22:23:05
>>628
読むのダルいから、トリップ付けてくれよ。
631デフォルトの名無しさん:2005/07/17(日) 22:25:36
>>630
別に俺のアイデンティティなんて問題にならないような意見を並べているだけだから、名無しで十分。
632デフォルトの名無しさん:2005/07/17(日) 22:31:57
>>631
分かりにくくて、ごめんな。お前のレスを読みたくないんだ。
633デフォルトの名無しさん:2005/07/17(日) 22:39:11
>>632
自己中心的な要求には応えかねる。
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でも書きにくいところはさっくりアセンブラだから問題ナッシングな気がする
635デフォルトの名無しさん:2005/07/17(日) 22:53:14
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作れて当たり前な気が
636デフォルトの名無しさん:2005/07/17(日) 23:50:40
>>628
他人の主観的意見から何かを感じとれない人にとっては
意味ないかもしれないね。
しかし、そうじゃない人もいるから意味がないとはいえないな。
637とおりすがり:2005/07/17(日) 23:53:15
はいはい。客観的に見て、いちいち荒れる対応する>>626が痛い。あ、自作自演なら、どっちも痛い。

判ったか?満足したら、さっさと壺に糞を詰める作業に戻れって
638デフォルトの名無しさん:2005/07/17(日) 23:55:38
>>636
エサを与えんなよ
639デフォルトの名無しさん:2005/07/18(月) 01:23:28
ttp://dst.purevoid.org/ の話が何で出てきてないんだ?
640デフォルトの名無しさん:2005/07/18(月) 01:25:31
一応出てきてるけど、喰いつきが悪いだけ
641デフォルトの名無しさん:2005/07/18(月) 01:34:40
>>636
主観的意見とは、信用がない人間の意見だとまったく無意味。
一名無しだったら、信用は半々だろうけど、その分必要なのは統計的なデータ。
何の根拠もなく感想を述べているだけでは、釣りとも本気とも判断が付かない。
そして、判断するのは他人の自由だ、と責任を他人に押しつけることが、すでに釣りである可能性も示唆している。
642デフォルトの名無しさん:2005/07/18(月) 01:39:51
おまえら名無しに依存しすぎ

こういう議論は匿名でやってもすぐうやむやになるから
会員制の掲示板でやろうぜ
643デフォルトの名無しさん:2005/07/18(月) 01:41:57
>責任の押し付け

ワラタ
やばいこいつw
644デフォルトの名無しさん:2005/07/18(月) 01:43:18
>>639
OS のソースツリーを見ると、C と ASM と ML のミックスチュアみたいだね。
デバイスドライバは ML で書いてあるね。

話題になっていないという事は、誰も試してないのかな。
645デフォルトの名無しさん:2005/07/18(月) 02:00:04
そりゃ誰も試さんだろ
MLでプログラムを作ることは魅力的でも
MLで作ったプログラムはそうではないからな

それがMLが普及しない理由だろうし
646デフォルトの名無しさん:2005/07/18(月) 02:08:12
そんなもんかね。
これが SML か Lisp だったら、qemu の中で飼うくらいはするんだけど。
647デフォルトの名無しさん:2005/07/18(月) 02:19:27
>>643
情報が正確でないから判断を押しつける、委ねる、どっちでもいいが、のだろう。
648デフォルトの名無しさん:2005/07/18(月) 02:19:31
え、
qemuて実質x86とppcしかサポトしてますが
649デフォルトの名無しさん:2005/07/18(月) 02:22:28
>>648
日本語壊れてるが、大丈夫か??
650デフォルトの名無しさん:2005/07/18(月) 02:25:53
そうですか。。
651デフォルトの名無しさん:2005/07/18(月) 02:36:16
つまり、641が言いたいのはこういうことか?

統計データがない場合は、名無しさんの信用は半々で、
判断は読者にゆだねられる。
その場合、釣りである可能性を示唆している←(ワラ

・・・で?
652デフォルトの名無しさん:2005/07/18(月) 02:38:06
>>651
そろそろ終わりにしてくれないか。
653デフォルトの名無しさん:2005/07/18(月) 02:45:38
>>651
自作自演もそろそろ飽きた
654デフォルトの名無しさん:2005/07/18(月) 02:58:31
なんだ、Ocaml のOSか。さもありなん。
Ocamlはある面、Cの代替と成り得る実用MLを目指してたから、
そーゆー展開もありだろう
655デフォルトの名無しさん:2005/07/18(月) 04:21:10
でもGCとか、低レベルな用途には余計な機能が入ってるよ
デバドラなんか動かしたら不安定なんじゃ
LISPマシンはどうだったんだろーね
656デフォルトの名無しさん:2005/07/18(月) 05:06:33
Symbolics の Lisp マシンはメモリプロテクトをハードウェアで実装してたみたいね。
デバドラとかなら GC はしないで、メモリ管理はプログラマに任せる実装もありかと。

Lego で動く Lisp
http://www.xslisp.com/index-j.html

Free の Lisp OS
http://common-lisp.net/project/movitz/
657デフォルトの名無しさん:2005/07/18(月) 06:56:36
16KのROMに入らなければならないような組み込み制御には全く向かないね。
あとハードなリアルタイムもC等のほうがやりやすいだろうな。

結局、ほとんどどんなプログラムでもMLのほうがつくりやすいと言ってる人は
自分の回りしか見ていない、つまり、元々ML関係に持ち込まれる話の中でしか
考えていない大馬鹿者ということだ。
658デフォルトの名無しさん:2005/07/18(月) 07:38:20
そんなのはその部分だけアセンブリで書けばいいだけ
というよりハードワイヤかすればいいだけ。
本質的にソフトウエアな部分はMLで書けば良い。
659デフォルトの名無しさん:2005/07/18(月) 07:39:35
まあMLを知ったばかりで浮かれているのでしょう。
そういう魅力はある。

かなづちを持った人間にはすべてが釘に見える。
660デフォルトの名無しさん:2005/07/18(月) 08:52:51
>本質的にソフトウエアな部分
>本質的にソフトウエアな部分
>本質的にソフトウエアな部分
661デフォルトの名無しさん:2005/07/18(月) 08:57:34
>>658
> 本質的にソフトウエアな部分はMLで書けば良い。

結局、>>657の言う通り、自分の周りだけを見て「本質的にソフトウェア」とか言ってる
のが丸わかりなのが痛すぎるわけだが、君は自覚しているか?
662デフォルトの名無しさん:2005/07/18(月) 09:02:46
ねぇ、それって詭弁のガイドラインの何番目?

ホント議論展開が稚拙だね。
663デフォルトの名無しさん:2005/07/18(月) 09:47:33
デバイスドライバが出てくるところまで読んだ
664デフォルトの名無しさん:2005/07/18(月) 11:00:35
詭弁のガイドライン持ち出して回避しようとする方が稚拙な気が
しかも何番目とか言ってるし
665デフォルトの名無しさん:2005/07/18(月) 11:12:29
>>657
ROMが少ないならROMを増やせばよい。
RAMが少ないならRAMを増やせば良い。
処理速度が遅いなら処理速度をあげればよい。

コーディングの便利さと実行効率とは無関係。
別の議論だよ。
666デフォルトの名無しさん:2005/07/18(月) 12:25:35
>>665
> ROMが少ないならROMを増やせばよい。
> RAMが少ないならRAMを増やせば良い。
> 処理速度が遅いなら処理速度をあげればよい。

爆笑!!おもしろい白痴だな、おまえ。
667デフォルトの名無しさん:2005/07/18(月) 12:58:56
【議論の流れ 1/2】
>>363    OCaml OSへのリンク初出

>>564-567>>569
        プログラミングのし易さに関する、MLと他の言語(C, Fortran90)の比較(変数型宣言、配列処理、文字列処理)。

>>568    最初のDQN発言「ではMLでデバイスドライバ書いてください。」
>>570-574 MLでのOS/ドライバ記述可否の議論
>>575-587 メタ議論開始
>>588-653 一部例外を除き、実りのない議論に終始
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カーネルの事だろ?
そんな話、このスレの流れでは誰も興味持ってねぇんだよバーカ

関連無いこと言い出して議論を荒らすというのは、詭弁のガイドラインに載っている有名な荒らしパターンなんだよ、
このスットコドッコイ
669デフォルトの名無しさん:2005/07/18(月) 13:08:38
>667-668
あいかわらずの粘着だな
670デフォルトの名無しさん:2005/07/18(月) 13:14:03
>>668
> 16KのROMに入るOSなんて、リアルタイムOSカーネルの事だろ?
> そんな話、このスレの流れでは誰も興味持ってねぇんだよバーカ

なるほど、>>657の言う通りなわけだ。かなりトホホな奴だな。
671デフォルトの名無しさん:2005/07/18(月) 13:16:00
あーあ。またバカがスレのレベルをズリ下げてる。
おまえのゴタクなんて誰も聞きたかねぇんだよゴミクズ。

関数言語自体の話題か、関数言語を使った実装(OS, アプリ)の話題以外
書き込むなよ
672デフォルトの名無しさん:2005/07/18(月) 13:17:56
>>671
そうだな。
MLでできないことがあったなら、具体的に言ってもらわないと対処法も何も出るわけがないのにね。
673デフォルトの名無しさん:2005/07/18(月) 13:22:37
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ぐらいはそういうコードがある
かもね。
675デフォルトの名無しさん:2005/07/18(月) 13:25:44
===============
DQN>>674粘着中。スルーするがよろし。
===============
676デフォルトの名無しさん:2005/07/18(月) 13:29:48
16KのOSの話なんてどこに出ているんだろ?
677デフォルトの名無しさん:2005/07/18(月) 13:32:20
>>676
さあ・・・よくわからんが、例のアホにはそういう話が見えているみたい。
678デフォルトの名無しさん:2005/07/18(月) 13:33:58
まあソフトウェア全体に対する組み込みのシェアは、
本数ベースなら確実に1%以上なことは間違いないな。
679デフォルトの名無しさん:2005/07/18(月) 13:34:57
組み込みは本質的にソフトウエアな部分じゃないんだよ
680デフォルトの名無しさん:2005/07/18(月) 13:38:15
MLだと不便なのは、ドキュメントや処理系の選択肢が少ないことだろうな
結局誰も使ってないし
681デフォルトの名無しさん:2005/07/18(月) 13:39:28
ドキュメントも処理系も本質的にソフトウェアな部分じゃないYO
682デフォルトの名無しさん:2005/07/18(月) 13:51:07
そういう非本質的なところが、常に勝敗を分けてるのがこの世界だろ
683デフォルトの名無しさん:2005/07/18(月) 13:54:13
っていうかOSすら作れない言語って一体・・・(pgr
684デフォルトの名無しさん:2005/07/18(月) 14:25:21
OSは本質的にソフトウエアな部分じゃない
685デフォルトの名無しさん:2005/07/18(月) 15:17:44
組み込みでも、OSでも、ドライバでもMLの方がいいだろうな。
環境さえ存在するという条件なら。
686デフォルトの名無しさん:2005/07/18(月) 16:01:35
>> 673
なんで IRCAM (フランス国立音響研究所) が出てくるかな?
687デフォルトの名無しさん:2005/07/18(月) 16:03:34
BLASなしで行列演算やりたくないよな。

688デフォルトの名無しさん:2005/07/18(月) 19:17:31
ところで、ML の小さい実装(サブセットでも)ってありますか?
Scheme は C で 1000 行程度の実装があったりしますが、ML
は見かけた事がないので。
689デフォルトの名無しさん:2005/07/18(月) 19:55:44
>688
min-camlとか。
http://min-caml.sf.net/
OCamlで2000行くらい。
690デフォルトの名無しさん:2005/07/18(月) 20:23:07
はっきり言ってほとんどなんにもないけどな。MinCaml。
691デフォルトの名無しさん:2005/07/18(月) 21:32:08
>>689
thanx.
MLer はやっぱり ML で書くのか。
692デフォルトの名無しさん:2005/07/18(月) 22:59:29
>>686
この前のフランスの行政改革で、INRIAはIRCAMに統合されたってゆってた(嘘800
693デフォルトの名無しさん:2005/07/19(火) 01:39:02
こうなったら、MLでOS作るしかないでしょ。
オープンソースで。
2chMLOS
694デフォルトの名無しさん:2005/07/19(火) 01:40:42
IntelCPUでLinuxもどきのOSをMLで作るとしたら、
どうすればいいんだろう。
ブートローダはアセンブラでかくとして
あとはMLコードを適切なバイナリで出力できるコンパイラ、リンカが
必要になるのか。
695デフォルトの名無しさん:2005/07/19(火) 02:02:29
このスレには実は俺以外一人しかいない予感
696デフォルトの名無しさん:2005/07/19(火) 02:10:01
>>694
特権レベル変更とか、preemptiveなコンテキストスイッチとか、面倒なのが色々あるね。
697デフォルトの名無しさん:2005/07/19(火) 02:48:33
1 floppy bsd/linux みたいなノリかな。
698デフォルトの名無しさん:2005/07/19(火) 08:11:57
とりあえず、1 floppy
・ブートローダ(アセンブラ)←ここでプロテクトモードに以降。カーネル先頭にJUMP。
・カーネル
 割り込み処理 (キーボード入力)
 メモリ管理(ページングなしのフラットモデル)
 ビデオメモリ直描画ルーティーン
 スレッド2つ生成してタスクディスパッチ実験

とりあえずここまでできないかな。
699デフォルトの名無しさん:2005/07/19(火) 08:24:20
適当にOSスレのパクればいいじゃん。
その前にMLで書く意義を見つけたいとこだけど。
700デフォルトの名無しさん:2005/07/19(火) 08:31:54
やっぱりOS書くとなると状態を扱うことが多いので、
MLでは副作用をおこす処理が必要でどうなんかなと思うことも。
あと、MLではbit単位のデータ構造扱うことできたっけ・・・?
701デフォルトの名無しさん:2005/07/19(火) 08:36:06
val _ = __asm (...)
みたいなのが必要?
702デフォルトの名無しさん:2005/07/19(火) 08:46:20
どうせgcc入るんだしMLで書くとか奇想天外なことされても迷惑なだけだよ
703デフォルトの名無しさん:2005/07/19(火) 11:37:01
例えば特権周りってトリッキーな部分が多いんだよ。
例えばプロセッサがx86の場合には、カーネルモードからユーザモードに
移行する命令がない。だからLinuxなんかでは、スタックフレームを直接
イジって、特権割り込みからのIRETを偽装してユーザモードに「復帰」することで
initをユーザモードで実行する。これをMLでどう実装するか。

あとシステムコールもユーザモードからカーネルモードに移行するのを
割り込みとして処理するのが一般的だけど、その辺のプロセッサレベルの
割り込みをMLでどう実装するのか、結構面倒だと思うぞ。
704デフォルトの名無しさん:2005/07/19(火) 13:48:26
>>659
ワインバーグの本、面白いですよね。
705デフォルトの名無しさん:2005/07/19(火) 20:07:02
>>702
よし、それじゃML.NETみたく、
gccフロントエンド版Ocaml作ってgccと相互呼び出しできるようにする所から・・・

つかさぁ、ML系言語でOS書く事にどんな目的を持ってるの?
例えば今までやりにくかった事が、MLで書く事でこんなに綺麗にスマートにすっきり書ける、とか、
MLの機能を使う事で、OS上にどういった概念を持ち込めるとか、
そーゆー餅ベーションが見えん・・・

餅のないテーマは長続きしないよ・・・。
706デフォルトの名無しさん:2005/07/19(火) 20:27:53
>>695
同意。
707705:2005/07/19(火) 20:30:45
まぁ俺は、直近では>>705しか書いていないわけだが
708デフォルトの名無しさん:2005/07/19(火) 20:36:43
まぁ俺は、直近では>>708しか書いていないわけだが
709デフォルトの名無しさん:2005/07/19(火) 21:17:46
MLで書いたOSのメリット
・バグが少ない
・開発効率が良い
・標準開発環境にSML,OCAMLを採用し、アプリの開発環境も充実
 (APIは勿論MLインタフェイス)
・これまで数多くのOSプロジェクトが出てきたがそれらとの差別化を図ることができる。
・MLでOSかくという行為自体が楽しい
710デフォルトの名無しさん:2005/07/19(火) 21:21:34
何処まで行っても ML or ASM っていうのは気持ち良いかもしれない。
C の ABI とか考えなくて良いし。
711デフォルトの名無しさん:2005/07/19(火) 22:48:48
動的なバグだらけだったりして。
712デフォルトの名無しさん:2005/07/19(火) 23:01:07
>>705
> つかさぁ、ML系言語でOS書く事にどんな目的を持ってるの?

ML万能厨のオナニー。
713デフォルトの名無しさん:2005/07/19(火) 23:03:31
>>709
センス悪!いちぬけ
714デフォルトの名無しさん:2005/07/19(火) 23:04:52
ここでダベってる、知恵遅れの方にお願いです。

あなた専用のスレを用意しましたので、続きはあちらでどうぞ。

 ム板王者決定戦
 http://pc8.2ch.net/test/read.cgi/tech/1121781119/
715デフォルトの名無しさん:2005/07/19(火) 23:11:51
今まったく関係ないけどEXEファイルを展開できるソフトって何だっけ?
716デフォルトの名無しさん:2005/07/19(火) 23:13:56
Miranda だっけ? OS 作ろうとしてたのは
自分の好きな言語で閉じた環境を作るのは
プログラマーのロマンだと思ってたけど
717デフォルトの名無しさん:2005/07/19(火) 23:19:08
おれは実行ファイル等の出力にしか興味ないが
718デフォルトの名無しさん:2005/07/19(火) 23:29:26
>>716
インタプリタでOS書くのかYO

それともMirandaの処理系をOS無しで直接IPLからロードして立ち上げる話?
だったらそんなのはロマンでも何でもなくて、一昔前は皆やってたことだ。
719デフォルトの名無しさん:2005/07/20(水) 00:31:08
ここでダベってる、知恵遅れの方にお願いです。

あなた専用のスレを用意しましたので、続きはあちらでどうぞ。

 ム板王者決定戦
 http://pc8.2ch.net/test/read.cgi/tech/1121781119/
720デフォルトの名無しさん:2005/07/20(水) 01:06:32
MLOSはMLerのためのOSなんだよ。
721デフォルトの名無しさん:2005/07/20(水) 01:08:03
過去の遺産は受け入れん。
MLOSできたのはいいものの、アプリが少ないからといってC-Lib使えるように、
C-Interface作る・・・とか本末転倒なことはしない。
722デフォルトの名無しさん:2005/07/20(水) 01:09:37
とりあえずは、
・MLでのOS基本設計
・実行形式の定義
・etc...

まずは、2chブラウザ作りたい・・・。
723デフォルトの名無しさん:2005/07/20(水) 01:12:43

命名:MLOS = PureMLOS
MLのコード、それをコンパイルしたオブジェクト、実行形式
それ以外のものはPureMLOSには存在しない。
724デフォルトの名無しさん:2005/07/20(水) 01:14:33
テキストファイル、画像ファイルなどは除く。
725デフォルトの名無しさん:2005/07/20(水) 01:15:44
XMLML
726デフォルトの名無しさん:2005/07/20(水) 20:38:46
申し訳ありませんが、教えていただきたいのですが、
MLを勉強したいのですがそのためによい本とかありますか?
教えてください。お願いいたします。
727デフォルトの名無しさん:2005/07/20(水) 20:43:30
本より処理系決めてマニュアル読んだ方が早いかも
細かい違いがあるし

それと>>1のリンクにあった
http://www.summa.jp/tutorial/plain/mlkouza.txt
これが↓に移転してる
http://tutorial.jp/
728デフォルトの名無しさん:2005/07/20(水) 20:57:02
>>726
これを読んでおけば間違いない。

Milner, Tofte, Harper and Macqueen. The Definition of Standard ML, MITPress
729デフォルトの名無しさん:2005/07/20(水) 21:01:11
>>726
関数型言語そのものを勉強するとともに、数理論理学などを勉強すると良い。
言語の文法自体はすぐに理解できるだろうから、なんでも良い。
730デフォルトの名無しさん:2005/07/21(木) 11:31:54
○camの○×さん。悩み事があるって言うので、聞いてあげたら、「なんか、
解かんなくなっちゃった」だって。周りからは「別れる様に言われてるらしい」けど、
俺も、そいつの事聞いて、「別れなさい」って言ってやった。それなのに・・・。
俺は、お客さんだぞ。話聞いてやって、ポイント使って、散々だよな。
まあ、こんなチャトレも居るってことが、よ〜〜〜く解かったけどね。
これからは、個人的な相談には、乗らないで、俺のペースで話しよ。
*あほな俺に、ご意見待ってます。
731デフォルトの名無しさん:2005/07/21(木) 20:48:31
>>726
ML for the working programmer
732デフォルトの名無しさん:2005/07/21(木) 22:09:17
>>726
とりあえず>>728を読んどけ。CにおけるK&Rみたいなもんだから。
733デフォルトの名無しさん:2005/07/21(木) 22:52:26
PHPで2次関数の解を出すプログラムを教えてくださいm(__)m
734デフォルトの名無しさん:2005/07/21(木) 22:53:40
PHPなんてゴミ言語はプライベートでみたくないんですが。
735デフォルトの名無しさん:2005/07/21(木) 22:55:06
そこを何とか、お願いします。
736デフォルトの名無しさん:2005/07/22(金) 00:37:28
次から次へと新しいのが来るな。
737デフォルトの名無しさん:2005/07/22(金) 01:58:18
Perlでも構いませんので、どうかお願いします。
738デフォルトの名無しさん:2005/07/23(土) 11:28:51
             , -=ゞ'´ニニ>- 、_
           /へ_,. -──‐'´  `ー─ヽ、
       ゝ=='´              `ヽ、`ヽ、
      //      /  l|   |   \      `ヽ、`ヽ、
       フ / / /  / /| |l   | ト、_ヽヽ   \\ヽ  `ヽ、__
     /// / 〃 /!/`ト|ヽ |ヽl´>ミ、ヽ、  ヽヽ`   `ヽ、
   / l/| | / | / r'⌒` ! ヽ | ´   ヾ7/\  ト!
 ,ィ/     |/| /|∧ト! ! ()     () / l/ / \| !
 /       ! .| | ! ヽ ヘ `´´  ,  ` ̄  レ'    ヽ
./       ヽ!   `ヘ    , --一 ''ヽ  /ト 、、
       ,. -‐ァ', -''7/ヽ、 |    _ノ,.イ|L-‐''´ //>-、
      / //rTT´ ̄ ̄ヽ`二 -''´ /     ///  \ヽ、   カズちゃんの童貞奪っちゃ、ダメーーッ!!
    /  /// | | |      |l     /      // |    `ー、ヽ
739デフォルトの名無しさん:2005/07/23(土) 13:46:43
---- キチガイ一名が放し飼い状態になってるな ----
740デフォルトの名無しさん:2005/07/24(日) 02:47:29
>本質的にソフトウエアな部分
ワロス
741デフォルトの名無しさん:2005/07/24(日) 10:51:29
OSもソフトウェアです。
742デフォルトの名無しさん:2005/07/24(日) 18:16:18
ocamlc -c -custom aaa.ml aaa.obj
ってやると、 aaa.obj をどうしていいかわからないって返されるんだけど
c++とは連携できないの?
743デフォルトの名無しさん:2005/07/24(日) 19:35:46
そんなの誰も釣られないし。
もういーから、誰かもっとタメになる話してくれよ。
MLの情報得られる場所なんて、少ないんだからさ。
744デフォルトの名無しさん:2005/07/24(日) 19:55:58
世の中give & takeですよ
745デフォルトの名無しさん:2005/07/25(月) 00:37:54
世の中の全てがgine & takeなわけない。
それと同数の take & giveがあるはずだ。

そこでオレは考えた。
take & escape すればいいことを。


746デフォルトの名無しさん:2005/07/25(月) 00:39:24
そうなると、

give & killになりかねんな。
747デフォルトの名無しさん:2005/07/25(月) 00:40:25
オレは最近気づいたことがある。

Cでプログラミングするときより、
MLでプログラミングするときのほうがストレスが少ないことに。
748デフォルトの名無しさん:2005/07/25(月) 01:17:00
==============================
キチガイが狂った独り言を書き込み中
==============================
749デフォルトの名無しさん:2005/07/25(月) 11:46:35
オレはC等のめんどくさい言語に愛想をつかし、
プログラミングはもうしまいと思っていたが、
MLと出会い、プログラマ魂が復活した。
750デフォルトの名無しさん:2005/07/25(月) 12:53:11
==============================
キチガイが狂った独り言を書き込み中
==============================
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にコンパイル可能で
しょうか?ご教示願います。
以上
752デフォルトの名無しさん:2005/07/25(月) 20:53:16
回答略
     いじょ
753デフォルトの名無しさん:2005/07/25(月) 20:53:59
すいません。751です。
ocamlopt hello.ml -o hello は
ocamlopt hello.ml -o hello.exeです。
754デフォルトの名無しさん:2005/07/25(月) 21:16:06
世の中give & takeですよ
755デフォルトの名無しさん:2005/07/25(月) 21:18:13
私は問題を提供したのですが…
回答をご提供いただけると有難いです。
756デフォルトの名無しさん:2005/07/25(月) 22:26:36
MinGWがちゃんとインストールされてないだけだろ
757デフォルトの名無しさん:2005/07/25(月) 22:43:04
>>756
煽りは結構です。
ちゃんとした回答を提供できる方はいませんか?
758デフォルトの名無しさん:2005/07/25(月) 23:05:26
>>756
asにパス通ってないんだからその手の問題だろうな。
759デフォルトの名無しさん:2005/07/25(月) 23:14:40
>>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 ()
;;

の方が一般的な書き方だと思います.

760デフォルトの名無しさん:2005/07/25(月) 23:27:34
こんな奴までOCamlを使い出したということは…
ついにOCamlがメジャーになる日がキタワァ*・゜・*:.。..。.:*・゜(n‘∀‘)η゚・*:.。. .。.:*・゜・* !!!!!
761デフォルトの名無しさん:2005/07/26(火) 00:13:19
ごめん、OCaml厨が増えたのは俺のせいかも。
762デフォルトの名無しさん:2005/07/26(火) 00:48:59
OcamlでOS作る妄想するより、
OcamlでHaskellとCとLISPとMaximaとRの
いい所合わせしたプログラミング言語作ってくれよ。
763デフォルトの名無しさん:2005/07/26(火) 01:13:05
>>762
そう言うからには、何か構想でもあるのかい?
764デフォルトの名無しさん:2005/07/26(火) 01:32:15
>>763
駄レス:: String -> Maybe String
>>762 >>763 => Nothing
765デフォルトの名無しさん:2005/07/26(火) 11:15:27
いやあMLのプログラムは見通しがよくて
ストレスたまらんわ〜〜〜
766デフォルトの名無しさん:2005/07/26(火) 12:59:52
そうとばかりも限らない。
767751です。: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のコンパイルに成功した経験の
ある方、ご教示下さい。
以上
768751です。:2005/07/26(火) 15:23:22
なお、
>755
>757
は751ではありませんので念の為。
>753 は間違いなく751です。
って、まあ証明のしようもないのですが…

769デフォルトの名無しさん:2005/07/26(火) 16:37:02
as がねーってんだから as がねーんでしょう。
それをチェックしてから書き込んでますか?
もし、caml 初心者なら、始めのうちは、バイトコードコンパイラで十分です。
なんで、みんなネイティブに突っ走って教えて君モードになるのか…
770デフォルトの名無しさん:2005/07/26(火) 18:21:53
C++のオブジェクトファイル.objだとOcamlc派認識しないのかよってきいてるだろ?
それともやっぱり

             で き な い の か w 


771770:2005/07/26(火) 18:34:34
おれもOCamlOptは
cannot find file libassmrun.a
って出て動きません。
772デフォルトの名無しさん:2005/07/26(火) 18:36:13
>>767
・as --versionでasが入ってるか確認。
・ocamlopt -whereで意図したocamloptが起動してるか確認。
・cygwin版ocamlを使うときは環境変数OCAMLLIBを消す。(当然nativeにはならない)
確かにここははまりやすいね。

>>770
MSVC版使ってるか?
あれだけの情報じゃ特にどうしろとは言ってやれないが、答えは「可能」だ。
773770:2005/07/26(火) 19:02:33
>>772 Win版ってことですか…、
Visualスタジオ持ってないけど、やってみる。
Thanks
774デフォルトの名無しさん:2005/07/26(火) 20:46:47
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 - キャッシュ - 関連ページ

775デフォルトの名無しさん:2005/07/26(火) 20:54:18
>>774
おまえいいやつだな。
776デフォルトの名無しさん:2005/07/26(火) 21:04:50
>>774
こんな親切な人初めてみた
777デフォルトの名無しさん:2005/07/27(水) 04:06:09
>>774
100万秒ワロタ。
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の使い方が違うのでしょうか。。。
779778:2005/07/28(木) 22:34:22
あ、上の778はOcamlです。
初心者なので他の言語との違いが分かんないですけど。
お願いします。
780デフォルトの名無しさん:2005/07/28(木) 22:46:20
> let a = Array.make 2 (Array.make 2 1);;
(Array.make 2 1)の結果はpointerなので、a.(0)とa.(1)は同じarrayを共有することになる。
781778:2005/07/28(木) 22:52:06
> 780
なるほど。ありがとうございます!
let a = Array.make_matrix 2 2 1;;
に変えたらうまくいきました。
782デフォルトの名無しさん:2005/07/29(金) 01:11:12
OCamlでWindowsアプリ作ってる人いる?
OCamlでメッセージ処理とかコールバックってどうやってるか教えて。
783デフォルトの名無しさん:2005/07/29(金) 23:05:16
いないみたいな
784デフォルトの名無しさん:2005/08/10(水) 15:46:47
ocamlのcmoファイルはバイナリのバイトコードだけど、
ニモニックのバイトコードを見るにはどうしたらいいの?
785デフォルトの名無しさん:2005/08/10(水) 17:42:27
>>784
-dinstr オプションつけてコンパイルしてみ。
外してたら失礼。
786デフォルトの名無しさん:2005/08/15(月) 13:30:36
OCamlおもすれーな。

関数型言語って始めてだったらかちょっと不安だったけど
これならなんとかなりそう。
787デフォルトの名無しさん:2005/08/15(月) 21:36:36
>>786
私も初めはOCamlがML系だということで、面白いと思って、いろいろ試しに作ってみたんだけど、
ライブラリが揃っているように見えて、内実は全く不十分だということに気づいた。
簡単な物ならOCamlでも大差は無いけれど、俗なアプリケーション製作に関していえば、
結局C++の方が楽だということに気づいた。
788デフォルトの名無しさん:2005/08/15(月) 21:39:39
>>787
例えばどんなライブラリが無かったの?
789デフォルトの名無しさん:2005/08/16(火) 11:48:11
地震だ。でかいぞ?
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すれば見れますけど、
もっといい方法ってないですか?
791デフォルトの名無しさん:2005/08/16(火) 18:47:52
OCaml 3.08.4 リリース
http://caml.inria.fr/ocaml/release.en.html
792デフォルトの名無しさん:2005/08/16(火) 20:20:49
>>790
インスタンスが一つも無い状態で、クラス変数の中身を見たいって状況が理解できない。
それはもしかしたら、クラスじゃなくモジュールでやるべきことなんじゃないかと、自問してみるのをお薦めする。

あと、一つでもインスタンスがあるのなら、

let obj = new a
let get_b () = obj#f

とでもしておけば、以後いつでも get_b で中身が見れるでしょう。
793790:2005/08/16(火) 21:06:02
>> 792
他のところでインスタンスを使ってるんですけど、
意味的にクラスに変数をまとめておきたかったんです。

C++書いてるときにはよくやってたんですけど、
あんまりやらないのかな。
794デフォルトの名無しさん:2005/08/16(火) 21:28:33
>>782
つ[F# + WindowsForms]
795デフォルトの名無しさん:2005/08/16(火) 23:32:45
>>793
>他のところでインスタンスを使ってるんですけど、
>意味的にクラスに変数をまとめておきたかったんです。
って事は、たぶん、あるクラスの(static)変数を参照したいんだけど、それを
参照したい場所ではインスタンスへのスコープが届かないんでしょ。

module A = struct
let b = 0
class a = object
method foo = 1 + 1
end
end

とかにしとけば、

let _ =
Printf.printf "%d\n" A.b
;;

とかできますよ。



796790:2005/08/17(水) 00:20:02
>>795
なるほどー。
勉強になります。ありがとうございます。
797デフォルトの名無しさん:2005/08/17(水) 00:53:24
MLのナニが疑問かって、最後の
;;
が理解できない。
コード中にあったりなかったり。
どこに置くべきなのか。
C言語との対応表みたいなの誰か作らない?
798デフォルトの名無しさん:2005/08/17(水) 09:05:52
自分で作れば?
;;はreplに与える式の区切りと思えば。
799デフォルトの名無しさん:2005/08/17(水) 09:34:10
>>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.
800デフォルトの名無しさん:2005/08/17(水) 15:01:36
よくわかりました。
対話モード以外では意味ないのか。
BNFで解説してくれる本が手元にあるとありがたいんだけど。
801デフォルトの名無しさん:2005/08/18(木) 00:22:11
andってなんですか?
802デフォルトの名無しさん:2005/08/18(木) 13:56:30
>> 800
parsing/parser.mly でも見てよ。
Syntax error がある場合、
;; があるとエラー場所をほんの少し探し易いという利点があります。
803デフォルトの名無しさん:2005/08/18(木) 14:02:41
>> 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"と画面出力を取り出したい。

よろしくおねがいします。
805デフォルトの名無しさん:2005/08/18(木) 14:21:03
>>804
ML 扱ったこと無いんで申し訳ないが……明らかに処理系依存かと思われ
806デフォルトの名無しさん:2005/08/18(木) 14:47:56
Emacsの中で使えば1と3は解決。2は処理系依存。
807デフォルトの名無しさん:2005/08/18(木) 14:59:00
おいらのEmacs 21.4はM-x run-ocamlとかできないけど、どっから拾ってくればいい?
Common Lisp用のSLIME並に高機能だとなお嬉すぃ。
808デフォルトの名無しさん:2005/08/18(木) 16:18:36
>>803
なる程、分かりました。有難う御座いました。
809デフォルトの名無しさん:2005/08/18(木) 16:25:28
漏れはコマンドライン上で ledit を使っているが、あんまり使いやすくはないのでオススメしない。
run-ocaml なら M-p とか M-n とかで履歴を上下できる筈だけど。

あと、環境変数はともかくシェル変数はそもそもアプリに渡らないだろ。環境変数は、実用的な処理系なら普通は取れるだろうけど。 OCaml なら Sys.getenv とか。
ちょっと調べた感じでは SML では標準ライブラリの Posix.ProcEnv ができそうなので、SMLの実装(SML/NJとかmltonとかmoscow mlとか)も行けるだろうけど、使ってないから詳しくは知らん。
810デフォルトの名無しさん:2005/08/18(木) 17:54:50
>>804
A2. open Unix;; してenvironmentとかgetenv使う。詳しくは[1]。

[1] Xavier Leroy and Didier Re'my, "Programmation du système Unix en Objective Caml"
http://cristal.inria.fr/~remy/poly/system/camlunix/index.html
811デフォルトの名無しさん:2005/08/20(土) 18:03:18
どうも、ObjectiveCamlのI/Oの仕組みが良く分かりません。
in_channelとかout_channelとかを使ってやるらしいことは
マニュアルに書いてあるがサンプルがない。
誠に勝手なお願いで申し訳ありませんが、
例えば3教科のテスト結果が5名分test.csvに入っているのを
配列に取り出し、プログラム内で各教科の5名平均を計算し、
それをaverage.csvにOPするという、極めて簡単なサンプルを
どなたか、ObjectiveCalmで書いて頂けると有り難いの
ですが…。
812デフォルトの名無しさん:2005/08/20(土) 18:42:20
入出力の仕組みを知るためにしちゃ余分な処理が入ったものを要求しているな。
宿題スレへ行け。
813デフォルトの名無しさん:2005/08/20(土) 19:40:02
>>812
禿同。
入出力は
let ic = open_in "filename" in
...
let line = input_line ic in
...
close_in ic
つうか、こいつは、入出力のこと聞いているけど、
フィールド切り分けはできるのか?はなはだ不安。
Scanf じゃできんかもね。
814デフォルトの名無しさん:2005/08/20(土) 20:17:36 BE:117633672-##
csvの取り出しなら、Str.splitで十分ですな。
815デフォルトの名無しさん:2005/08/20(土) 20:18:31
はたして宿題スレにOCamlわかるやつがいるかねw
816デフォルトの名無しさん:2005/08/20(土) 20:37:34
>>815
前に宿題スレに湧いてたOCaml厨
817デフォルトの名無しさん:2005/08/21(日) 03:16:50
で、ObjectiveCalmって何ですか?とか言ってみるテスト

>>814
クォーテーションを考えると Str.split は使えない希ガス。 ocamllex か
camlp4 だな。
818811です。:2005/08/21(日) 13:08:23
811です。質問の内容を明確にするため
C言語のサンプルを下記の通り添付します。
(ObjectiveCamlの構文が良く分からないので
ご参考になるかどうか…)
但し、下記のプログラムが出来ればかなり
応用が効きます。つまりObjectiveCamlに
データ入力するのにExcelを利用したり、
CSV経由で他のアプリとの連携をとったりとか。
前回native code生成の質問をしたのも、この意味です。
言って見ればnative code exeとcsvファイルの操作さえ
できれば、DOSのバッチファイルを経由してどんな
アプリに対してもやり取りが可能になると考えた
次第です。
819デフォルトの名無しさん:2005/08/21(日) 13:10:29
#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;
}
820デフォルトの名無しさん:2005/08/21(日) 13:15:35
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;
}
821デフォルトの名無しさん:2005/08/21(日) 13:16:35
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;
}
822デフォルトの名無しさん:2005/08/21(日) 14:05:20
いや、だからね、csv のフィールド切り出しとか、基本的な file i/o
とか caml で出来ない人が、caml と他のアプリとの何の連携が出来るって
言うんですか?

あなたは C の file i/o は出来るようだから、 caml の i/o も pervasives.mli
を見ればどんな関数があって、どういう型か判るはずだし、コメントから C の
入出力関数との対比も大体判ると思います。フィールド切り出しも string.mli
の関数を使えば、あなたの get_data 関数位の物なら自分で書けると思います。

とにかく、どこどこが判りませんっていうならともかく、コードよこせって
言うんじゃ夏休みの宿題厨と思われてもしょうがないし、細かく助けようがない。
取り敢えず自分で書いてみ。動かなくてもいいから。それを張り付けたら
みんな喜んで添削すると思うよ。
823デフォルトの名無しさん:2005/08/21(日) 14:21:28
>> 810
なんで、わざわざフランス語のリファレンス…
そもそも環境変数だけだったら Unix なんぞ使わんでも Sys.getenv の方が簡単よ。
F
824デフォルトの名無しさん:2005/08/21(日) 18:01:58
いいねー俺レベルでわかってないやつがやっと出始めた
もっと敷居を低くしてくれ、俺は敷居がどこなんだかわかんねー

cのポインタ、c++のテンプレ、javaのインターフェイス
俺の歴史の中で大物だったハードル達だ
こいつは何だ!見当つかね、
俺の構築したOCamlはこれであってるのか!

皆はこれすぐ使えるようになったの??
だめだlispから出直してくる
825デフォルトの名無しさん:2005/08/21(日) 18:51:57
>822
そんなに「もったい」つけないで、チョコチョコと書いてくれたって・・・。
Cでさえこの程度の行数だから、Camlであれば半分か3分の1で
済むんでしょう?
どっかにあると思われるサンプルをチョコっと直して頂ければそれで
良いんですが。
素人が一からマニュアル見ながらウンウン書くのと、ベテランがチョコと
書くのとではコードROIが段違いです。


826デフォルトの名無しさん:2005/08/21(日) 20:49:33
このログを例に,ゆとり教育の問題点について説明し(ry
827デフォルトの名無しさん:2005/08/21(日) 22:15:42
>>818で明確になった質問の意図とはまさしく
「OCamlでCSVを読むコードクレクレ」
だよなあ。

宿題スレとか作ってくださいスレとかが相当じゃないの。
828デフォルトの名無しさん:2005/08/21(日) 22:26:10
>>825
ROIなんて投資するのが同じ人でなきゃ比較しても意味ないだろ。
同じ会社に勤めてる人が仕事で書くとかならともかく、
なんで赤の他人がお前の為にコードを書かにゃならんのか。
お前は人に書かせりゃ投資ゼロでROI無限大。書いた人はなんら得しない。
ついでにいうと自分の時間と玄人の時間の価値を同じ価値だと思うなぞ
おこがましいにも程がある。
829822:2005/08/21(日) 22:42:51
もいい、わかった。811君の純粋さには負けた。
ズバリ教えてあげるから、もう秋まで戻ってこないで。
google で ocaml csv。これだけ。じゃ、バイバイ。
(811 はこれさえしていないのか、、、)
830デフォルトの名無しさん:2005/08/22(月) 02:26:26
暦の上ではもう秋だという罠
831デフォルトの名無しさん:2005/08/22(月) 02:43:06
そうですな磯野さん。
832デフォルトの名無しさん:2005/08/22(月) 09:44:27
磯野さん?
833デフォルトの名無しさん:2005/08/23(火) 13:41:02
ヒント: google で csv get_data calc_avg
834デフォルトの名無しさん:2005/08/24(水) 18:18:41
>833
>どっかにあると思われるサンプルをチョコっと直して頂ければそれで
>良いんですが。
大笑い!
誰か!いい加減チョコっと直してやれよってぇ…
と言ってみる。
835デフォルトの名無しさん:2005/08/25(木) 17:38:30
includeっていつから使えるようになったの?

moduleを取り込むやつね。openと何がちがうんだか・・・
836デフォルトの名無しさん:2005/08/25(木) 18:05:14
includeって初めて知ったけど、本家のマニュアル(表記が正しければ2004年7月13日)にも記載されているな。
open との違いもちゃんと書いてあるが、
module M1 = struct include String end;;
module M2 = struct open String end;;
などとしてM1とM2の違いを見れば一目瞭然。
837デフォルトの名無しさん:2005/08/26(金) 12:55:55
既存のモジュールを強化した新モジュールを作るときなんかに便利かな?
mystring.ml:
include String
let my_special_function_for_string = fun ...

838デフォルトの名無しさん:2005/09/02(金) 01:12:48
LLDN で ML の発表があったんだって?
トラックバック読む限りでは、結構好評だったみたいじゃん。
直接聞いた人いる?
839デフォルトの名無しさん:2005/09/02(金) 01:37:31
オレ聞いたよ。SMLで北陸先端大の人だから大堀先生のところの人なのかな。
ネタっぽくウケも取りつつ、割とポイントを抑えた説明になっていた気がする。
あ、ちなみに LLDN のサイトにある発表資料は、ウケ狙いの部分をぜんぶ削除
されてるね。
こんなややっこしい話を本当にしたわけじゃなくて、知らない人が聞いてもわ
からないであろうところはバンバンすっ飛ばして説明してたので、逆に知らな
い人でもイメージは掴みやすかったと思う。

しかしSMLでぐぐるとエロゲメーカーのサイトが出てくるとは思わなかった(笑)
840デフォルトの名無しさん:2005/09/02(金) 02:30:00
>>839
あー、ウケ狙いが聞きたかった...

よさげなプレゼンでML人口が10人は増えたな。そのうち一人はエロゲーと勘違
いしている悪寒。

841デフォルトの名無しさん:2005/09/03(土) 21:16:47

camlp4 の話ですが、パターンマッチングの拡張って個別にやらないとだめな
んでしょうか?

例えば、

match list, queue with
[], empty -> ()
| hd_list :: tl_list, hd_queue @:: tl_queue ->

みたいな事がしたいんです。

Queue.match .. with という構文を作ってしまえば出来そうなのは分かってい
ます。ところが、通常の match .. with を拡張する方法が分かりません。

もしかして FAQ?


842デフォルトの名無しさん:2005/09/04(日) 00:46:28
FAQではないと思う。

camlp4に詳しいわけじゃないのでよくわからないけど、パターンマッチの時に
自動的にガード式を追加して、そこで条件をゴチャゴチャやればできるんじゃ
ないか。
Micmatch は参考にならないかな。
http://martin.jambon.free.fr/micmatch.html
843デフォルトの名無しさん:2005/09/13(火) 19:50:24
最近 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"の代わりにインスタンスをまるごと、ファイルに出力したいのです。

はじめたばかりで混乱しているところもあるかと思いますが、よろしくお願いします。

844デフォルトの名無しさん:2005/09/13(火) 20:30:10
>>843
Marshal が使えないかねえ。
845843: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 フラグが必要ということでした。
846843: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
とかさらに無駄に追加したら成功するし。
847843: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個)うまくいきます。
いったい何がおきているやら・・・失敗するときと成功するときの違いがわからないです。
そもそも根本的にやり方が間違っているのでしょうか?
848デフォルトの名無しさん:2005/09/14(水) 23:15:27
output/input_value はそもそも全く型安全では無いので非常に注意を
払って使用してください。特に関数の output はアドレス書きこみのみ
ですので、output したのと、全く同じプログラムへの input 以外しか
安全性は保証されません。

いまいち何をやって問題が発生しているのか、正確にはわからないけど、
object のインスタンスもメソッドの関数アドレスを含みますから、御用心。
偶然うまくいっても、それはただの偶然です。
849848:2005/09/14(水) 23:17:59
ん?同一プログラム内での同じ型の書き込み、読み込みに失敗している?
もしそうだったらそりゃ caml のバグっぽいね。
850デフォルトの名無しさん:2005/09/14(水) 23:51:50
>>847
オブジェクトの marshalling はできないと思います。
http://pauillac.inria.fr/bin/caml-bugs/not%20a%20bug?id=381
851デフォルトの名無しさん:2005/09/15(木) 02:43:23
まあ、その、なんだ。
みんな OCaml とか言いながら、実は Caml の部分しか使ってない罠。
O の部分って、使わないんだよねえ。
852843:2005/09/15(木) 10:40:46
>>848 >>850
ありがとうございます。
なるほどオブジェクトの永続化はできないようですね。
偶然成功してただけか・・・・(メソッドの総数が1,2,4,8,16(2のべき乗?)の時に書き込みが成功した)
別の方法を考えてみようと思います。
>>851
いままでOOなプログラミングに浸ってたからなぁ。もう少し勉強してみます。
853デフォルトの名無しさん:2005/09/15(木) 11:05:58
>>843
そのうち map やら iter やら fold やらを使いまくって、
関数合成しまくるようになってくるさ、きっと。
OO って基本的にオブジェクトの状態を変更していくから、
あまり ML では好まれない。基本的に、状態は変更されないっていうスタンスだからなあ。
854デフォルトの名無しさん:2005/09/23(金) 01:08:06
大堀先生、東北大生のパワーを得てSML#の開発を早く!
855デフォルトの名無しさん:2005/09/23(金) 01:11:29
SML#

意味ワカラナス
856デフォルトの名無しさん:2005/09/24(土) 23:27:46
SML丼
857デフォルトの名無しさん:2005/09/27(火) 00:45:58
SML++
SML Markup Language
Visual SML
858デフォルトの名無しさん:2005/09/27(火) 06:12:41
どれもあんまり嬉しくない。
859デフォルトの名無しさん:2005/09/27(火) 09:49:43

Xavier Leroy ってなんて発音すればよいのでしょう?

ザビアー レロイ?
860デフォルトの名無しさん:2005/09/27(火) 10:02:33
フランスだから、「グザヴィエ・ルロア」となるのかな。
861デフォルトの名無しさん:2005/09/27(火) 11:35:01
ザビエル (リ|レ)ロイ と読んでる
862デフォルトの名無しさん:2005/09/27(火) 13:51:20
カタカナで無理に書けば ザビエ ルロワ が一番近い

より正確にはザの前にほんのちょっとグが入っていますが、
ほとんど聞き取れません。ワの発音はアとワの中間みたいな物です。
後は l と r さえ注意すれば問題なく彼を振り向かせることが出来ます。
863デフォルトの名無しさん:2005/09/28(水) 14:20:25
ありがとうございます。フランス語の発音難しぃー。

けっこうハンサムというか、可愛いというか、かっこいいですよね。
http://pauillac.inria.fr/~xleroy/index.html

10年前の写真みたいなんで、今はどうだか謎ですけどw
864デフォルトの名無しさん:2005/09/28(水) 21:24:45
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型の
データ構成子をはずした中身を見る方法、よろしくお願いします
866デフォルトの名無しさん:2005/10/02(日) 12:16:45
そんなことができたら、情報隠蔽の意味が無ぇ…
867デフォルトの名無しさん:2005/10/02(日) 15:52:09
>>866
全くだ……。
868デフォルトの名無しさん:2005/10/02(日) 17:07:25
ocamlしか知らないんだけど、
SMLはコンストラクタを公開できないの?
できるならAAを公開すればいいだけだと思うけど。
869デフォルトの名無しさん:2005/10/02(日) 18:54:56
「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;
870デフォルトの名無しさん:2005/10/03(月) 06:14:26
質問です。

SML/NJで、h::t の h がリストの最初の一つを取得できるように、
リストの最後の一つを取得することは可能ですか?
871デフォルトの名無しさん:2005/10/03(月) 10:42:59
>>870
取得そのものはできるけど、定数時間ではできないよ。
872デフォルトの名無しさん:2005/10/03(月) 15:39:46
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、・・・
というような管理関数を作ることはできますか?

(もしコメントアウトした部分を外して有効ならば、
デフォルトマッチの場合に次に行くことで実現できますが、
それは前発言に述べた別の質問になるかと思います)
875デフォルトの名無しさん:2005/10/04(火) 18:54:58
OCaml本の和訳の現状
http://d.hatena.ne.jp/sumii/20051004/1128414064
目次しか見てないが、けっこう訳されている。
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


って変換されてるの?
879デフォルトの名無しさん:2005/10/14(金) 17:22:49
いちいちコードを変換しているわけはないだろうが、コンパイルの結果として生成される
内部ノードだとか、最終的に生成されるバイトコードだとかは同じになるから、同じようなもの。
880デフォルトの名無しさん:2005/10/14(金) 19:32:29
>>879
いい加減なことは言わないように。
881デフォルトの名無しさん:2005/10/14(金) 20:24:16
>>880
興味あるんで、『いい加減』じゃない説明キボン
882デフォルトの名無しさん:2005/10/15(土) 15:26:34
>>880じゃないですが、少なくともocamlの場合は
バイトコードもネイティブコードもそんな変換しませんよ。
今のアーキテクチャだと実行が遅くなりますからね。

ocamlc -dinstrやocamlopt -Sで各コードのアセンブリが読めるので、
applyやcallの回数を見てみるといいんじゃないでしょうか。

>いちいちコードを変換しているわけはないだろうが
「(面倒なのにわざわざ)いちいち変換しない」という意味だったら逆ですよ。
コンパイラ作る側としたら変換してしまった方が楽です。
883デフォルトの名無しさん:2005/10/15(土) 17:18:23
よく判らんけど、>>878 はカリー化について訊きたいんじゃないの?
884デフォルトの名無しさん:2005/10/15(土) 17:29:44
複数引数の関数をどうするか?

let f a b = a+b

let f (a,b) = a+bとするか

let f = function a -> function b -> a+bとするか

???
885デフォルトの名無しさん:2005/10/15(土) 18:00:31
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などでは)複数引数が一度に適用される場合は
クロージャを生成しないようにコンパイルする。
886デフォルトの名無しさん:2005/10/15(土) 23:08:12
じゃあ、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;;
888デフォルトの名無しさん:2005/10/16(日) 00:34:08
>>886
生成される関数のコードは一つ。
Ocamlのバイトコードには「今実行中の関数に対する引数がスタックに積んであるか」を
判定する命令があり、それでもってクロージャを生成するか否かを実行時に判断している。

>>887
あってるのはmatch b 〜の前までですな。
nilのときはtrivial、aとbそれぞれのheadが =, <, > のときはどうするか…がんがって。
889デフォルトの名無しさん:2005/10/17(月) 00:01:22
>>887
課題みたいだからあまり言わないけど、そのまま突っ走っても頭がこんがらがって
良い答えは出ない希ガス。
少し引いてみて、まずは一般の union から考えてみては?
890デフォルトの名無しさん:2005/10/22(土) 00:21:12
みなさんアセンブリコードやコンパイラのソース読み込んでるんですか?
891デフォルトの名無しさん:2005/10/24(月) 07:41:14
シリアル化ってできますか?
ちょっと計算させて作ったデータ構造などを気軽に保存したいんですけど。
892デフォルトの名無しさん:2005/10/24(月) 08:46:23
自分で書くしかないかな。
serialize : 'a -> bytearray
deserialize : bytearray -> 'a
こんな関数書けるかな??
893デフォルトの名無しさん:2005/10/24(月) 09:51:09
marshal?
894デフォルトの名無しさん:2005/10/24(月) 11:09:02
Marshalモジュールありまんがな。
ファイル(チャネル)をバイナリで開いてoutput_value, input_valueで
読み書きすればよりお手軽に。
但しtype-safeでないことをゆめ忘れるな。
895デフォルトの名無しさん:2005/10/24(月) 12:15:36
CAML?
896デフォルトの名無しさん:2005/10/25(火) 01:01:35
重複になりますが、オブジェクトの marshalling はできません。御注意を。
ttp://pauillac.inria.fr/bin/caml-bugs/not%20a%20bug?id=381
ザビエ ルロワ先生のメールによると、状態と手続きを合わせて保存しなくて
はいけないので、難しいのだそうです。

最近、Thread間で割り込みが出来ないことを知り、ショックを隠せない ID より。
897デフォルトの名無しさん:2005/10/25(火) 01:18:07
Caml系のMLにしか目を向けない人が多いよね
活気をみれば仕方ないけど
898デフォルトの名無しさん:2005/10/25(火) 01:36:10
>>896
>Thread間で割り込みが出来ないことを知り
詳細キボン
899デフォルトの名無しさん:2005/10/25(火) 09:46:06
>>898
例えば、
let a = Thread.create (fun () -> データベースへの問い合わせ) () in
したとします。ここで、もしこのスレッド a の実行をキャンセルしたいとすると、
a の実行に対して何らか「割り込」んで、その制御をスレッド a の持っているリソースの
後始末やらキャンセルしましたというメッセージを出力するルーティンへジャンプさせたく
なります。

これをうまくやる方法としては、スレッドに任意の例外を発生させる
val raise_to : exn -> Thread.t -> unit
という仕組みがあれば便利です。例外によるジャンプを利用している訳です。
しかし、このような仕組みは現在の ocaml にはありません。

詳しくは、過去のメーリングリストでの議論を参照してください。
ttp://caml.inria.fr/pub/ml-archives/caml-list/2002/09/2b35126a3ea29c9fa1253e9800874edc.fr.html
900デフォルトの名無しさん:2005/10/26(水) 07:20:07
やっぱ一部の機関が作った言語は設計がなっとらんな。
901デフォルトの名無しさん:2005/10/26(水) 21:55:46
ちなみに SML, Concurrent ML にもこのような仕組みはありません。
# Haskell はあるらしい。
902デフォルトの名無しさん:2005/10/26(水) 22:48:29
ん? 設計っつーか、pthreadで実装されてないからじゃないの。
Haskellは基本的にRubyと同じuser level threadだから
*Haskellの範囲内では* raise_toとかできるが、
データベースの通信のようにCレベルで実行してる間は
コンテキストスイッチしないからraise_toできないはずだぞ。
903デフォルトの名無しさん:2005/10/27(木) 00:34:17
Javaでもできない(やらない方がいい)んじゃなかったっけ。
昔はできたけどその後deprecatedになったような。
ちゃんと同期とってやんなさいと。
904デフォルトの名無しさん:2005/10/27(木) 06:23:16
Javaでもそうなんだ。
やはり非同期例外というのは、諸刃の剣なのだろうか
905デフォルトの名無しさん:2005/10/27(木) 12:55:36
>>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。
906デフォルトの名無しさん:2005/10/27(木) 22:37:41
OCamlの"O"はお飾りなんですね。







とっちゃいば?
907デフォルトの名無しさん:2005/10/27(木) 23:19:15
「とっちゃえば?」が正しい。
908デフォルトの名無しさん:2005/10/28(金) 00:36:25
「とっちゃんは?」と空目したのは私だけですか、そうですか。
お飾りCaml 3.09.0 リリース、乙。
909デフォルトの名無しさん:2005/10/28(金) 12:34:28
lablgtkとかでバリバリ使ってますけど
910デフォルトの名無しさん:2005/10/28(金) 13:19:01
O'Caml の object の typing の癖を理解して、要所要所で使えば
使えないということは決してない。
Java とかから流れてきた人みたいに何でもクラスで書こうとすると、はまる。

911デフォルトの名無しさん:2005/10/30(日) 22:59:48
ちょっとしたプログラムを作る必要があって、言語はなんでも良かったので、
殆ど使ったことないOcamlで書いてみました。

仕様は
http://xbb.jp/uchichi/siyou.txt
です。
作ったのは
http://xbb.jp/uchichi/test.ml
です。
テストデータを作成するプログラムは
http://xbb.jp/uchichi/make_test.cpp
です。

たしかOCamlってかなり早いってどこかのサイトで書いてあったと
思うのですが、僕が作ったやつだと非常に遅いです。。。。。
どうやったら、早くなのでしょうか?
ついでに、書き方が変な所とかあったら教えて欲しいです。
沢山あり過ぎると思いますが。。。
912デフォルトの名無しさん:2005/10/31(月) 03:10:50
>911
あんまりちゃんと見てないけど。
毎回input_lineし、それをsplitして連想配列で持っておくアルゴリズムなの
で、メモリ消費が激しいように思う。GCしまくりなのかも。
それから、たぶんこれが主原因だと思うが、比較のたびにdateとtimeをアクセ
スしに行っているのは非常に効率が悪い。

なので、行を読み出したときに、 date とか time の値を取り出して date 型
を作っておき、alistを(date型, 元の行)というタプルのリストとしておく、
とかでだいぶ速くなると思う。


あと、 while と破壊的代入を使いまくりなのはあんまり関数的でないですね。
# その方が速かったりするのだが
913デフォルトの名無しさん:2005/10/31(月) 13:58:37
>>912
同意。
加えて、正規表現をループの度に作ってるのはイタい。これはループの外に外すべし。

let re_eq = Str.regexp "="
let re_amp = Str.regexp "&"

その他にも細かくは色々あるんだろうが、クリティカルじゃなさそうだし。
914911:2005/10/31(月) 22:24:09
>912
ご指摘有難う御座います。
タプルのリストにしたら、ちょっと早くなりました。
最初の奴が49秒で、タプルのリストにしたら、45秒になりました。

>913
ご指摘有難う御座います。
正規表現の部分をループの外に出したら、結構早くなりました。
最初の奴が49秒で、912さんに指摘していただいた修正と正規表現の部分を
外に出した奴は29秒でした。

ちなみにC#(こっちもほぼ初心者)で書いた奴だと24秒なので(Cでは10秒)、
まだ早くなると思うのですが、他にお気付きの点がありましたら
教えていただけると嬉しいです。
915デフォルトの名無しさん:2005/10/31(月) 22:46:17
ocamlopt でコンパイルした?
916デフォルトの名無しさん:2005/10/31(月) 23:00:43
改めて見たけど、urldecodeはかなり凄いことになっているね。Cのコードをかなりそのまま書き写している?
残るボトルネックはここだろうか。

改善案より前に一般的なOCamlのコーディングとして、
1. let _ はプログラムの main 部分以外では使われない傾向が強い。begin 〜 end を使う方がいいだろう
2. urldecodestring は、通常は urldecode 内で宣言して外からは参照できないようにする方が一般的だし安全
3. 破壊的代入が無駄に多いので、コンパイラの最適化が効いていないのでは。たとえばこの関数だと c とか

というところかな。
それから、いくら速いといってもCコンパイラよりは遅いよ。C#との差は知らない。

細かく知りたければ ocamlprof というプロファイラもあるから使ってみると良いかも。私は使ったことがないので細かいことはよく知りませんが。
あーとそれからもしやと思うけどバイトコードじゃないよね?
917デフォルトの名無しさん:2005/10/31(月) 23:20:54
というわけで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
918デフォルトの名無しさん:2005/11/01(火) 12:35:07
>>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;;
919デフォルトの名無しさん:2005/11/01(火) 12:35:41
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);;
920デフォルトの名無しさん:2005/11/01(火) 14:40:08
よく見ると917のhexは+9じゃなくて+10だな。結果はちゃんと見てなかったので、そういう小さいミスはあるかも。ただ本質的には速度はそれほど変わらないはず。
921911: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のタプルのリスト
にしたので、本質的には記述して頂いたコードと同じだと思うのですが、
書き方が悪くて遅かったみたいです。。。。
922911: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というか関数型言語に慣れる事が必要ですね。。。。

いろいろ有難う御座いました!
923デフォルトの名無しさん:2005/11/02(水) 15:40:06
やっぱ質問、質問者がちゃんとしてると盛り上がるな。
924デフォルトの名無しさん:2005/11/03(木) 01:33:21
Thread.kill について caml-list で議論中。
除いてまえという話もあるが、便利といえば便利だしなぁ。
925デフォルトの名無しさん:2005/11/03(木) 22:37:53
>>927
Gerd Stolpmann 氏が示したコードを実行したら、確かに kill っぽい事はできた。
ただし、複数のスレッドを落とそうとすると苦しい。
やっぱり"soft-kill"というのが現実的な解じゃなかろうか。
926デフォルトの名無しさん:2005/11/03(木) 22:38:38
>>925
924の間違い。
927デフォルトの名無しさん:2005/11/06(日) 17:14:09
ちょっと質問です。
Ocamlは昔IBMのプログラミングコンテストで優勝して
その生産性の高さを証明したと聞いています。

Ocamlの生産性の高さを説明するときに欠かせないエピソードなのですが
肝心のソースがインターネット上でも探しても見つかりません。

どなたかご存知の方は教えてもらえませんか?
928デフォルトの名無しさん:2005/11/07(月) 09:42:21
929デフォルトの名無しさん:2005/11/07(月) 16:01:22
>>928
ありがとうございます。
多分それであってます。
Ocamlはあんま詳しくないのですが

http://web.yl.is.s.u-tokyo.ac.jp/~oyama/publications/OyamaSPA98.html
>Schematicでは、逐次実行時間は最大でCの3倍強長いが、
>50プロセッサ上の実験環境で容易に24倍および14倍の台数効果が得られた。

これを見てもしかして関数型言語が本格的にやばいな
と思いはじめたもんなんで
930デフォルトの名無しさん:2005/11/07(月) 19:41:25
> これを見てもしかして関数型言語が本格的にやばいな
日本語おかしいんちゃう?と思ってしまうオレはもうオヤジだろうか。
931デフォルトの名無しさん:2005/11/07(月) 19:45:43
>>930
「もしかして」の結びがないってこと?
それとも「やばいな」のこと?

前者なら俺もそう思う。
後者ならオヤジかも知れない。
932デフォルトの名無しさん:2005/11/07(月) 20:03:18
つまり「関数型言語危ないー! 逃げてー!」とかいった感じに読める、ということ?
933sage:2005/11/07(月) 20:32:05
OCaml初心者です。
OCamlのソースで
let a = 10 let b = 20
というように、let を and,やinや ;; で
区切らずに並べて書いてあるものを見ましたが、マニュアルを見たり検索を
してもそのような文法を解説してあるところが見付からなくて、気になって
夜も眠れません。
どなたか解説or解説の紹介お願いします。
934930:2005/11/07(月) 21:06:06
>>932
そうそう、それそれ。
>>931 の言う前者も思ったけど、特に気になったのはこっちだった。

……オヤジなんだな orz
いや、意味がつかめないわけじゃないんだけど、
どうしても一瞬考えちゃうんだよな。

935デフォルトの名無しさん:2005/11/07(月) 21:13:08
おれもオヤジかなあ。意味はわかったけど「やばい」はないなと思ったよ。

>933
OCamlでは文(?)を開始するためのキーワードはあるけど、終わりは明示的に指定しなくてもよいことになっている。;;は入れても入れなくてもいい。
だからその例だと、2つめの let が出現した時点でコンパイラは let a = 10 が一塊であることがわかるわけ。するとのこりの let b = 20 も取り出すことができて、めでたく a に 10、bに20を束縛できる。
確かにそういう文法の解説ってあまりないかも。
936デフォルトの名無しさん:2005/11/07(月) 21:35:21
>935
ありがとうございます。謎が解けました。
勉強に励みます。
937デフォルトの名無しさん:2005/11/07(月) 23:09:33
やばい、やばい。

938デフォルトの名無しさん:2005/11/08(火) 00:57:00
ソフト納品したとき、若い担当者から「このプログラムやばいですよ。」
と言われた。クレームかと思って身構えて対応してたら、実は誉められていた。
という経験がある。
939デフォルトの名無しさん:2005/11/08(火) 01:14:30
>>929を読んでやばいと思ったら。みんなもやばいと思ってて安心した
940デフォルトの名無しさん:2005/11/08(火) 07:09:00
ヤバイ。宇宙ヤバイ。まじでヤバイよ、マジヤバイ。
宇宙ヤバイ。
まず広い。もう広いなんてもんじゃない。超広い。
広いとかっても
「東京ドーム20個ぶんくらい?」
とか、もう、そういうレベルじゃない。
何しろ無限。スゲェ!なんか単位とか無いの。何坪とか何ヘクタールとかを超越してる。無限だし超広い。
しかも膨張してるらしい。ヤバイよ、膨張だよ。
だって普通は地球とか膨張しないじゃん。だって自分の部屋の廊下がだんだん伸びてったら困るじゃん。トイレとか超遠いとか困るっしょ。
通学路が伸びて、一年のときは徒歩10分だったのに、三年のときは自転車で二時間とか泣くっしょ。
だから地球とか膨張しない。話のわかるヤツだ。
けど宇宙はヤバイ。そんなの気にしない。膨張しまくり。最も遠くから到達する光とか観測してもよくわかんないくらい遠い。ヤバすぎ。
無限っていたけど、もしかしたら有限かもしんない。でも有限って事にすると
「じゃあ、宇宙の端の外側ってナニよ?」
って事になるし、それは誰もわからない。ヤバイ。誰にも分からないなんて凄すぎる。
あと超寒い。約1ケルビン。摂氏で言うと−272℃。ヤバイ。寒すぎ。バナナで釘打つ暇もなく死ぬ。怖い。
それに超何も無い。超ガラガラ。それに超のんびり。億年とか平気で出てくる。億年て。小学生でも言わねぇよ、最近。
なんつっても宇宙は馬力が凄い。無限とか平気だし。
うちらなんて無限とかたかだか積分計算で出てきただけで上手く扱えないから有限にしたり、fと置いてみたり、演算子使ったりするのに、
宇宙は全然平気。無限を無限のまま扱ってる。凄い。ヤバイ。
とにかく貴様ら、宇宙のヤバさをもっと知るべきだと思います。
そんなヤバイ宇宙に出て行ったハッブルとか超偉い。もっとがんばれ。超がんばれ。

941デフォルトの名無しさん:2005/11/08(火) 16:33:05
最近の言い回しは
感情の動きの量と言葉の強さを一致させることのみ重視されていて、
動きのベクトルと意味との一致については割と大胆に軽んじるからな。
942すれ違いだが:2005/11/08(火) 16:48:32
昔「すごい」が辿ったのと同じような用法の変化だな。
国語学的には別に珍しいことではない。
943デフォルトの名無しさん:2005/11/08(火) 19:10:54
コンストラクタ同士の比較について質問です。

# 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が返ってきます。
同じ型だから比較演算の適用ができるのでしょうが、
その結果は定義されているのでしょうか?
944943:2005/11/08(火) 19:14:13

誤:その結果は定義されているのでしょうか?
正: その結果はどのように定義されているのでしょうか?
945デフォルトの名無しさん:2005/11/08(火) 21:40:00
>>931
安心しろ。リアル工房の俺も>>929の「やばい」という表現はおかしいと思ってる。
946デフォルトの名無しさん:2005/11/08(火) 21:49:48
たしかに929の使い方はやばいよな。
947デフォルトの名無しさん:2005/11/08(火) 22:09:33
>>943
こういうくだらないネタ(失礼)は好きなので、ソース見てみた。
たぶん、byterun/compare.c の compare_val 関数辺りだと思うが、
実質 int 同士、string 同士、float 同士、同じコンストラクタの値同士
くらいしか意味のある結果は返ってこないように見えるね。
948デフォルトの名無しさん:2005/11/08(火) 22:12:05
>>929 程度の人間でも関数型言語のスレを覗いているってのがスゴス
949デフォルトの名無しさん:2005/11/08(火) 22:38:40
いわゆるデータ型の比較では、まず構成子を比較して、構成子が同じなら中身
を比較する。

構成子の比較は型宣言の時の順序による。

ゆえに、
# 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
となる。

こういうのってマニュアルのどこに書いてあるのかなあ。
950デフォルトの名無しさん:2005/11/08(火) 23:13:18
int 、string 、float 以外の比較は基本的に未定義 (実装依存) じゃなかったっけ、
と思ってマニュアル探してみたけど見付からないな。

少なくとも Object に関しては
> The relation < defines an unspecified but strict ordering on objets.
と書いてあったんだけど。
951デフォルトの名無しさん:2005/11/09(水) 16:58:34
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

です。
952デフォルトの名無しさん:2005/11/09(水) 17:00:54
続き
引数のある(ない)コンストラクタ間の大小関係は、引数のある(ない)
コンストラクタ間の定義順序で決まります。

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 で決まっていた記憶しています。
953デフォルトの名無しさん:2005/11/10(木) 21:11:17
> O'Caml の実装は O'Caml しかないので、
最近はそうでもないと思いまつ。

OCamIL
http://www.pps.jussieu.fr/~montela/ocamil/

F#
http://research.microsoft.com/projects/ilx/fsharp.aspx
954デフォルトの名無しさん:2005/11/13(日) 18:35:23
sMLで書かれた
分解を用いた命題論理の範囲(論理結合子の推論規則のみ)での
定理証明のソースってどこかにありませんか?

作り方がさっぱりわからないので、参考にさせてもらえるといいのですが・・・。
955デフォルトの名無しさん:2005/11/15(火) 15:36:13
>>954
詳しくないけど, ML for the working Programmerの10章に
述語論理の定理証明のソースがあるから,それ参考にしたら?
956デフォルトの名無しさん:2005/11/15(火) 22:55:55
10章がそれでしたか・・・。

わかりました。
難しそうですが、参考にしてみます。

ありがとうございます。
957デフォルトの名無しさん:2005/11/15(火) 23:40:29
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という名前で定義(以下同様)
959デフォルトの名無しさん:2005/11/18(金) 09:54:34
列挙型に値を持たせたいってのが、すでに設計ミスじゃないの?と思わなくもないが、
(少なくとも C の enum みたいな単なる通し番号ならいらんと思う)
あえてやるなら
type hoge = A1 | A2 ...
を作って、それをキーにした Hashtbl とか?
960デフォルトの名無しさん:2005/11/18(金) 09:54:41
>>958
let A1 = 1 and A2 = 2 ...
let B1 = 11 and B2 = 12 ...
961デフォルトの名無しさん:2005/11/18(金) 13:00:22
>>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言語で言う列挙を結びつけない方が幸せかもー。
バリアント型はバリアント型なので。
962デフォルトの名無しさん:2005/11/18(金) 13:11:31
>961の「そもそもバリアント型とC言語で言う列挙を結びつけない方が幸せかもー。」というのは良い言葉だと思った。
説明するときには楽ですけどね。オレは「今どのメンバの値を持ってるかがタグで識別できる共用体」と説明してるけど。

それでもたとえば、曜日や月名なんかを数値にしたい場合もあると思うが、それには 959 のように Hashtbl を作るか、
let int_of_wday = function
| MON -> 1
| TUE -> 2
:
という関数を作るか、というのが一般的だと思う。
ってか Calendar モジュールがまさにこれをやってる。
963958:2005/11/19(土) 10:16:11
>>959 - 962
えらく勉強になりました。有難うございます
caml 使って間もないんですが物を考えるときに
Cの頭使い?みたいなものが未だに抜けない
もっと抽象的に大枠を掴めるようになりたいっすわ
つーわけで、素直に let A1 = 1 and A2 = 2 and ...
ということにしますた

バリアント型はバリアント型か・・・
964デフォルトの名無しさん:2005/11/19(土) 14:26:17
>>1
> リンク集 http://www.summa.jp/lang/func/ml/

は移転したそうです。
http://lang.x0.com/func/ml/
そろそろ新スレも近いので報告。
965デフォルトの名無しさん:2005/11/20(日) 11:33:42
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];;
=> エラー
966デフォルトの名無しさん:2005/11/20(日) 11:41:34
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
使った方がいいように思ったんだけど
969デフォルトの名無しさん:2005/11/24(木) 14:47:16
>>968
まぁ、単純にモジュール内部へのアクセス制限なら private でもいい気がす
るのには同意。

ただ、signature には型の抽象化という機能もあるし。signature と functor
の合わせ技で抽象的なモジュールの輸入という技法も使えるし。

なきゃないで困る訳よ。



970デフォルトの名無しさん:2005/11/24(木) 18:16:36
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
972デフォルトの名無しさん:2005/11/24(木) 22:32:48
>970
最初は、let s で毎回 "bbbb" が束縛されなおすのかなぁと
思いきや引き継ぐんですね・・・
なんで?
973デフォルトの名無しさん:2005/11/24(木) 22:35:40
どうして?
974デフォルトの名無しさん:2005/11/24(木) 23:10:26
sは束縛され直すだろ、普通に。毎回同じオブジェクトに束縛されるだけで。
975デフォルトの名無しさん:2005/11/24(木) 23:15:05
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。文字列を表示するときに引用符を書かないようにする方法はありますか?

よろしくおねがいします。
977デフォルトの名無しさん:2005/11/25(金) 16:30:33
宿題は自(ry
978デフォルトの名無しさん:2005/11/25(金) 18:11:04
print res;
によって正しく表示できる処理系って何?
979デフォルトの名無しさん:2005/11/25(金) 22:22:53
>> 978
G'Caml.
980デフォルトの名無しさん:2005/11/25(金) 22:26:18
>>975
for はここでは関係ないよん。
string constant の問題。
981デフォルトの名無しさん:2005/11/25(金) 23:24:12
G'Caml って使ったことないんだけど、OCamlベースじゃないの?
976 のコードはどう見ても SML だと思うんだが。
982デフォルトの名無しさん:2005/11/25(金) 23:29:38
>>974
つまり、let束縛は4回起こるが、文字列"bbbb"の初期化(生成)は
1回しか起こらない、ってことかな。
983デフォルトの名無しさん:2005/11/25(金) 23:35:22
つーかエラーにならんの?
もしかしてOcamlってヤパイ?
984デフォルトの名無しさん:2005/11/25(金) 23:41:00
val print : 'a -> 'a
な処理系ハッケソ。
http://wwwcgi.reading.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog_form?system=ml&Type=help&name=print
poplog ってのに含まれてる pml とか言うの。
985デフォルトの名無しさん:2005/11/25(金) 23:43:17
>>983
最初っから破壊的操作なんかしなきゃ良いのさ。
って言うか、なんで OCaml の string は mutable なのかと小一時間(ry
986デフォルトの名無しさん:2005/11/26(土) 00:40:24
immutableなstringって作れないの?
987デフォルトの名無しさん:2005/11/26(土) 01:38:19
むり
988デフォルトの名無しさん:2005/11/26(土) 01:41:12
効率上の妥協なのかな。
でもimmutableかどうか、なんて型推論に組み込めると思うけど。^^;
989デフォルトの名無しさん:2005/11/26(土) 01:43:06
おいおい何でもかんでも型推論に組み込めばいいってもんじゃないんだよw
990:2005/11/26(土) 01:46:31
あほ。
991デフォルトの名無しさん:2005/11/26(土) 03:27:01
>> 981
SML, O'Caml の違いでガタガタいわんといて。まあ、おおらかに。
なんか本題の質問からどんどん離れていくけど、

$ gcaml
G'Caml version 3.09.0

# Gprint.eprint ["A"; "B"; "C"];;
[ "A"; "B"; "C" ]
- : unit = ()

まー、G'Caml は型定義情報を持ってるからプリントできて当り前なんだけど。
992デフォルトの名無しさん:2005/11/26(土) 17:01:12
SMLで法政大学のpdfファイルの6-7問題の答えがわからないのですが・・・。
再帰をうまく使うんでしょうけど、
最大の高さを再帰の中でどうやって保存しておくかと、すべてのノードを調べるというのがうまくできなくて・・・。
誰かよろしくお願いします。
993デフォルトの名無しさん:2005/11/26(土) 19:25:41
宿題は
自分でやろう
タンジェント
994デフォルトの名無しさん:2005/11/26(土) 19:38:29
>>992
俺が直感でわかった程度の問題だぞ
自分でやれ
995デフォルトの名無しさん:2005/11/26(土) 20:10:01
次スレ
関数型言語ML(SML, OCaml, etc.), Part 4
http://pc8.2ch.net/test/read.cgi/tech/1133003340/
996デフォルトの名無しさん:2005/11/26(土) 21:06:01
996
997デフォルトの名無しさん:2005/11/26(土) 21:06:21
997
998デフォルトの名無しさん:2005/11/26(土) 21:06:42
998
999デフォルトの名無しさん:2005/11/26(土) 21:24:05
ダー
1000デフォルトの名無しさん:2005/11/26(土) 21:26:44
本当の通は1000より999を選ぶ。1000取って喜んでる奴はまだまだ甘ちゃんだ。
俺は違いの解かる漢
  _、_
( ,_ノ` )y━・~~~
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。