純粋関数型言語Concurent Clean
at TECH
1:デフォルトの名無しさん
04/02/01 18:55
純粋関数型言語Cleanに関するスレッドです。
関数型には珍しくIDEと、IO,Gameライブラリが標準でついてきます。
関連リンク
本家
URLリンク(www.cs.kun.nl)
日本語ドキュメントなど
URLリンク(sky.zero.ad.jp)
2:デフォルトの名無しさん
04/02/01 18:57
あっConcurentじゃなくてConcurrentね。
間違えちゃった、許して。
3:3
04/02/01 19:08
本気(maji)ですか!?
4:デフォルトの名無しさん
04/02/01 19:10
関連リンク
Sparkle
URLリンク(www.cs.kun.nl)
(定理証明系)
ゲームライブラリ
URLリンク(cleangl.sourceforge.net)
Gast
URLリンク(www.cs.kun.nl)
(自動テストシステム)
Clean要望リスト
URLリンク(www.cs.kun.nl)
Cleanのメーリングリストのアーカイブ(Discussions )
URLリンク(www.cs.kun.nl)
Cleanのメーリングリストのアーカイブ (Announce )
URLリンク(www.cs.kun.nl)
5:デフォルトの名無しさん
04/02/01 19:14
関連ありそうなスレ
関数型プログラミング言語Haskell
スレリンク(tech板)
関数型言語Part3
スレリンク(tech板)
6:デフォルトの名無しさん
04/02/01 19:33
純粋関数型って何?
7:デフォルトの名無しさん
04/02/01 19:52
Haskellとどっちが純粋ですか?
8:デフォルトの名無しさん
04/02/01 19:57
Cleanは型一意性によって副作用の問題を克服しています。
一意性についてはココをみてください。
URLリンク(sky.zero.ad.jp)
なお、Haskellと同じくモナドも使えます。
ドッチが純粋かはわかりません。
たぶん同じぐらいじゃないっすかね?
9:デフォルトの名無しさん
04/02/03 13:56
ユーザーに歩み寄りをかなり強いる言語な気がする。
>>8
'*'を付ける〜とかの純粋さの証明って、あれで説明になってるの?
さっぱりわからねえよ
10:デフォルトの名無しさん
04/02/03 15:02
綴りが間違ってる。
11:デフォルトの名無しさん
04/02/03 15:04
>>9
何を言っているか分からんが、
評価結果が評価順序から独立していれば、
一応は参照透明だということになってるよ。
副作用がないってのが厳密な純粋性だけどね。
12:デフォルトの名無しさん
04/02/03 17:30
ここでは「純粋」ならば「strictでない」のだそうだ
13:デフォルトの名無しさん
04/02/03 19:24
色々コード見てみないとよくわからないね。
例えばCSV形式のファイルがあるとして、第n列のデータを抜き出して
行ごとに出力する、みたいなコードはCleanで書くとどうなるの?
(空データは空行として出力、引用符の認識は不要)
インタフェースはこんな感じで。
csvref <n> <file> //n列目を出力する
入力データ(test.csv)
aaa,bbb,ccc
,eee,fff
ggg.hhh.iii
csvref 1 test.csv の結果
aaa
ggg
csvref 2 test.csv の結果
bbb
eee
hhh
14:デフォルトの名無しさん
04/02/05 14:28
>>12
該当箇所が分からんが。
15:デフォルトの名無しさん
04/02/05 16:18
Windows版に興味がでたのですが、
cleanって日本語も扱えるのでしょうか?
16:デフォルトの名無しさん
04/02/06 16:27
>>13
その場合は他の関数型言語と変わらんな。
17:デフォルトの名無しさん
04/02/06 18:23
>>16
ミクロなところ(実際にどうなるのか)を聞きたいんだと思うよ。
おれはそう。IOとか。
Haskellだと
-------
module Main where
import System
import System.IO
main
= do(sn:sfn:_) <- getArgs
ss <- openFile sfn ReadMode >>= hGetContents
putStrLn $ unlines $ map ((!! (read sn - 1)) . cols) $ lines ss
cols s = case break (\c -> or (map (c ==) ",.")) s of
(w, []) -> [w]
(w, _:ws) -> w: cols ws
18:デフォルトの名無しさん
04/02/06 18:29
indent崩れた…
# Cleanスレだから張り直さないほうがいいかな。
19:デフォルトの名無しさん
04/02/07 17:22
>>15
使ってみれば分かる。
20:デフォルトの名無しさん
04/02/08 00:03
>>15
使えません
21:デフォルトの名無しさん
04/02/08 16:45
ユニコードに対応したライブラリはない。
従って、表示はともかく、操作はできない。
22:Aransk
04/02/08 18:08
最近は徐々に相手の神経を逆撫でする発言スタイルを
モデレートタイプに修正中です。是非早くHaskellスレPart3
を立ち上げて下さい。それとも、このCleanスレと
目出度く合体!でも当方としては、全然問題ありません。
HakellとCleanは兄弟のようなもんですから(^^;
URLリンク(homepage3.nifty.com)
23:デフォルトの名無しさん
04/02/08 18:25
>>17
ファイルの読込であれば、
こんな関数を作ればよい。
↓
Read :: File -> [Char] // ファイルから読み込んで文字リストを作る
Read f
# (b,ch,filerest) = sfreadc f
| not b = []
| otherwise = [ch : Read filerest]
要するにFile型の引数を操作すればいいだけ。
その前にsfopen関数当たりで関連付けるけどな。
24:デフォルトの名無しさん
04/02/09 00:28
で、実際13はどうなるんだ
25:デフォルトの名無しさん
04/02/09 01:07
>>22
せっかくリファレンスの日本語訳が出たんだから Python でもやってろ
26:デフォルトの名無しさん
04/02/09 01:18
いいからNGネームに追加しとけ
27:デフォルトの名無しさん
04/02/09 01:49
>>13をC言語で適当に書いたコード
おまいらこれをCleanに変換してくれよ
#include <stdio.h>
#define deref(x,i) *(int *)((x) + ((i)*4))
cvsref_fp(no, in, out) {
int c, column = 1;
while ((c = fgetc(in)) != EOF)
if (c == ',') ++column;
else if (c == '\n') fputc(c, out), column = 1;
else if (column == no) fputc(c, out);
}
cvsref(no, filename) {
int fp = fopen(filename, "r");
!fp ? printf("Error: File not found.\n"),exit(1) :
cvsref_fp(no, fp, stdout);
fclose(fp);
}
main(c,v) {
c != 3 ? printf("Usage: csvref <no> <filename>\n"),exit(1) :
cvsref(atoi(deref(v, 1)), deref(v, 2));
}
28:
04/02/09 11:58
今週末に考えるので気長に待ってろ。
29:
04/02/09 12:01
といってもそれを変換するとは限らない。
30:デフォルトの名無しさん
04/02/09 13:58
haskell の新スレまだぁー?
31:デフォルトの名無しさん
04/02/09 15:38
まだ立ってなかったのか
32:Aransk
04/02/09 17:34
新しいスレ立てんなら立てる。
Cleanと一緒ならそう宣言する。
どっちか早く決めてもらいたい!
ワタクシ、
言いたいことが山のように溜まっておるのです。
キミ,恐るることなかれ。(^^;)
URLリンク(homepage3.nifty.com)
33:デフォルトの名無しさん
04/02/09 17:45
↑のアホがいないときに立てるよ
34:デフォルトの名無しさん
04/02/09 17:48
>>32
自分の名前でスレッド立てれば?
少しぐらいなら相手してあげてもいいよ
ただし場所は
URLリンク(pc.2ch.net)
こっちでどうぞ。
35:デフォルトの名無しさん
04/02/09 19:30
>>32
お前が立てろよ
まあ直後にネタ板と化すだろうが
36:デフォルトの名無しさん
04/02/09 22:09
おまえら
あんま会話するな
37:デフォルトの名無しさん
04/02/10 00:23
なんで>>13にこだわるんだろ?
module getcsv
import StdEnv,ArgEnv
Start world
= StartCSV world
StartCSV world
# (readok, read_file, f)= sfopen filename FReadText world
| not readok= abort ""
# (write_file, f)= stdio f
# (file)= CharListWrite (getCsvData col (CharListRead read_file)) write_file
# (closeok, f)= fclose file f
| not closeok= abort ""
| otherwise= f
where
col= toInt argv.[1]
filename= argv.[2]
argv=getCommandLine
つづけて宜しゅうございますか?
38:デフォルトの名無しさん
04/02/10 00:34
もったいぶってどうするんだ?
ここは1が密かに努力するスレだと思うぞ
39:デフォルトの名無しさん
04/02/10 00:44
>>1ではないのだが・・・
続き
getCsvData :: Int [Char] -> [Char]
getCsvData num [x:xs] = getCsvData` num [x:xs]
where
getCsvData` n [x:xs]
| x == '\n' = ['\n'] ++ getCsvData` num xs
| x == ',' = getCsvData` (n-1) xs
| n == 0 = [x] ++ getCsvData` n xs
| otherwise = getCsvData` n xs
// getCsvData` 0 [x:xs] = [x] ++ getCsvData` 0 xs
getCsvData` n [] = []
CharListWrite [] f = f
CharListWrite [c:cs] f = CharListWrite cs (fwritec c f)
CharFileCopy infile outfile = CharListWrite (CharListRead infile) outfile
CharListRead f
| not readok = []
| otherwise = [char : CharListRead filepointer]
where
(readok,char,filepointer) = sfreadc f
エラー処理は考えてません。
>>37はインデントがずれているので、適当に脳内補完しといてくれ。
40:デフォルトの名無しさん
04/02/10 00:49
いいぞがんがれ
41:デフォルトの名無しさん
04/02/10 15:28
ん?
俺は考えなくていいみたいだな。
42:デフォルトの名無しさん
04/02/10 15:34
>>41
>>37,>>39は長すぎる。>>17並になるよう考えてくれ。
43:Aransk
04/02/10 18:59
>33〜36
ワタクシには、決して悪気が無いことは、良くお分かりの
くせに…(少し毒気はあるが、藁藁)
まあHaskellスレが立つことを気長にお待ちしましょう。
それまでは、このスレに居座りますので、悪しからず(^^;
URLリンク(homepage3.nifty.com)
44:デフォルトの名無しさん
04/02/10 21:57
>>43
名無しで立てて後で「乙」とでも自演しておけばとりあえずはネタスレにならずに立つ
45:デフォルトの名無しさん
04/02/10 23:06
>>43みたいのを「構ってクン」ていうんですね.初めて見ました.
46:デフォルトの名無しさん
04/02/10 23:24
>>43
立ったぞ
早よ逝け
スレリンク(tech板)
…程々にな
47:Aransk
04/02/11 13:20
>46
居心地が良さそうなんで、もう少し(微笑)
そう言えばCleanってさあ、普通にダウンロードすると
旧ヴァージョンしか出来なくない?
やはり金を払わないと最新版はダウンロードできないの?
URLリンク(homepage3.nifty.com)
48:デフォルトの名無しさん
04/02/11 14:25
>>42
そう変わらん結果になると思うが、考えてはみよう。
49:Aransk
04/02/12 16:45
CleanPjtを推進しているオランダの大学教授も
最近やる気を無くしているみたいね?
やっぱり、商売にならないとキツイんだ。
そりゃぁ、EclipseやJakartaPjtを無償で使っている
連中に売り込むのは、いかにもツライものがあるよねぇ。
URLリンク(homepage3.nifty.com)
50:デフォルトの名無しさん
04/02/12 23:41
誰か Aransk タン専用スレ立てキボンヌ。
51:デフォルトの名無しさん
04/02/13 07:14
>>50
漏れがスレ立てられるようになるまで待ってろ。
関数型言語スレの住人は煽り耐性もdqn耐性も
弱いからな。
52:Aransk
04/02/13 17:07
>50,51
でもCleanってさぁ。Haskellとは違って明らかに商用を
目指しているよねぇ?そのビジネスが成立するかどうかって
Cleanスレでは重要じゃないの?でないと
Clean言語自体が消えちゃうじゃんよぉ。
URLリンク(homepage3.nifty.com)
53:デフォルトの名無しさん
04/02/13 17:14
こんなのが流行る気がしないな。
このスレでも一向にコード書く奴出てこないし。
Aransk、おまえここに居座るつもりなら
Cleanでなんかコード書いてみろよ。
54:デフォルトの名無しさん
04/02/14 04:39
元々はオランダの国家プロジェクトの副産物として登場したものなので、
商用を目指しているというのは正確ではない。
大学の研究用の材料にされているという方が正確だ。
55:Aransk
04/02/14 17:52
>53
>This site is about functional programming
>and purely functional language : Concurrent Clean.
これCleanのプログラムじゃなかったっけ?(^^;
>54
Cleanの最新版は金を払わんとダウンロード出来ん。
それを商用と言わずして何を商用と言うのか?(^^)
IBMが5千万ドル開発費を注ぎ込んだ、Eclipseが
無償でダウンロードできる。これも大学の研究用の
材料であろうか?(^^;
URLリンク(homepage3.nifty.com)
56:デフォルトの名無しさん
04/02/14 18:42
アホとは思っていたが。
これ程とは・・・
57:デフォルトの名無しさん
04/02/14 19:29
商用ってば、Eiffelのシャチョさん、一昨年の日本のOOカンファレンスに招聘されてたけど
相変わらず精力的だったな。やっぱコンサルとか講演とか、別の収入があるからかw
58:デフォルトの名無しさん
04/02/14 19:47
どうする〜?
Eiffel?
59:デフォルトの名無しさん
04/02/14 21:21
Aransk 様の Clean 講座マダー
60:デフォルトの名無しさん
04/02/14 21:30
Cleanで hello Dialog
module hello
import StdEnv, StdIO
Start world = startIO NDI Void (snd o openDialog undef hello) [] world
where hello= Dialog "" (TextControl "Hello world!" []) [WindowClose (noLS closeProcess)]
61:デフォルトの名無しさん
04/02/15 03:57
>>55
>Cleanの最新版は金を払わんとダウンロード出来ん。
英語のサイト巡りも禄に出来ない人は来ないで下さい。
62:37の配列版
04/02/15 12:03
module csvref
import StdEnv,ArgEnv
Start world
# (readok, file, world)= sfopen filename FReadText world
| not readok= abort "open failure"
# (console, world)= stdio world
(closeok, world)= fclose (console <<< getCsv col file) world
| not closeok= abort "close failure"
= world
where
col= toInt argv.[1]
filename= argv.[2]
argv=getCommandLine
63:37の配列版続き
04/02/15 12:03
getCsv :: Int File -> String
getCsv num file
| num<= 0 = abort "out of range"
= selectCsv (num-1) (stringRead file) 0
where
selectCsv :: Int String Int -> String
selectCsv n s i
| s.[i] == '\r' = ""
| s.[i] == '\n' = "\n" +++ selectCsv (num-1) s (i+1)
| s.[i] == ',' = selectCsv (n-1) s (i+1)
| n == 0 = toString s.[i] +++ selectCsv n s (i+1)
= selectCsv n s (i+1)
stringRead :: File -> String
stringRead f
| sfend f = "\r"
# (line,filerest) = sfreadline f
= line +++ stringRead filerest
64:Aransk
04/02/15 17:49
>61
1.3じゃなくて、2.1無償ダウンロード出来るの?
URLリンク(homepage3.nifty.com)
65:デフォルトの名無しさん
04/02/15 18:07
Aransk 様が Clean に興味を持たれたようです。
66:デフォルトの名無しさん
04/02/15 18:13
>>64
ここにいるのは元号が大学名の学校出身ばかりだから、
得意の英語でMLに質問したら?
Cleanのメーリングリストのアーカイブ(Discussions )
URLリンク(www.cs.kun.nl)
67:デフォルトの名無しさん
04/02/15 19:24
明治のことかー!!
68:デフォルトの名無しさん
04/02/15 19:35
元禄大学
69:デフォルトの名無しさん
04/02/15 21:00
>>66
Aranskタンには無理だとわかっていてあえてそーゆう提案してるだろ?
70:デフォルトの名無しさん
04/02/15 22:17
Aranskタンは愛すべき糞コテになりました
そろそろ萌え擬人化します
71:Aransk
04/02/16 21:05
>70
>Aranskタンは愛すべき
だよね?それがさぁ。
URLリンク(homepage3.nifty.com)のMSGボードに
いつかは、来られるのではと、「密かに」期待はして
おりました。それが、な、なんと、本日7000通もの
大量、カキコがありました。大漁節!です。
お蔭様でMSG板はオシャカ!であります。(^^;
mild_server_super_lights先生を存知より
の方が、もし「2ちゃんねる」にも出入りされて
おられたら、是非、先生にお伝え願いたいのです。
Aranskは、またのお越しをお待ち申し上げて
おりますと。今度は、先生の弊HPに対する
ご意見なり、ご批判なりをご自由にお書き下さい。
但し、「多くても」10通以内にね。(大笑い)
72:デフォルトの名無しさん
04/02/16 22:08
((;゚Д゚))ガクガクブルブル ほ、本物?
73:デフォルトの名無しさん
04/02/16 22:11
Aranskたんの萌えエロ画像キボン
74:デフォルトの名無しさん
04/02/17 02:59
>>66
意味分からん
75:Aransk
04/02/17 18:21
>72
>((;゚Д゚))ガクガクブルブル ほ、本物?
mild_server_super_lights先生って、2ちゃんねるでは
「そんなに」有名人なんでしょうか?(^^;
URLリンク(homepage3.nifty.com)
76:デフォルトの名無しさん
04/02/17 21:24
いつの間にAranskだと認めたんだね.
77:Aransk
04/02/18 18:23
>76
>いつの間にAranskだと認めたんだね.
もう随分以前から「ヒーロー勇気」や「名無し」を
使用せず、本名で発言しております。(^^;
でないと2ちゃんねるの雑誌に有名コテハンとして
掲載してくれないらしい?(大藁藁)
URLリンク(homepage3.nifty.com)
78:デフォルトの名無しさん
04/02/19 18:44
Aranskは自分がなにか``特別''であると
思い込みたくてしょうがないらしい...
916 :デフォルトの名無しさん :03/12/31 09:02
>913
ム板だけではなく、上の中東情勢板でも結構暴れたらしい?(藁)
ム板と中東板を往復するのは、管理人だけなのにって
西村クンが嘆いていたそうな。
ところでヤフーの年間人気サイトで2ちゃんが表彰されていた。
まずはご同慶の至りです。
でも西村くんってちょっとヤバそうな顔してるね。
あの手の顔はいったん切れると無茶苦茶、恐いか、メッタメタ
オモロイ!かどちらかだな。(藁藁)
>ム板と中東板を往復するのは、管理人だけなのに
プッ,何言ってんの?
79:デフォルトの名無しさん
04/02/19 18:52
>>76,>>78
そっとしといてやれよ。第一Cleanと関係ないぞ。
80:Aransk
04/02/19 19:29
>76,78
そうだぁ!Cleanに関係ない質問をするな!
(それに簡単に乗せられる奴も、問題ではある。(^^;)
Javaやその他言語の無償提供環境の中で
Cleanのような弱小言語がビジネスとして
成立するのか?また成立する「必要が」あるのか?
それを問いたい。(^^;
URLリンク(homepage3.nifty.com)
81:デフォルトの名無しさん
04/02/19 19:48
>Javaやその他言語の無償提供環境の中で
>Cleanのような弱小言語がビジネスとして
>成立するのか?また成立する「必要が」あるの
「○○言語に関する質問」と「○○言語のスレがビジネスとして
成立するかどうかの議論」は別々のスレでやった方がいいと思う.
82:デフォルトの名無しさん
04/02/19 19:57
つか、それしかネタ無いんか?
83:デフォルトの名無しさん
04/02/19 23:20
Aransk って普段どんなプログラムを作ってるの?
84:デフォルトの名無しさん
04/02/20 04:39
>>80
最新版にこだわるけど
有料の最新版はダウンロード版とどこが違うの?
85:デフォルトの名無しさん
04/02/20 13:11
最新版
無料でダウンロード可能
登録も不要
ライセンスはLGPL
URLリンク(www.cs.kun.nl)
86:Aransk
04/02/20 17:56
>82
>つか、それしかネタ無いんか?
悪い。Cleanで知ってることってこれだけなんです。(^^;
>83
普段はプログラムに触っておりません。
ひたすら面白そうな新しい言語を探し、言語仕様を
読んで、DLして験すだけ。だから、公平な評価が可能なので
あります。純粋の鑑定団!
現在SimkinとIoを調査中であります。
>85
えぇ!ホントですか?ビジネス・プラクティスの変更か?
どうやって、開発部隊は食っていけるのだろう?
URLリンク(homepage3.nifty.com)
87:デフォルトの名無しさん
04/02/21 02:54
書き込みがあまり無いようなので
ネタフリとして
URLリンク(sky.zero.ad.jp)
の演習でも順番にといていきましょう。
1.CLEANシステムがあなたのコンピュータにインストールされていることを確かめなさい。そのシステムは、www.cs.kun.nl/~cleanからダウンロードできます。値42を印字するプログラムを書いて実行しなさい。
2.2つの引数、つまり、nとxを取る関数を書き、それらの累乗xnを計算しなさい。その引数を平方する関数を、それを使って構成しなさい。128の平方を計算するプログラムを書きなさい。
3.その引数の数字を加算する関数isum :: Int -> Intを定義しなさい。そうすると、
isum 1234 = 10
isum 0 = 0
isum 1001 = 2
isumは、非負の引数に適用されるものとする。
88:
04/02/23 14:49
んじゃ、GUI版でも考えるかな。
今週末くらいを目途に。
89:デフォルトの名無しさん
04/02/25 23:50
関数型言語初心者なので素直にコンソール版で解いてみた。型指定は省略。
残りの問題も解いてみたけど、ネタ切れしそうなので投下は止めときます。
あ、5.以降の関数は全て1行で書けるね。
// 1. /////////////////////////////////
Start = 42
// 2. /////////////////////////////////
pow n 0 = 1
pow n x = n * pow n (x-1)
square n = pow n 2
Start = (pow 2 10, square 128)
// 3. /////////////////////////////////
isum 0 = 0
isum n = n-(n/10)*10 + isum (n/10)
Start = (isum 123456789, isum(-123456789))
90:42の表示GUI版
04/02/27 18:38
module display42
import StdEnv, StdIO
Start :: *World -> *World
Start w = startIO NDI Void initial [] w
where
initial pst
# (err,pst) = openDialog
Void
(Dialog "display 42" (TextControl "42" []) [WindowClose (noLS closeProcess)])
pst
| err<>NoError = closeProcess pst
= pst
91:デフォルトの名無しさん
04/03/06 17:01
他のGUI版も作ろうかと思ったが、まんまマニュアルにある。
92:デフォルトの名無しさん
04/03/11 00:38
// 4.
divable :: Int -> Bool
divable n
| n < 9 = False
| n == 9 = True
= divable (isum n)
Start = (divable 6, divable 9, divable (-9)) // 定義域は正の値だけ
// 5, 6
max a b = if (a > b) a b
min a b = if (a < b) a b
// 7, 8
MaxOfList :: [a] -> a | Ord a
MaxOfList [x:xs] = foldl max x xs
MinOfList :: [a] -> a | Ord a
MinOfList [x:xs] = foldl min x xs
// 9-12
Last :: [a] -> a
Last [x:xs] = foldl (\_ b = b) x xs
LastTwo :: [a] -> (a, a)
LastTwo [x,y:zs] = foldl (\(_,b) c = (b,c)) (x, y) zs
Reverse :: [a] -> [a]
Reverse [x:xs] = foldl (\cs c = [c:cs]) [x] xs
Palindrome :: [a] -> Bool | Eq a
Palindrome xs = xs == Reverse xs
93:デフォルトの名無しさん
04/03/17 00:23
URLリンク(sky.zero.ad.jp)
人もいないし、黙々と解いてみる。
module Chapter2
import StdEnv
// 1
odd = isEven o ((+)1)
// 2
next :: (Real, Real) -> (Real, Real)
next (_, y) = (y, y/10.0)
reachZero :: (Real, Real) -> Bool
reachZero (_, y) = y == 0.0
Start = eps
where (eps, _) = until reachZero next (1.0, 1.0)
ワンライナーだとこんな感じか。さすがに汚い。
Start = fst (until (((==) 0.0) o snd) (\(_,y) = (y, y/10.0)) (1.0, 1.0))
94:93
04/03/17 00:27
// 3 (かなーり手抜き)
countday :: (Int,Int,Int) (Int,Int,Int) -> Int
countday now bth = absday bth - absday now
absday :: (Int,Int,Int) -> Int
absday (d,m,y) = (y-1)*365 + (y-1)/4 - (y-1)/100 + (y-1)/400 + sum (take (m-1) (months y)) + d
months :: Int -> [Int]
months y = [31, if (leap y) 29 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
leap :: Int -> Bool
leap y = divisible y 4 && (not(divisible y 100) || divisible y 400)
divisible :: Int Int -> Bool
divisible t n = t rem n == 0
Start = countday (20,2,2004) (20,3,2004)
// 4
mapfun :: [(a->b)] a -> [b]
mapfun [] x = []
mapfun [f:fs] x = [f x : mapfun fs x]
Start = mapfun [sum, avg, prod] [1..10]
95:デフォルトの名無しさん
04/03/18 01:56
CleanIDEのエディタに日本語入力すると文字化けする(´・ω・`)
それは別のエディタを使えば済む問題だけど、Cleanコンパイラのほうが
ダメ文字(2バイト目に0x5C(「\」記号)がある文字)に対応してないのはちょっと悲しい。
しょうがないからCleanIDEに日本語を直接入力してわざと文字化けさせて、
「\」記号が出てきたら、手入力で「\」記号をもう一つ追加して問題を回避してる。
ダメ文字って、Cleanのパーザをいじらないと対応できないのかな…
96:デフォルトの名無しさん
04/03/19 13:50
ASCII以外には全く対応してないのが現状。
UNICODE担当(?)の人は、なんか違うことやってるので期待できない。
97:デフォルトの名無しさん
04/03/20 05:24
>>96
そうですか…日本語の扱いは少し面倒ですね。
URLリンク(sky.zero.ad.jp)
淡々と解いてみる。そろそろ難しくなってきたかも。この先にはAVL木の実装とか面倒臭い問題があるなぁ…
// 1, 2, 4, 5
CountOccurences :: a [a] -> Int | == a
CountOccurences c xs = length [x \\ x<-xs | x==c]
MakeFrequenceTable :: [a] -> [(a, Int)] | Eq a
MakeFrequenceTable xs = [(x, 100*CountOccurences x xs / length xs) \\ x<-removeDup xs]
myflatten :: ([[a]] -> [a])
myflatten = foldr (++) []
Permutations :: [a] -> [[a]]
Permutations []= [[]]
Permutations [x:xs] = [zs \\ ys <- Permutations xs, zs <- interleave x ys]
interleave :: a [a] -> [[a]]
interleave x ys = [insertAt i x ys \\ i <- [0..length ys]]
// 3.
(==) :: (s,t) (s,t) -> bool | Eq s & Eq t
(==) (a,b) (c,d) = a == c && b == d
右辺には2つの(==)があるが、1つめは型s、2つめは型tに対して定義された(==)である。左辺で定義した(==)は、型(s,t)に対して適用される。
この式にある3つの(==)は、すべて属する型が異なっているため別々の関数である。したがって再帰的ではない。
(==) :: [s] [s] -> bool | Eq s
(==) [x:xs] [y:ys] = x==y && xs==ys // セクション3.1.2より抜粋
右辺には2つの(==)があり、1つめは型s、2つめは型[s]に対して定義された(==)である。左辺で定義した(==)は、型[s]に対して適用される。
左辺と右辺に同じ型に属する(==)がある。この2つの(==)は同じ関数である。したがって再帰的な定義である。
98:デフォルトの名無しさん
04/04/09 16:53
Genericの世界は濃いね。
99:デフォルトの名無しさん
04/04/10 23:45
Haskell、Clean辺りだとまだましなのかもしれないが、
関数型言語は思わぬパフォーマンス上の失策をやらかしてそうで怖い。
扱いきれない感がある。もっとクンフーを積まねば・・・。
100:100
04/04/16 22:32
記念くぁwせdrftgyふじこ
101:デフォルトの名無しさん
04/04/19 21:36
URLリンク(sky.zero.ad.jp)
これのセクション4以降が意味不明、理解不能。
気にしないほうがいいのか?
・・・にしても静かなスレだね。
102:デフォルトの名無しさん
04/04/20 00:15
一意型付けって同じものは同時に二回以上簡約されない
って事であってる?
103:デフォルトの名無しさん
04/04/20 16:34
同時にという意味が分からん。
104:デフォルトの名無しさん
04/04/20 19:30
型一意性ってのはClean 独自の物なの?それとも最近の関数型言語の流行?
Clean以外で型一意性の考え方のある言語があれば教えてください。
105:デフォルトの名無しさん
04/04/20 21:01
ないといえばない
106:デフォルトの名無しさん
04/04/20 21:28
研究や論文はあったような
107:デフォルトの名無しさん
04/05/01 14:19
まとまったのはない
108:デフォルトの名無しさん
04/05/02 22:57
Cleanで書かれた正規表現やコード変換などの文字列処理ライブラリーはありまつか?
109:デフォルトの名無しさん
04/05/04 17:14
関数型言語スレでは余裕で無視されてますが、僕は気にしません。
コツコツ積み上げていきます。
110:デフォルトの名無しさん
04/05/16 00:29
型一意性について。
ふつうは参照透明性を確保するのに、データのコピーを作ってそいつを変更する必要があるけど、
もし変更後に変更前のデータを使わないことを保証できれば、元のデータはいらないから、わざわざコピーを作る必要もない。
つまり、データの破壊的更新を行っても参照透明性を維持できる。
ってことじゃないかと。
111:デフォルトの名無しさん
04/05/27 12:46
大体そだよ。
112:デフォルトの名無しさん
04/05/27 13:06
つか、グラフを使用した説明はわかりやすいと思うけれども。
113:デフォルトの名無しさん
04/07/11 04:25
せいうちん
114:名無しさん@そうだ選挙に行こう
04/07/11 18:17
kinnikuman 2 sei?
115:デフォルトの名無しさん
04/08/03 01:56
>>104
Mercuryという言語で使える。
URLリンク(www.cs.mu.oz.au)
#Clean好きで来てみたら寂しいスレだ(′・ω・`)。
#現在Cleanの一意性型の論文読んるけどわかったようなわからんような。
116:デフォルトの名無しさん
04/08/29 15:23
Cleanで書かれたテトリスのソースはどこかにないでしょうか?
古いバージョンに付いていたそうですが、今のには無さそうなので・・
117:デフォルトの名無しさん
04/09/15 17:55:52
if c (fwritec 'a' file) (fwritec 'b' file)
は大丈夫なのに
MyIf True t e = t
MyIf False t e = e
MyIf c (fwritec 'a' file) (fwritec 'b' file)
はだめなのか。
118:デフォルトの名無しさん
04/09/19 03:40:16
>>117
MyIfについては、一意型の*Fileオブジェクトへの参照数が2になるのがエラーの原因のはず。
このあたりに説明があったと思う:URLリンク(sky.zero.ad.jp)
ifは言語組み込みの機能だから、特別扱いだと思う。StdEnv探しても関数の定義がないし。
(_system.abcにifの定義らしき記述があるけど・・・読める人いたら解説きぼん)
言語組み込みのifに相当するMyIfは、通常の関数として書けないような気がするけど
実際のところはどうなんでしょうか>詳しい人
119:デフォルトの名無しさん
04/09/24 18:13:14
>>117
MyIf b t e =
| b = t
| otherwise = e
処理系が手元にないんで試せないけど、これでもダメかね?
tが評価される時はeがゴミなのでfileへの参照は1になると思うんだが。
120:デフォルトの名無しさん
04/09/24 18:59:43
要するにAlternativeに書けってことだな。
121:デフォルトの名無しさん
04/09/24 23:51:36
>>119
ダメですた。
つーか、
MyIf b t e = if b t e
でもダメ。
122:デフォルトの名無しさん
04/09/25 01:17:12
MyIf b (fwritec 'a' file) (fwritec 'b' file)の時点で、fileへの参照数が2だと認識されている模様。
まあMyIfを使わず、素直にガードで分岐すれば動作するんだけどね。
ガードやcaseなら、ちゃんとAlternativeだと見なしてくれる。
WriteAorB b file
| b = fwritec 'a' file
= fwritec 'b' file
123:デフォルトの名無しさん
04/09/26 19:08:00
なんかこの言語サンプル見ても意味不明なのがすごいです
構文が抽象化されすぎて余計わかりにくい感じがするのですが
124:デフォルトの名無しさん
04/09/26 19:59:48
コンピュータに量はおまかせを……
125:デフォルトの名無しさん
04/09/26 23:39:43
Haskellとあんま変わんないとおもうけど。
IOからまなきゃ
126:デフォルトの名無しさん
04/09/28 13:06:25
>>122
分岐(if, case, ガード)が陽に見えているところでしか
一意性解析していないということか。
MyIfが使えるようにするには、自分で型に一意性注釈を
書かなければならないのだろうが、分岐のような
「いくつかの引数のうちどれか一つしか評価しない」というような
ことを型レベルで表現するのは無理だから、やっぱできないのかな。
127:デフォルトの名無しさん
04/09/29 22:43:40
んなもんLISPみたいにquoteがないと作れるわけない
128:デフォルトの名無しさん
04/09/30 00:50:39
一意性解析ってどうやるんだろ。ちょっと考えてみた感じだと
関数はパターンマッチングによる場合分けによって定義されるとする。
その場合の単純な一意性解析の戦略を考えてみると関数の定義が以下の形
f x = g1 a1
f x = g2 a2
...
(x, a1, a2, ... は引数の列)
だった場合、最外簡略を仮定すると引数は2つのグループに分けられる(両方に属するものもあるか)。
つまりどの場合分けを採用するかを決める際に評価され得る引数と、その後に評価されうる引数である。
前者は引数で変数以外のパターンが使われているもの、後者は右辺で使われているものである。
前者の集合をP_fとし、後者の集合をS_f_1, S_f_2, ...とする。(fは自明なときは省略)
例えば
MyIf True t e = t
MyIf False t e = e
の場合P_MyIf = {1番目の引数}, S_MyIf_1 = {2番目の引数}, S_MyIf_2 = {3番目の引数}となる。
このときある変数が一意である条件は
それがPに高々1回だけ現れ、Sには現れない。
それが各S_iについて高々1回だけ現れ、Pには現れない。
のどちらかとなる。
これで単純な場合は大丈夫だけど
MyIf c t e = if c t e
とするとP = {}, S_1 = {c, t, e}となって上手く行かない。
そのためには
f x = g (h1 a1) (h2 a2) ...
という形を考えてgやh1などのP, Sも考慮に入れればOK?
それで十分なのか、それができるのかはもうちょっと考えてみないとわからない。
おしえてエライ人。
129:デフォルトの名無しさん
04/10/26 02:32:30
UNIX環境でつかってる人いる?
130:デフォルトの名無しさん
04/10/26 21:40:24
バイナリ版を試してみようとしたけど、xviewがないと動かない……。
面倒なのでその先はまだやってないっす。
FreeBSD で動かしたくてソースコードもダウンロードしたけど、アセンブリばっ
かしなのでかなり無理っぽい。っていうかどういう風にビルドすればいいのか
ぜんぜんわからない。
131:デフォルトの名無しさん
04/11/05 13:48:35
そんじゃ最初っから話にならないじゃん(w
132:デフォルトの名無しさん
04/11/05 18:50:51
開発環境込みの環境だからねえ。
GUI な開発環境なし版が欲しい。
ただ、普通の Linux とか Solaris なら動くんじゃないの?
133:デフォルトの名無しさん
04/11/10 13:02:17
コンソールでやるにはどうしたら良いんだ?ってのがMLで話題になってたな、随分前
134:デフォルトの名無しさん
04/11/22 20:48:55
さすがにこれを仕事で使う勇気のある奴はまだ日本にはいないだろうな
135:デフォルトの名無しさん
04/11/23 01:26:28
一応開発元は実用言語目指してるんだけどねぇ。
今開発って続いてるの?
136:デフォルトの名無しさん
04/11/24 10:42:39
開発というより研究は続いている
137:デフォルトの名無しさん
04/12/15 20:43:51
下のがエラーになる理由がわからん
Length :: [a] -> Int
Length = foldr (¥x -> (+) 1) 0
138:デフォルトの名無しさん
04/12/15 23:30:00
型が違うよー
Lengthは引数を持たず(アリティ0)、リスト[a]をIntに変換する関数を返すので
Length :: ([a] -> Int)
でたぶん通る。
139:デフォルトの名無しさん
04/12/22 21:13:21
>>138
おおサンクス
型が違ってたのか。Lengthの定義がおかしいのかと思ってたよ。
最近関数型言語の勉強はじめたんだが、楽しすぎるな。
「プログラミング言語は思考の増幅器である」って昔誰かが言ってたが
まさにそんな感じ。脳汁出まくりですよ
140:デフォルトの名無しさん
05/01/21 19:21:00
新バージョンが出る予感
141:デフォルトの名無しさん
05/03/15 21:08:05
URLリンク(www.cs.ru.nl)
によると、一昨年の10月31日の 2.1.0 から更新されてない様だが、新しいのあるの?
142:デフォルトの名無しさん
05/05/06 16:08:55
Clean I/O と Haskel monadic I/Oの違いを教えてください。
143:デフォルトの名無しさん
05/05/14 00:12:25
唐揚げ
144:デフォルトの名無しさん
05/05/14 00:12:59
唐揚げ
145:デフォルトの名無しさん
05/07/16 14:20:22
新バージョン出てるよ
146:
05/07/18 21:05:13
May 31, 2005
Clean 2.1.1 is released for Windows, MacOS X, Linux, and Solaris.
This release contains bug fixes and new features, to wit:
+ Libraries for Windows: GAST, GECs, Hilde, Parser
+ Foreign exports
+ Improved redirected standard input/output
+ Let in comprehensions
+ Code generator optimisations
147:デフォルトの名無しさん
05/07/19 08:33:13
ここもdylanスレぐらい寂れてんな
Cleanが話題にならない理由として考えられるのは
基本概念が複雑なことだな
異質すぎて何が効率よいとかが判断できない
148:デフォルトの名無しさん
05/07/19 12:46:18
複雑じゃないよ、異質ではあるが
149:デフォルトの名無しさん
05/07/19 20:25:19
どうでも良い事かもしれんが、ダウンロードにレジストレーションが必要なのは面倒。
ライセンスも分かりにくい。自分が書いたコードはライセンス汚染を受けるの?
150:デフォルトの名無しさん
05/07/19 20:48:23
>>149
非商用の場合はLGPL、商用の場合は要問合せ。
そもそも、registしなくてもダウンロードできるし。
151:デフォルトの名無しさん
05/07/19 21:15:51
>>150
static なライブラリを作るのか知りたかったんだけど、レジスト不要なら自分で試してみます。
サンクス。
static でもソース公開の義務がないのは知ってるけど、ちょっと面倒だね。
152:デフォルトの名無しさん
05/07/20 20:33:06
>>148
異質ってことは、複雑かどうかもわからんてことよw
難解だよな
153:デフォルトの名無しさん
05/08/06 12:24:17
Concurrent Clean 日本語化プロジェクト 期待あげ
URLリンク(www.geocities.jp)
154:デフォルトの名無しさん
05/08/06 12:52:50
ここ見てるか知らないけど
がんばれよー
155:デフォルトの名無しさん
05/08/06 19:36:04
GUIライブラリまで揃ってるのに…もう少し人気出ないもんかね
156:デフォルトの名無しさん
05/08/06 20:14:56
人気が出る要素がまるでないからな
157:デフォルトの名無しさん
05/08/07 00:09:29
せめてHaskell程度には…
158:デフォルトの名無しさん
05/08/07 14:50:44
ベンチマークとか
他言語とのコードの比較表とか
そういったもので優位性というか、
どんだけ違うか示していくというのはどうか
159:デフォルトの名無しさん
05/08/08 14:13:59
>>156
( ´_ゝ`)フーン
「まるでない」と言い切れるほど詳しくご存知なんですね。
160:デフォルトの名無しさん
05/08/10 23:11:26
たぶんClean理解してる奴日本全国数えても20人いなさそう。
161:デフォルトの名無しさん
05/08/25 21:50:11
Linuxでやってみました。
CUIは問題無く動きました。
GUIはXView無しでもWINE使って、
Hello World 程度を動かせました。
Wineでもいいから一通り動いて、
1.3のlibraryも使えて、
Emacsのclean-modeがhaskell-mode並に使えれば…と思います。
162:勉強中
05/09/07 22:28:59
HaskellよりCleanの方が有望に見える。
163:デフォルトの名無しさん
05/09/07 23:42:54
>>162
詳しく
164:デフォルトの名無しさん
05/09/08 00:11:17
土方プログラマやりながら勉強してるから、
勉強終わるまでちょっとまって。
165:デフォルトの名無しさん
05/09/11 21:05:30
Haskellはコンパイル遅杉
166:名無しさん@そうだ選挙に行こう
05/09/11 23:03:09
>>165
ここはCleanのスレですが
167:デフォルトの名無しさん
05/09/23 10:59:05
Clean は完璧主義のデレツン言語。
Haskell は他言語で1文字でも短く書けるコードがありましたら、
お申し出下さい言語。
168:デフォルトの名無しさん
05/09/25 03:21:36
language shootoutのfannkuchenで遊んでみました
// (setq compile-command "clm -b -nt f && time ./a.out")
module f
import StdEnv
permutations [] = [[]]
permutations [x:xs] = [zs \\ ys <- permutations xs, zs <- interleave x ys ]
interleave x [] = [[x]]
interleave x [y:ys] = [[x:y:ys] : [[y:z]\\ z <- interleave x ys]]
flop [1:ys] = 0
flop lis = 1+ flop (revAt (hd lis) [] lis)
where revAt 0 fr bk = fr++bk
revAt _ fr []= fr
revAt n fr [x:xs] = revAt (n-1) [x:fr] xs
Start = "Pfannkuchen(9)=" +++ toString (maxList [flop x \\ x<- (permutations [1..9])]) +++""
169:デフォルトの名無しさん
05/09/25 04:14:55
意味不明度120%言語
170:デフォルトの名無しさん
05/09/25 18:29:33
>>169
言語のせいにするなってw
171:勉強中
05/09/28 23:37:02
過疎。
一意性型付けは一部で型を自分で指定しないといけないのがキツイ
ここらへんは CLASが参考になりそう。
// update使うともう少しよさげ
arraySwap ar i j
#(v_i,ar) = ar![i]
#(v_j,ar) = ar![j]
= {ar & [i]=v_j,[j] =v_i}
arrayReverse ar a z
| a >= z = ar
= arrayReverse (arraySwap ar a z) (a + 1) (z - 1)
arrayCopy:: !*{#Int} -> *(*{#Int}, *{#Int})
arrayCopy ar
#(sz,ar)=usize ar
#(ar_0,ar)=ar![0]
= arrayCopyRange ar (createArray sz ar_0) 0 (sz-1)
arrayCopyRange:: !*{#Int} !*{#Int} !Int !Int -> *(*{#Int},*{#Int})
arrayCopyRange ar ar2 i j
| i > j = (ar,ar2)
#(v_i,ar) = ar![i]
= arrayCopyRange ar {ar2 & [i]=v_i} (i+1) j
172:デフォルトの名無しさん
05/09/30 00:06:48
Cleanの編集モードだけど clean-mode より haskell-modeの方が書きやすいと思った。
173:デフォルトの名無しさん
05/10/02 01:10:08
countFlips:: !Int !*{#Int} -> (Int,*{#Int})
countFlips acc perm
# (p_0, perm) = perm![0]
| p_0 == 1 = (acc,perm)
= countFlips (1+acc) (arrayReverse perm 0 (p_0-1))
successor:: !*{#Int} -> (Bool,*{#Int})
successor perm
# (n , perm) = usize perm
# (i , perm) = lp1 (n- 2) perm
| i == -1 = (False, perm)
# (ith, perm) = perm![i]
# (j,perm) = lp2 (n - 1) ith perm
# perm = arrayReverse (arraySwap perm i j) (i + 1) (n-1)
= (True , perm)
where
lp1:: !Int !*{#Int} -> (Int, *{#Int})
lp1 i perm
| i < 0= (-1 , perm)
# (plus,perm) = perm![i+1]
# (val,perm) = perm![i]
| plus > val = (i, perm)
= lp1 (i-1) perm
lp2:: !Int !Int !*{#Int} -> (Int, *{#Int})
lp2 j ith perm
# (val_j , perm) = perm![j]
| (val_j > ith) = (j,perm)
= lp2 (j-1) ith perm
174:デフォルトの名無しさん
05/10/02 01:13:23
fannkuch n = loop 0 {y\\ y <- [2,1] ++[3..n]} (createArray n 0)
where
loop::!Int !*{#Int} !*{#Int} ->Int
loop f pi pi2
# (pi, pi2) = arrayCopyRange pi pi2 0 (n-1)
# (c , pi2) = countFlips 0 pi2
# next = max c f
# (suc, pi) = successor pi
| suc = loop next pi pi2
= next
Start = fannkuch 9
// 全て型を付けても Cの1.5倍以上遅い orz
175:デフォルトの名無しさん
05/10/02 23:34:16
pure Cleanでgccより速くなりました。比較対象はdebian gcc 4.0.1
gcc -pipe -Wall -O3 -fomit-frame-pointer -funroll-loops f.c -o f.gcc_run
time ./a.out 9 && time ./ f.gcc_run #Cは某所にこれ追加 > p[0]=2;p[1]=1;
real0m0.181s # clean
real0m0.201s # gcc
//clm -h 450k -b -nt -I /home/my/share/lib/clean -I /home/lib/StdLib
// -I /home/my/clean/lib/ArgEnv/ -l /home/my/clean/lib/ArgEnv/ArgEnvC.o
// fannkuch && time ./a.out 9"
module fannkuch
import StdEnv, StdMaybe, MyUtility, MyArray
countFlips:: !Int !*{#Int} -> (Int,*{#Int})
countFlips acc perm #! (p_0, perm) = perm![0]
| p_0 == 1 = (acc,perm)
= countFlips (1+acc) (arrayReverse perm 0 p_0)
fannkuch n = fannkuch` 0 {y\\ y <- [2,1] ++[3..n]} (createArray n 0)
where
fannkuch`::!Int !*{#Int} !*{#Int} ->Int
fannkuch` f org cpy
#! (org,cpy) = arrayCopyn org cpy n
#! (c,cpy) = countFlips 0 cpy
= case (successorPermutaion n org) of
Just org = fannkuch` (max c f) org cpy
Nothing = max c f
Start ="pf("+++ arg1+++")="+++toString (fannkuch (toInt arg1)) +++ ";"
176:デフォルトの名無しさん
05/10/02 23:40:08
arraySwap:: !*{#Int} !Int !Int -> *{#Int}
arrayReverse ar a z :== arrayReverse` ar a (z-1)
// arrayReverse 概略 araySwap inline化
arrayCopyn ar ar2 n :== arrayCopyn` ar ar2 (n-1)
where arrayCopyn`:: !*{#Int} !*{#Int} !Int-> (*{#Int},*{#Int})
arrayCopyn` ar ar2 -1 = (ar,ar2)
arrayCopyn` ar ar2 i
#! (v_i,ar) = ar![i]
= arrayCopyn` ar {ar2 & [i]=v_i} (i-1)
successorPermutaion n perm :== successor` (n-2) perm
where successor`:: !Int !*{#Int} -> (Maybe *{#Int})
successor` i perm
| i < 0= Nothing
#! (plus,perm) = perm![i+1]
#! (val,perm) = perm![i]
| plus > val#! (ith,perm) = perm![i]
#! (j, perm) = lp2 (n - 1) ith perm
#!perm = arrayReverse (arraySwap perm i j) (i + 1) n
= Just perm
= successor` (i-1) perm
lp2:: !Int !Int !*{#Int} -> (Int, *{#Int})
lp2 j ith perm#! (val_j , perm) = perm![j]
| (val_j > ith) = (j,perm)
= lp2 (j-1) ith perm
//これを動かしたい人はいろいろ組合わせて下さい。
// *組*を作成しなければ、無駄なメモリ消費量を抑えられるはず。
177:デフォルトの名無しさん
05/10/03 21:42:37
>>176
*組* ってちょっと…
「タプル」でいいんじゃない?
178:デフォルトの名無しさん
05/10/03 23:22:07
>>177
助言サンクス
で一応まとめ fannkuch: indexアクセスと整数演算の性能
1 最適化がはまらないとちょっと遅い(はまればC並に最適化できる)
1.1 遅いのは、Clean内部システム?が Lazyでごちゃごちゃ動くため
1.2 関数化無しではLOOPが書ず、inline化されない?ため、いろいろ無駄になる
2 LIST使っても、revAtみたいな展開と内包表現を多用すれば、
3〜5倍の実行時間で済むっぽい。コンパイラの頭が良くなって、
今回の +++が 破壊的な関数で最適化されれば、もっと速いはず (set-cdr!で一発)
3 短くはないが、比較的綺麗な関数単位で書いた割に速い
funnkuch の countFlips, successorPermutaion , maxを外に出せば
uarrayAccumulateWithSuccessor. lp2は (uarrayFindIndexBy (\x->x>ith))
4 ライブラリはかなり少ない
速くするには
A shootout のOCAMLやD言語ではアルゴリズムがこれと少し違うっぽいので真似る
B Cleanの最適化について学ぶ
C 関数一つにまとめて、共有できる変数は共有するとか。
D abc codeを書くとか
//省略部
arraySwap ar i j#! (v_i,ar) = replace ar i 0
#! (v_j,ar) = replace ar j v_i
={ar & [i]=v_j}
今後は目標として、LISP(Scheme)をCleanに翻訳とかやるかも。では、さよーなら。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5386日前に更新/85 KB
担当:undef