1 名前:デフォルトの名無しさん [2007/04/20(金) 19:41:39 ] Lisp全般のスレです 過去スレ Part16: pc11.2ch.net/test/read.cgi/tech/1172404795/ Part15: pc10.2ch.net/test/read.cgi/tech/1151025773/ Part14: pc8.2ch.net/test/read.cgi/tech/1132275726/ Part13: pc8.2ch.net/test/read.cgi/tech/1115901841/ Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/ Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ http://が多すぎるらしいので分割
654 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 16:28:20 ] うん。待ってるから…… ずっと待ってるから、必ず来てね。 約束……だよ?
655 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:48:58 ] カット!やりなおし
656 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 19:16:10 ] カットってPrologのあれ? 確か ! だったっけ
657 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 19:16:46 ] 誰が上手い事を言えと
658 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:55:50 ] cutといえばコンビネータだね
659 名前:デフォルトの名無しさん [2007/06/30(土) 12:57:27 ] 質問です。 (defun color (fruit) (case fruit (apple 'red) ((banana lemon) 'yellow) (peach 'pink) (otherwise "I don't know"))) という果物の名前を引数にとって、色の名前を返す関数colorで 何もマッチしない時の処理が、 (otherwise "I don't know"))) なんですが、これを (t "I don't know")))にしてもOKだと説明してあって、 どうしてなのかな?と自分なりに考えたんですが、 LispではNIL以外は何でも真だからマッチしない物を一緒くたにまとめた物を tとして扱うのかな、と思ったんです。 実際のところ、なんでtなんですか? otherwiseなら納得できるのですが。
660 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 15:18:08 ] condにおいて条件が常に真という意味。if (1) { 〜 }と同じ。 elseに相当する物がなかった時代の名残り。 caseでも使われるのはcondと同じ構文だから。 長い間LISP使いにとっての常識だった。 otherwiseみたいな長いシンボルはCommonLisp特有。
661 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 15:28:28 ] 伝統的には t だけど otherwise のほうが判りやすいという意見もあって追加された。 car と first みたいなもんで、好きな方を使えば良い。
662 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:22:31 ] ttp://blog.so-net.ne.jp/rainyday/2007-02-21 PAIP 読んだ事無いけど、λの発祥が ^ だとは知らんかった。 (^ (x) (* x x)) 何気に良いんじゃないだろうか...
663 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:32:50 ] 今や (λ (x) (* x x)) で良いんじゃないかという気もする
664 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:59:50 ] あちらの人はどうやって入力するんだ?
665 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:03:06 ] ギリシャ人ならへっちゃらだな(本当か?)
666 名前:デフォルトの名無しさん [2007/07/01(日) 19:05:54 ] >>662 え、めっちゃ有名な話だと思ってたよ。 俺の持ってる本にも書いてあるし。
667 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:07:11 ] >>664 λ
668 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:26:31 ] >>662 顔殴られたクマーみたい
669 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:36:59 ] lambdaと打ったらリガチャ扱いでλ出す、くらいのことは出来るだろう
670 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:03:58 ] >>666 俺、貧乏で本買えないから…
671 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:11:24 ] >>670 図書館行くとよいぞ。
672 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:24:56 ] 関係ないけど、教養のためにとλ計算のプログラムを今書いてますが、 bashとかperlみたいに$を使う事にしてます。 (厳密には$と.で識別子を挟む。) 束縛子に$を使って、参照は識別子そのままなので、用法は逆ですけどね。 ($m. $n. $s. $x. m s (n s x)) ($s. $x. s x) ($s. $x. s (s x)) こんな感じで
673 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:00:01 ] >>671 あんた賢いな
674 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:12:31 ] SKKのほうがいいよ
675 名前:デフォルトの名無しさん [2007/07/02(月) 07:03:32 ] >>660 >>661 とても親切な返答有り難うございます。分かりました!
676 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 07:43:04 ] >>662 俺LISPで採用けってい
677 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 11:00:15 ] 俺Lisp作ってる人ってどれくらいいるのかな
678 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:27:38 ] 少なくとも今ある処理系の数だけあるよな
679 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 14:14:52 ] 俺LISPといえるほどの独自仕様の処理系ってそんなにあったっけ
680 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 16:35:54 ] だから俺Lispなんじゃね?
681 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 18:14:29 ] lispじゃないけど>>662 っぽい記法使ってる言語には bugyo.tk/~zick/cosak/ こんな変なのがあったぞ。
682 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:18:53 ] ホントだ、良く見つけたね。 個人的には ^ は return に見えてしまう...
683 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:55:16 ] このSmalltalkerが
684 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:32:48 ] Metaluaはluaでlispのマクロっぽい事ができるらしい。 いっちょ前にquasi-quoteっぽい仕組みまである(様に見える)。
685 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:31:01 ] 本質的にはλは開き括弧、.は閉じ括弧だから []でも<>でも{}でも`'でも良いのに 接頭字+空白セパレタが主流なのはなぜなんでしょうね?
686 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:34:22 ] 書き込んでから気づきましたが 歴史的には接頭字の方が先なんでしたね
687 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:32:31 ] 質問です。 アトムとリストと、 car,cdr,cons,atom,eq これでどうやって足し算が出来たりするのでしょうか?
688 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:41:01 ] >>687 チャーチ数 でググれ
689 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:42:49 ] リストの長さで0以上の自然数を表すのがよく使われる手だね。 そうすると足し算はappendになる。他も自分で考えてみな。
690 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:54:04 ] あ〜、足し算はappendなのか。 だいたいイメージつかめた。 有り難うございます。
691 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:35:22 ] ん、やっぱりなんか引っかかります。 リストの長さで0以上の自然数を表すなら、 ()=0 (())=1 ((()))=2 は納得できるのですが、 これでどうやってリストを表すのでしょうか? アトムしか表現できないんじゃないんですか?
692 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:49:44 ] () (()) (() ()) (() () ())
693 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:35:56 ] >これでどうやってリストを表すのでしょうか? 言ってる意味が分かんないなぁ
694 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:56:23 ] 砂場の石ころでもできる だから何ってやつ
695 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:13:45 ] 何段階かの問答を経て、ようやく「自分が何を訊ねたいのか」を掴む質問者っているけど、 この人もそれと同様、これから自分の疑問の内容がわかるんだと思う。
696 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:36:29 ] ttp://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001094 リスパーなら演技くらいはできないとな。
697 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:42:57 ] マジな話、Lisperと話しするときは教養がいるよ。 プログラム言語の話とかだけじゃ相手にしてもらえない。 科学好き、数学好きとかが多すぎる。
698 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:03:06 ] 個人的には数学は敬して遠ざけておきたい そんな僕でも立派なLisperになれるでしょうか
699 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:09:47 ] ところで河合さんの頭は本物なの?
700 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:13:10 ] >>698 GNU GPLを暗唱できたらあるいみ立派なLisperになれるかも!
701 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:14:31 ] 687さんは純Lispが五つの基本関数「だけ」で 本当にチューリング完全かどうか 疑問に思ってるんじゃないですか? ちょうど1ヶ月前の自分と同じで マッカーシーの論文斜め読みしたら 関数は五つで良いけど →表記も含まれるから condかifスペシャルフォームも必要みたいに感じました 本当に五つの基本関数(と真偽値)「だけ」でチューリング完全なら 自分にも教えてください
702 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:15:18 ] Lisp と GPL は全く関係無いな
703 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:25:57 ] おいおい、Gの付く話はやめてくれよ
704 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:35:59 ] >>701 再帰かループがないとどうにもならんよ
705 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:41:00 ] 大前提としてλ式が必要
706 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:41:26 ] >>704 と、いうことはcondまたはifと 関数抽象のためのlambdaが必要ということになりますか 要素としては5関数2特別式でチューリング完全
707 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:44:52 ] そうか、lambdaだけでチューリング完全ですね でもそうすると5関数の立場が…
708 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:48:57 ] Lispエバリュエータを書くのに最低限必要な関数だと思うが
709 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:51:55 ] λ算法とLispのlambdaは等価ではないので
710 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:01:19 ] そういやifはλで表現できたんだな…。
711 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:07:44 ] >>709 どこらへんですか? 正格評価だからですか?
712 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:57:12 ] >>708 チューリング完全である≠"apply" or "eval"が記述できる lambdaがあればチューリング完全だけど "Lisp"の機能を満たすために5つの基本関数が必要である ってことですか?
713 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 10:57:50 ] リストの n 番目「以外」の要素のリストを得るにはどうすれば良いでしょうか 例えば (0 1 2 3 4 5 6 7 8 9) から 3 を除いた (0 1 2 4 5 6 7 8 9) が欲しいです それとも、もしかすると Gauche の添付ライブラリの中にありますか…? 一応自分でも書いてみたのですが かなり長〜くなってしまって。
714 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 11:10:12 ] (define (exclude-nth n l) (cond ((null? l) l) ((= n 0) (cdr l)) (t (cons (car l) (exclude-nth (1- n) (cdr l))))))
715 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 11:25:50 ] 好みの分かれるところか? (define (exclude-nth n l) (append (take l n) (drop l ( + n 1)))) (exclude-nth 3 '(0 1 2 3 4 5 6 7 8 9)) =>(0 1 2 4 5 6 7 8 9)
716 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:12:11 ] >>715 takeは必ずリストつくるからappend!でセルを節約したくなる貧乏性な俺
717 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:56:33 ] レス感謝です。 >714 勉強になります。 >715 takeとdrop、こんなのあったんですね。 こんなに短くなるとは…
718 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:58:18 ] まさかこのオペレータを使う日が来るとは……。 (use gauche.sequence) (define (exclude-nth n l) (reverse! (fold-with-index (lambda (i e pr) (if (= n i) pr (cons e pr))) '() l))) ;(exclude-nth 3 '(0 1 2 3 4 5 6 7 8 9)) ;; =>(0 1 2 4 5 6 7 8 9)
719 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:03:35 ] >718 このオペレータ…とはどれのことなのか Schemeに不慣れな私には判りませんが …えーと… ちょっと勉強がてら気合い入れて読んでみます…
720 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:05:28 ] fold-right-with-index(仮称)があればreverseしなくていいのにね。
721 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:29:05 ] fold-rightはある意味reverse以上のコスト
722 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:41:43 ] 【問題】 >>713 を不完全リスト(最後のcdr部がアトム)に対しても 適用できる様にexclude-nthを拡張せよ ex.) (exclude-nth 2 '(0 1 2 . 3)) => (0 1 . 3) (exclude-nth 3 '(0 1 2 . 3)) =>(0 1 2) (exclude-nth 4 '(0 1 2 . 3)) =>(0 1 2 . 3) ;; 同値
723 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:59:22 ] やってみました。あってる? (define (exclude-nth n ls) (cond ((null? ls) '()) ((= n 0) (if (not (pair? ls)) '() (cdr ls))) ((not (pair? ls)) ls) (else (cons (car ls) (exclude-nth (- n 1) (cdr ls))))))
724 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:21:52 ] つきあってくれてありがとう。 多分合ってる。 用意してた答えはコレ (define (exclude-nth n l) (let loop ((n n)(r '()) (l l)) (if (pair? l) (loop (- n 1) (if (= n 0) r (cons (car l) r)) (cdr l)) (if (null? l) (reverse r) (if (= n 0) (reverse r) (apply list* (reverse (cons l r)))))))) 我ながらapply list* reverseは美しくないよな・・
725 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:28:04 ] それって破壊もlist*も使わずに末尾再帰で書ける?
726 名前:723 mailto:sage [2007/07/04(水) 14:30:40 ] named-letでもやってみたんだけど、いまいち自信がないというか…。 (define (exclude-nth n ls) (let loop ((ls ls) (n n) (acc '())) (cond ((null? ls) (reverse! acc)) ((= n 0) (if (not (pair? ls)) (reverse! acc) (loop (cdr ls) (- n 1) acc))) ((not (pair? ls)) (append (reverse! acc) ls)) (else (loop (cdr ls) (- n 1) (cons (car ls) acc))))))
727 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:33:34 ] list*相当を作っちまえば・・ (define (apply-list* l) (define (loop l) (if (and (pair? l) (pair? (cdr l))) (cons (car l) (loop (cdr l))) (car l))) (loop l)) って、これは末尾再帰じゃないしな >>726 appendすりゃよかったのね
728 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:00 ] >>709 λとlambdaが等価じゃないところ1つ見つけた λxyz.E = λx.λy.λz.E (lambda (x y z) E) ≠ (lambda (x) (lambda (y) (lambda (z) E))) 他にどんな違いがあるかなぁ
729 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:50:27 ] チューリング完全を実現するのに必要な 最低限のデータ構造って何だろう。 リストが使えないとダメなのかな?
730 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:59:27 ] 例えば配列があればリストは作れる。チューリング機械の定義により何かの記憶機構は必要。
731 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:13:14 ] SKだけでチューリング完全なのに 純Lisp5関数でチューリング完全じゃない(?)のは不思議 eqやatomがTやNILを返すんじゃなくて carとcdrを返すなら何とかなりそうな気もする 関数を返す関数くらいは必要な気がする
732 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:16:37 ] >>713 CL loop マクロは見易いと思う。 (defun exclude-nth (n l) (loop for x in l and idx from 0 if (/= idx n) collect x)) だけど >>722 の不完全リストだと書けないかな。
733 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:57:12 ] >>729 整数が1つあれば十分だろ。コンピュータのメモリなんて見方によっては ものすごく桁数が多い1つの2進数なんだし。
734 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:59:48 ] でもそれって結局、無限長の配列を仮定してることにならないかだぜ?
735 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:04:59 ] 無限長の配列でも一つの整数でも同じことだろ。 どちらか片方あればもう片方が表現できる。
736 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:19:56 ] lispマシンってメモリアドレスって有ったんだろうか?
737 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:41:20 ] >>736 Symbolics社のはタグ付きアーキだったってC-FAQに書いてあった だからポインターが数値でない
738 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 02:14:33 ] >>736 なくてどうする
739 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 20:47:56 ] read-eval-printループのevalの部分を別のコンピュータで実行させるフレームワークみたいなのってない? 作ろうと思えば簡単に出来そうなんだが、誰かやってる人いないかなと思って。
740 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:21:17 ] slime
741 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:22:26 ] >>739 readしないでevalって言うのはできるん? sexpを通信先のマシンでreplしてるところに食わせるのならslimeがそうじゃない
742 名前:739 mailto:sage [2007/07/07(土) 21:43:31 ] >>740-741 サンクス gauche使ってるんだが、gauche.listenerってのを見付けた。 ちょいいじってみる。
743 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:23:48 ] Gaucheでselect使ってサーバー書こうと思ってたんだけど質問。 selectで書き込み可能でも、ソケットバッファを越えたサイズを書き込もうとするとブロックするよね。 unixのwrite(2)ならバッファを全部フラッシュしないからブロックしないように書けるんだけど。 生のwrite(2)をそのままGaucheから呼べないの?
744 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 05:40:22 ] 今はできないんじゃなかったっけな。0.9までになんとかするって話だったと思う。
745 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 06:42:30 ] >743 サーバ書くモチベをちょっとだけGaucheのソース修正に割くんだ。 そしてうまく動いたらパッチ提供してあげたら喜ばれるんじゃないかな。 ライブラリ作成者側のオナニーテストよりは実アプリによる動作テスト の方が意味あるだろうし。
746 名前:743 mailto:sage [2007/07/10(火) 09:30:08 ] >>744-743 了解! 綺麗なソースコードだからちょっといじってみる。 cvs headに比べると、debian etchのやつはだいぶ古いんだな。 今のところはスレッド使う方向に逃げるってのが正解みたいだね。
747 名前:743 mailto:sage [2007/07/10(火) 10:02:44 ] アンカミスった>>744-745 だった
748 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 04:17:03 ] 卒論を書かなきゃ行けないんだけれど、何も思いつかない。 思いついたとしても既に実現されている。 計算機の歴史なんてまだ100年もたっていないのに、 その先行研究の凄さにはひれ伏すしか無い、という 今日この頃の学部生なんですが、何か面白いお題ないですかね? スペックとしてはCommon Lispが出来るくらいなんですが。 「こんな事やったら面白いんじゃないの?」 とか 「コレが無いから困っている。でもつくるのメンドイ」 っていうの有りませんか?
749 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 09:34:11 ] >>748 S式で書ける TeX とかどうよ
750 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 15:56:13 ] >>749 え、無いの? HTMLをS式で表現するものがあるのに?
751 名前:749 mailto:sage [2007/07/11(水) 20:20:40 ] いや、あるかもしれんけど。 そんなに真剣に調べたことはないんで。
752 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:16:07 ] ちょっと違うかもしれないけどmaxima があるからなー>tex >>748 オープンソース版のAllegroCache(OODB)作るってのはどうよ?
753 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:51:01 ] 皆さんお返事有り難うございます。 そりゃ、自分もいろいろ考えたんですよ。 例えば色でプログラミングできたら面白いかな〜とかね。 正方形を9分割した物が有って、 白→nil 黒→t が決定。 んで色がいくつ塗っているかでチャーチ数を表す。 緑→(()) 緑と黄色→(()(())) だから、緑と赤は等しい訳です。直感的ではないですけれど。1=1なんで。 んで、最低限の関数の色を決める。 car→オレンジ とかね。 でも、これじゃ関数定義できないし、逆にややこしいし、 大きい数の計算は出来ないし、データ構造の定義は出来ないし、 何の役に立つのか説明しにくい。 んで、考えれば考えるほどどうすれば良いのか分からなくなって、 皆さん卒論でどんなことしていたか質問してみたんです。 すいませんでした。
754 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 00:16:04 ] 卒論とかだと学問ぽく見せる必要があるから、Lisp 族は人気ないだろ。 強い型付けのメリットとして、とても研究な感じになるという利点があるから 卒論は Haskell とか ML 系でなんかごにょごにょするほうがお手軽じゃないかな。