[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:21 / Filesize : 224 KB / Number-of Response : 956
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:49:54 ]
関数型言語MLについて語るスレッドです。

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

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

前スレ
関数型言語ML(SML, OCaml, etc.), Part 4
pc11.2ch.net/test/read.cgi/tech/1133003340/

413 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 02:56:54 ]
>>412
かじりかけじゃしょうがないと思うからがんばれ。


414 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:27:09 ]
パターンマッチにパターンじゃなくて式を書いちゃうのは初心者にはよくあること。
入門書は振れるべきかもわからんね。


415 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 11:13:11 ]
つ 入門OCaml

416 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 19:44:14 ]
軸がぶれている

417 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 10:41:42 ]
質問です、リストの文字を全部つなげるとき

List.fold_left (^) "" ["1"; "2"; "3"]

とか書くとするじゃないですか
でも例えばちょこっと関数を間に挟みたいとき、

let conv x = x ^ "!!" in
List.fold_left (fun a b -> a ^ (conv b)) "" ["1"; "2"; "3"]

とか書くのって違うのかなとか思ってるんですよ

(fun a b ->a ^ (conv b))

の部分をもっとこう関数の合成みたいな感じで短く書く方法ってないですかね

418 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:19:57 ]
十分簡潔に書けていると思う。わかりやすいし。
なぜそんなに短さにこだわる?

419 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:31:55 ]
質問の趣旨とずれているが、そもそも (^) を fold するのはお勧めできない。
文字列コピーが多すぎるから。String.concat とか、 Buffer を使うべし。
上の例は、

String.concat "" (List.map conv ["1"; "2"; "3"])

これで十分だろう。(^) を使うなら417で十分。無理に短く書いて喜ぶ言語ではない。


420 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 12:36:50 ]
              ,,,,,,,,,,,,,,,,,,,,,,,,,,
             /": : : : : : : : \
           /-─-,,,_: : : : : : : : :\
          /     '''-,,,: : : : : : : :i
          /、      /: : : : : : : : i     ________
         r-、 ,,,,,,,,,,、 /: : : : : : : : : :i    /
         L_, ,   、 \: : : : : : : : :i   /  λ抽象したら
         /●) (●>   |: :__,=-、: / <   負けかなと思ってる
        l イ  '-     |:/ tbノノ    \
        l ,`-=-'\     `l ι';/       \
        ヽトェ-ェェ-:)     -r'          ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         ヾ=-'     / /  
     ____ヽ::::...   / ::::|
  / ̄ ::::::::::::::l `──''''   :::|


421 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:08:51 ]
>>417
俺だったら先にmapする



422 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:42:08 ]
俺はconvを2引数にしてこんな感じにするかな
List.fold_left conv "1" ["2"; "3"]


423 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:29:56 ]
ありがとうございました
Buffer は知ってたけど、String.concat は知りませんでした
map 先にやって、String.concat で書くことにします

424 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:34:58 ]
OCamlでファイルIOするときUnix.lseekとかが
file_descr -> int -> seek_command -> int
でintで足りない場合が多々あるかと思うのですが、
皆さんは大きなファイルのIOをするときはどうしてますか?
オフセットの計算とかも Int64.add pos (Int64.mul index 4L)
みたいにしてやってますか?


425 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:20:52 ]
Unix.LargeFile

おまいら、ライブラリ関数で迷ったらまず .mli 読むか、grep するか、
ocamlbrowser でも使えよな。



426 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:34:33 ]
>>425
おお、ありがとうございます!

427 名前:デフォルトの名無しさん [2008/06/08(日) 17:22:38 ]
>>424
31bitがだめなら63bitがあるじゃない。

# 0xffffffff;;
- : int = 4294967295

428 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:54:23 ]
>>427
つまらん



429 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:32:15 ]
質問。関数型言語の特徴の一つとしてパターンマッチって出てくるけど何が利点なの?
ifの構文糖衣のようにも思えるけど

430 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 19:07:00 ]
簡潔に書ける

431 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 19:48:17 ]
>>429
もしパターンマッチがないとすれば、代数的データ型から値を取り出したい場合はどうする?
たとえばHaskellのMaybe型のJust 3という値から、3という値を取り出したい場合はどうする?



432 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 20:25:17 ]
それはアクセス関数が自動生成されるようにすれば済む話じゃないか

433 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 20:39:02 ]
>>429
構文糖には何も利点がないとでも?

434 名前:デフォルトの名無しさん [2008/06/12(木) 22:33:33 ]
安全なダウンキャストができることとか?

435 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 22:41:54 ]
>>434
x + yって中間記法、よく出てくるけど何が利点なの?
(+ x y)の構文糖衣のようにも思えるけど


436 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 22:42:53 ]
>>432
具体的に実装するとすればどうしますか?
MaybeにはNothingという値もあるんですよ。

437 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:11:58 ]
>>436
入力が不適なら例外発生

438 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:24:50 ]
>>437
Maybeは代数的データ型のひとつの定義に過ぎませんよ。
Just aとNothing以外にHogeという値がある別の定義があったらどうするんですか?
定義はいくらでも作れますよ。

439 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:37:45 ]
>>438
言っている意味が分からん
アクセサの自動生成はHaskellが既にやってること(フィールドラベル使ったときに)だし、技術的な問題はないと思うんだが

440 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 03:16:09 ]
パターンマッチの利点:
簡潔 - 記述しやすい (accessors (or deconstructors) for free)
安全 - non exhaustiveness check
速度 - 分岐が集約されているので最適化が楽 (ifの繰り返しを解析するのにくらべて)
以上。他にあるかな?

(というか、そもそもパターンマッチは関数型言語の特徴ではありません。
関数型言語が採用しているADTの特徴というべきでしょ。)


441 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 03:29:17 ]
問題

パターンマッチを採用している手続き型言語を挙げよ



442 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 05:12:14 ]
awkはパターンマッチなのかな

443 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:15:48 ]
マセマティカ
項書換えシステム全般 (論理型も含む)


444 名前:デフォルトの名無しさん mailto:sage [2008/06/13(金) 08:24:46 ]
Scalaはcase classがある。
パターンマッチ渡しはできないが、match case文がある。
www.scala-lang.org/intro/caseclasses.html
Extractorはユーザ定義もできる。
www.scala-lang.org/intro/extractors.html

445 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 00:12:39 ]
SML#はもう開発止まっちゃったの?


446 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 13:51:28 ]
F#(OCAML系)があるしなあ。

JNI(Java Native Interface)の中の人は、
SML/NJのWin32対応をやっていた人だった。
Modular Monadic Semanticsの人。

447 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 17:39:37 ]
メンバがわりと沢山ある構造体(record)がいくつか必要な時は皆さん
メンバの名前が被らないように注意してレコード作ってますか?
それともクラスにしますか?

448 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:15:11 ]
>>446
何か勘違いしていると思われ


449 名前:デフォルトの名無しさん [2008/06/16(月) 21:15:42 ]
F#があるのとSML#関係なくね?SML.NETの存在は微妙かも知れんけど

450 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:18:34 ]
>>447
モジュール名で区別でおk
OCamlでオブジェクトの濫用はお勧めできない


451 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:45:23 ]
SML#の「#」は、.NETよりも歴史が長い




452 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:45:43 ]
プロジェクト期間終了したから取りあえず一息つきたいんじゃないの?
O堀さんのことだからこれで終りとは思えないが。


453 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 03:18:35 ]
>>450
おお、目から鱗ですありがとう!
このスレは勉強になります。。
俺もできるならクラスは使いたくなかったので助かりましたわ。

454 名前:デフォルトの名無しさん [2008/06/22(日) 02:24:57 ]
SML♯で,配列 data[](要素数 n)と int型の i,j を引数にとって,
要素 data[i] と data[j] を入れ替えた配列 を出力する関数
ってどうやればいいんかいな?

455 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 22:44:31 ]
宿題ですか?


456 名前:デフォルトの名無しさん mailto:sage [2008/06/22(日) 23:37:58 ]
OCamlのStream便利だな。。。何でもかんでもコレ使いたくなっちゃうわ。
何かマズいことあるのかな?

457 名前:デフォルトの名無しさん [2008/06/23(月) 01:54:09 ]
マズいことはないけど破壊的なのがなにかと使いにくいと思う。

458 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 01:56:52 ]
>>457
つまりHaskell最高ってことか?

459 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 02:57:29 ]
ほとんどのデータがint縛りっていうか、31bit制限があるところがツラいと思うんですが、
色々と工夫というかテクがあるなら教えて頂きたいです。

460 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 06:54:26 ]
>>456
人生、これストリームなり

461 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 12:22:57 ]
[1;2;3;4]を入力すると[1;3;6;10]を返す関数sigmaを書いたんですが
sigma関数の箇所、もっと効率的なやり方があるような気がしてむずがゆい感じがしてます。
何かアドバイスいただけないでしょうか

let iota n = List.init n ((+)1) in
let sum lst= List.fold_left (+) 0 lst in
let rec take n lst =
    match n with
    0 -> []
    | 1 -> [List.hd lst]
    | _ -> (List.hd lst)::take (n-1) (List.tl lst) in
let sigma lst =
    List.rev (List.fold_left (fun x y->sum (take y lst)::x) [] (iota (List.length lst))) in
sigma [1;2;3;4;5;6];;



462 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 13:13:09 ]
累積変数で、これまでの和を持ち運ぶ

463 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 14:45:07 ]
ありがとう。こんな感じですかね
(途中まで同じ)
let sigma lst =
    let accum = ref [] in
    List.rev (List.fold_left (fun x y-> accum:=y::!accum; sum !accum::x) [] (iota (List.length lst))) in
sigma [1;2;3;4;5;6];;


464 名前:デフォルトの名無しさん [2008/06/23(月) 15:38:22 ]
えー。「ここまでの結果」を「引数で」持ちまわるんだよ。再帰終了するところでその引数をそのまま返す。

465 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 15:59:00 ]
んー、持ち回る引数がfoldの中なので、プログラム全体の形、結構変わりますよね?
こういった変換は慣れていないので、ちょっと時間がかかりそうです

466 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 17:53:21 ]
iotaとかsumとかtakeとかを使わないで、さらにfoldにこだわらなくて、かつ再帰を使っていいなら
こんなのはどうっすかね?

let sigma l =
let rec sigma' cur r = function
  | [] -> List.rev r
  | x::xs -> let next = cur + x in sigma' next (next :: r) xs in
sigma' 0 [] l


# sigma [];;
- : int list = []
# sigma [1;2;3;4;5;6];;
- : int list = [1; 3; 6; 10; 15; 21]

foldとかを使ったもっとElegante"〜{エレガンテ}〜"な方法を希望ならスマソ。

467 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 20:17:29 ]
こんな感じ。

reverse $ snd $ foldl (\(a,xs) b -> let x = a + b in (x,x:xs)) (0,[])

Haskellの構文を使ってるがMLでも同様のはず。

468 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 20:21:41 ]
pairにする必要ないんじゃ…

tail $ reverse $ foldl (\a b -> (head a + b):a) [0]


469 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 20:37:13 ]
>>468
おお、こういうのがノータイムで出てくるようになりたいわ。

470 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 21:44:56 ]
let sigma lst =
let rec sum lst =
match lst with
| [] -> []
| car :: cdr -> (List.fold_left (+) 0 lst) :: (sum cdr) in
List.rev (sum (List.rev lst));;
こんなんどうでっしゃろ?

471 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 21:48:14 ]
>>467-468
おまいらHaskell大好きだなwwwww



472 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 22:44:06 ]
MLの構文を知らずにこのスレを覗いてる奴が結構居ると予想

473 名前:デフォルトの名無しさん [2008/06/23(月) 22:46:14 ]
関数の中ですぐmatchするのってfunctionで書き直しちゃいたいんだけど。

474 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 23:08:55 ]
let sigma l =
 let rec aux store = function
 | [] -> []
 | x::xs -> x+store :: aux (x+store) xs
 in
 aux 0 l
これでok。末尾再帰じゃないけど。な。

475 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 23:31:25 ]
うおお、皆さんありがとう!
いろんなやり方があって勉強になります

476 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 23:39:06 ]
let ($) g f x = g (f x)
let sigma = (fun s -> rev $ fold_left (fun ys x -> s := x + !s; !s::ys) []) (ref 0)

477 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 23:43:15 ]
let (@@) f x = f x
let sigma l = (fun s -> rev @@ fold_left (fun ys x -> s := x + !s; !s :: ys) [] l) @@ ref 0

478 名前:デフォルトの名無しさん mailto:sage [2008/06/23(月) 23:47:55 ]
let sigma = tl $ rev $ fold_left (fun ys x -> hd ys+x :: ys) [0]

479 名前:Haskell 修業中 mailto:sage [2008/06/24(火) 04:32:12 ]
すんません。まさに >>472 なんですが…。

import List

sigma = tail.(scanl (+) 0)



480 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 21:58:08 ]
対象かアーキュムレータの頭を累積値として利用する手もある。

let rec sigma = function
  | [] -> []
  | hd::[] -> hd::[]
  | x::y::tl -> x::(sigma (x+y::tl));;

let sigma_rev l = 
  List.fold_left (fun acc hd ->
    match acc with 
    | [] -> hd::acc
    | last::_ -> hd+last::acc) [] l;;

481 名前:デフォルトの名無しさん mailto:sage [2008/06/24(火) 23:31:17 ]
>>479

tail . (scanl (+) 0)

scanl1 (+)
でおっけ



482 名前:Haskell 修業中 mailto:sage [2008/06/24(火) 23:48:01 ]
>>481
おおっ!そんなのがあるんですね。

やっぱ、Haskellすごいわ
スペースを入れてもわずか10文字w

483 名前:デフォルトの名無しさん mailto:sage [2008/06/25(水) 01:45:08 ]
意味不明なライブラリ関数の海で遊んで溺れかけているHaskellianにしか見えない。
逆に、OCamlには関数なさすぎ砂漠なわけだが。


484 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 17:36:09 ]
Haskellそこらじゅうで大人気だな。
ム板住民の半分はHaskell(かRuby)好きなんじゃないかと思えてくるわ。

OCamlはデフォルトでは関数も文法も少ないけど自分で定義しなさい、みたいな所がCっぽくて好き。

let scanl1 f = function | [] -> [] | (x::xs) -> scanl f x xs
let scanl f x y = List.rev (List.fold_left (fun a b -> (f (List.hd a) b) :: a) [x] y)

scanl1 (+) [1;2;3;4];;
ってできるし。
HaskellとOCamlの差が出てくるのはやっぱりIOとかかね。

485 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 18:20:16 ]
refを沢山使うprogramをHaskellで書くのは大変。
Ocamlで書くのが大変なのは…特にないな。遅延計算くらいか。

486 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 18:34:02 ]
ファイルを順々に読んでいく、みたいのはHaskellだと遅延評価だから普通のリストと同じように出来るけど、
OCamlだとバッファリングするとかストリームとか多少は副作用がある方法を使わなきゃいけないかなー。
まあ他の言語ではみんなそうしてるから特に抵抗は無いが。

487 名前:Haskell 修業中 mailto:sage [2008/06/26(木) 18:35:15 ]
>>485
Streamって遅延計算じゃないんですか?

488 名前:Haskell 修業中 mailto:sage [2008/06/26(木) 18:37:26 ]
あっ、かぶったw
やっぱりStream使うんですね。

489 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 18:56:37 ]
Streamはかなり便利だけど、
Haskellでは通常のリスト操作みたいに出来るっていうのはやっぱり魅力だよな。
使い方にもよるがソースがStream.junk ();とかだらけになるのは美しくないので避けたい。


490 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 20:28:23 ]
>>485
たとえば?
俺がHaskellですっきり書いてやるよ。

491 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 18:43:09 ]
ocamlcってgccの-O0みたいなオプションないのかな

というかこんなことを平気で聞いてもよさげな初心者スレないのかな



492 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 22:56:35 ]
というかこんな意味不明なこと平気で聞くなよ。
kwsk


493 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 01:38:52 ]
>>492
ocamldebugを使ってみた
   ↓
Eventなのに止まらないだと・・・?
   ↓
きっとコンパイラが最適化してるからだ!
   ↓
ocamlのコンパイラって最適化無効にするオプションないのかな←今ここ

ocamldebugのstep実行で止まるはずのポイント飛ばされたり、
プロファイラで使われているはずの関数が未使用と判定されたり、
言語以前にツールの使い方覚えるとこで俺\(^o^)/

494 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 02:23:23 ]
全然初心者的内容じゃねーじゃん。ocamlc (ocamloptもそうだが) は
最適化みたいなことはほとんどしてないんで。書いたとおりに実行するよ。

優秀なOCamlプログラマを大勢知っていますが、大多数はデバッガの必要を感じていません。
俺もデバッガは使わないので何ともいえんが、何か使いかたを過っているか、
camlの評価順なぞを未理解なのではないかと思われ…


495 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 03:05:49 ]
>>490
ICFP PC 2007の問題とかどうよ?

RNA実行するだけでも副作用なしだと大変じゃないかな

496 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 05:35:04 ]
>>494
皆使ってなかったのか・・・
ソース解析する際流れ追うのに使えるかと思ったんだが

>何か使いかたを過っているか、
>camlの評価順なぞを未理解なのではないかと思われ…
どっちも怪しいのでもちっと勉強してくる

497 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 10:30:39 ]
>>494
そういうのって全部ログコードはいてチェックするんですか?デバッグとそういうやり方併用してるけれど全部それだとチョイきつそう。

498 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 14:39:27 ]
コードを綺麗に書けば、printf デバッグと、十分なユニットテストで 大抵バグは潰せる。
デバッガでちまちまやる前に、assertion と Printexc.get_backtrace でかなりのことはわかるはずだが。
Cのデバッガのように必須だという認識の人は少ないと思われ。
もちろん使うなとは言わん。ocamldebugはリプレイとか強力。


499 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:12:07 ]
>>498
cの場合は破壊的操作と非破壊的操作をあまり意識せずにプログラミングすることもあるから
余計に必要になってくるのではないか?それに、小さな関数の定義を作って大きくするより、
一つでまとめて操作すると言う習慣も影響してるかも。

500 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 23:45:19 ]
Cは(普通は)インタプリタがないからっていう部分も大きいと思う。

501 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 03:08:23 ]
ちょっとcodepadが使えるのか試してみたよ。
codepad.org/14IrPYhB



502 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 03:21:42 ]
C は REPL が無いからね

503 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:22:57 ]
lisp的なREPLを備えたC環境なんてないよな。確かに…

あってもいいんだけど。

504 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:55:26 ]
gdbは?

505 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:58:08 ]
そういえばこんなのがあったの忘れてたわ。

C-REPL
neugierig.org/software/c-repl/

506 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:58:59 ]
Haskell製か

507 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:53:12 ]
>>504

>Cのデバッガのように必須だという認識の人は少ないと思われ。

だから普通はそういう事なんだろうなww
まあgdbではlispとかcamlとかみたいに書いて即テストって訳にはいかないがgdbは便利だよな。

508 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 03:43:57 ]
>>454亀だがちょうど最近覚えたので確認のために
fun swap (date,i,j)=
 let
  val a = Array.sub(date,i)
  val b = Array.sub(date,j)
 in
  Array.update(date,i,b);
  Array.update(date,j,a)
 end
localでArrayをopenしておいたほうが綺麗かも


509 名前:デフォルトの名無しさん [2008/07/22(火) 18:35:13 ]
すんまそん、Ocamlで日本語文字は扱えませんか?
例えば正規表現なんかでも使いたいんですが。


510 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 20:41:48 ]
OCamlのstring型は任意のバイナリが入るので、標準入力とかファイル経由で扱うなら
日本語でもなんでもあり。
ただし、OCamlのソースコードに日本語を埋め込みたいなら、EUC_JP以外使えないと思う。
EUC_JPなら、普通にperl互換正規表現ライブラリのラッパーが使える。
pcre-ocaml.sourceforge.net/
データをUNICODEとして扱うなら、Camomileで日本語「文字」を扱えますね。
camomile.sourceforge.net/index.html.ja.jis

あと、正規表現で日本語を扱う問題はOCamlに限らずどれでも一緒なので、
www.din.or.jp/~ohzaki/perl.htm
あたりをどうぞ。

511 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:03:32 ]
最後のURLは、perlのやり方としては古くて、
(今や\p{Hiragana}という風に"script"を文字クラスとして指定できるので)
「どれも一緒」というよりも、Ocamlだとこのやり方が有効って事になると思います。



512 名前:デフォルトの名無しさん mailto:sage [2008/07/22(火) 22:16:11 ]
UTF8 で書いて pcre-ocaml の `UTF8 オプションを使え。あと camomlile。以上。


513 名前:デフォルトの名無しさん [2008/07/23(水) 22:25:46 ]
MLtonのFFIを使って、Cのmain関数からSMLを呼びたいのだが、これは
不可能?








[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<224KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef