トップページ⇒tech
1001コメント311KB

Lisp Scheme Part22

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2008/05/21(水) 23:58:40
□過去スレ□
Part21: ttp://pc11.2ch.net/test/read.html/tech/1207300697/
Part20: ttp://pc11.2ch.net/test/read.cgi/tech/1205021786/
Part19: ttp://pc11.2ch.net/test/read.cgi/tech/1200237296/
Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/
Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/
Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html
0446デフォルトの名無しさん2008/06/11(水) 01:57:39
ちがいます
0447デフォルトの名無しさん2008/06/11(水) 02:07:37
そうですか
0448デフォルトの名無しさん2008/06/11(水) 02:27:03
>>445
どのWindowsを使ってるかは知らないが、コマンドプロンプトで、
UTF-8でエンコードされた日本語が、正常に表示されると思った根拠は?
0449デフォルトの名無しさん2008/06/11(水) 02:48:12
>>445
コマンドプロンプトに、UTF-8でエンコードされた「こんにちは」を出力すると、
そう表示されるな。

(use gauche.charconv)
(print (ces-convert "こんにちは" 'utf-8 'sjis))

お前、ネイティブエンコーディングって何か理解してないだろ?
0450デフォルトの名無しさん2008/06/11(水) 03:29:34
あっ、なるほど
449さんのコードをUTF-8で保存し、実行すると正しく表示されました
Shift_JISで保存し、実行すると文字化けしました

コマンドプロンプトは基本Shift_JISってことですね
(ちなみにVistaもXPも同じ結果になるぽ)

ネイティブエンコーディングってググってもよくわからないですけど、
言語自体の基本となる文字コードのことでしょうか?
Gaucheの場合、UTF-8ですよね

コマンドプロンプトで直接コードを入力するとShift_JISのコードになってしまう
そのコードをGaucheがUTF-8で解釈して(この時点で文字化け)、
得た結果をさらにShift_JISとして出力されるから・・・・
わけわからないことになりますが・・・
0451デフォルトの名無しさん2008/06/11(水) 03:33:43
そこまで判ってて、なぜ「わけわからない」になるのか、わけわからないw
0452デフォルトの名無しさん2008/06/11(水) 03:56:00
>>450
理解したみたいなので、詳しくは書かないけど、
言語自体というか、処理系が内部で使う文字コードのこと。
Gaucheの場合、EUC-JPやUTF-8、ShiftJISなどから選べる。
それで、お前さんの使ってるGaucheはUTF-8でコンパイルされてる。

確かに、Windowsのコマンドプロンプトから使うには不便だろうな。
configureに--enable-multibyte=sjisを指定してコンパイルし直すか、
Emacs経由で使った方がいいと思うぞ。

ttp://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aGauchebox
0453デフォルトの名無しさん2008/06/11(水) 08:43:32
>>452
UTF-8でビルドした犯人は俺だ。
でもShift_JISでビルドしたものを配布すると他国の人が困るんじゃないかな。
それともGauche-mingw-0.8.13-sjis.exe とかを作る?
0454デフォルトの名無しさん2008/06/11(水) 08:44:57
>>451
毒を出しすぎ。
0455UTF‐8はXML標準…でも日本語「だけ」苦手?(ТΤ2008/06/11(水) 10:18:00
LISPをざっとみた感想です;

「直感的には」わかりにくかったけれど、
「印欧語話者の生成文法で言う言語本能って
 だいたいこんな感じなんじゃないか?」と思った。
(英語で隠れてるが、ドイツ語は剥き出し?)
→この「発想パターン」は何度でも「来る」。

私は参照(接続/冠詞)型主語言語話者でなくて
近傍(焦点‐集合操作)型主語言語(日本語)話者w
集合操作による構文は経路‐直線的間接参照端点:
 「静的・直線的な論理」:印欧語族の構文法とは違う。
(ドジスンの指摘したとおり論理対象空間は本来動的で、
 各所で前提が違う方が普通だから、直線化は不可能。)

=英語的言語感覚でなら「直感的に使える優秀な言語」。

英語(印欧語)センスを鍛えようw ゎぁぃ モレオワタ(AA略)
0456デフォルトの名無しさん2008/06/11(水) 11:30:34
個人的には、Lispは「言語」ではないと思ってる。
図形、地図、表、レゴブロック、そういったもの達のほうにずっと近い。

だから>>455を読んで、日本語の話者だから戸惑うのではなく、
言語に触れるモードで触れるから戸惑うのではないか、みたいなことを感じた。
0457デフォルトの名無しさん2008/06/11(水) 11:52:23
黒板に自然法則とか書く時はそれでいい
プログラマの意図が分かるように書きたいときは、言語っぽくないと困る
0458デフォルトの名無しさん2008/06/11(水) 12:09:57
>>455
日本語もまともに書けないのはよくわかった。
0459デフォルトの名無しさん2008/06/11(水) 12:50:18
>>458
自分の読解力のなさを棚にあげるのはやめようぜ
0460デフォルトの名無しさん2008/06/11(水) 12:56:30
>>455
そんじゃ、印欧語話者の間でPy(ピー)が人気なのは何で?素朴な疑問〜
0461デフォルトの名無しさん2008/06/11(水) 13:03:57
というか、国際的にもLisp/Schemeは日本では大人気。
0462デフォルトの名無しさん2008/06/11(水) 13:04:09
>>469
ほう、なら455を日本語で説明してくれんか?
3行目から出てくる括弧の使い方から。
特攻の拓みたいに特殊な言語かと思ったよ。
0463デフォルトの名無しさん2008/06/11(水) 13:04:37
ごめん459だった。
0464デフォルトの名無しさん2008/06/11(水) 13:14:22
「直感的には」わかりにくかったけれど、
→ 直感的には判りにくいけれど、
「印欧語話者の生成文法で言う言語本能ってだいたいこんな感じなんじゃないか?」と思った。
→ 印欧語話者の生成文法で言う「言語本能」って、大体こんな感じなんじゃないか?と思った。
0465デフォルトの名無しさん2008/06/11(水) 13:54:50
>>453
Windowsのことはよく知らないんだけど、入出力コードはカレントロケールに合わせる
みたいなことって難しいの?
0466デフォルトの名無しさん2008/06/11(水) 13:56:52
>>459
俺も>>455が何を言いたいのか理解できなかった。
読解力無いのかなあ。
0467デフォルトの名無しさん2008/06/11(水) 14:05:44
>>464
5行目以降もまるで判らんので、その調子で翻訳お願いしますね。>459
こんな物を読解する能力なら不要だと確信してるけど、
>>456でいきなり会話が成立した(らしい)事が、本当に不思議でしょうがない。
0468デフォルトの名無しさん2008/06/11(水) 14:08:50
LISP使いはスノッブが多いな
GEBとかメタマジックゲーム読んで悦に入ってそう
0469デフォルトの名無しさん2008/06/11(水) 14:23:47
コンプレクッスですか
0470デフォルトの名無しさん2008/06/11(水) 14:24:44
>>455が理解できない一人でーす。

>>461
「国際的にも」「日本では」
国際的なのか、日本だけなのか、はっきりしる!
…みたいな日本語の乱れについての話題なのかな?今は。
外国人が一生懸命コミュニケーションしようとする試み
なのかもしれないけど、漢字ひらがな並べれば良い、って物じゃないんです。
半端に学ばれたままだと相手を不愉快にさせますよ。
0471デフォルトの名無しさん2008/06/11(水) 14:32:23
2ちゃんの定型文だけはしっかり使うガイジンかよw
字は読めないけど日本のマンガには詳しい、みたいな。
0472デフォルトの名無しさん2008/06/11(水) 14:43:03
いまのとこ一方的に文章吐き出す機能しかないみたいだから
受け答えは期待出来ないと思う
0473デフォルトの名無しさん2008/06/11(水) 15:34:47
>>465
このへんに問題点が書かれている。
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aWindows%2fVC%2b%2b%3alog%3aold_2007#H-1ctgw0n
これはVC++の話だけどMinGWも同様と思われる。
0474デフォルトの名無しさん2008/06/11(水) 15:37:14
>>462
俺も理解できないんだが、
>>456が回答してるんだから
理解できる文章なんだろ。
俺たちが読解力不足ってだけで。
と思っただけ。
0475デフォルトの名無しさん2008/06/11(水) 15:40:11
文章を理解したのではなく、その他の能力(ESPなど)を用いたのではないかと思う
0476デフォルトの名無しさん2008/06/11(水) 16:06:49
文章はともかく言葉の意味がわからない
言語学用語なのかな?
あるいはLispを齧ったばかりの455さんが戯れに組んだELIZAじゃないだろうなw
0477デフォルトの名無しさん2008/06/11(水) 16:08:45
455、人気者だなw
0478デフォルトの名無しさん2008/06/11(水) 16:19:09
>>450
MS-Windows使わない人なんでハズしている可能性あるが…

この端末エミュレータで解決できんかね?
実行するコマンドの文字コード指定できるみたいだが。
http://ja.poderosa.org/

Win32のコンソールAPIは最低限の依存で済ませているみたい。
Gaucheもそうだろうから、利用できるんじゃないか。
0479デフォルトの名無しさん2008/06/11(水) 17:02:49
Lispは素晴らしい言語だと思うのですが
Lispが生き残ってるのはEmacsのおかげ
実用には耐えないが一部ハッカーの趣味で使われている
など否定的な意見のみが見られてイマイチ本気になれません
Lispで作られたアプリケーションを教えていただけないでしょうか
0480デフォルトの名無しさん2008/06/11(水) 17:05:39
マルチかよ
0481デフォルトの名無しさん2008/06/11(水) 17:08:28
これは酷い
0482デフォルトの名無しさん2008/06/11(水) 17:29:13
>>455-479の人気に嫉妬
0483デフォルトの名無しさん2008/06/11(水) 17:30:39
【入門】Common Lisp その4【質問よろず】
http://pc11.2ch.net/test/read.cgi/tech/1201402366/860

860 名前:入ってしまえば天国なんだね…。[sage] 投稿日:2008/06/11(水) 11:01:38
LISPに最初から挫折しそうになって、あちこち見ています。

使用者例が少なすぎて発想パターンを断言できないけど、
思考‐発想タイミングから言えば基本的に敷居「だけ」が
高い言語のようだし、初心者を甘やかしても良さそう。

ところで、この言語で言えば印欧語族のロシア語みたいな
性格を見て今、ぐぐってみたんだが…ちょw大当たりww
これは…すごいのはキャラが立ってるLISPだなwww

これが、印欧語族の中では英語的なC言語系だと…
ぐぐってみた…ごめん、もう何も言う事ないwwww
(英語は「敬語」を始め、高度習得が困難です。)

対照的すぐる…(もうちょいがんばれば、あるいは…?

0484デフォルトの名無しさん2008/06/11(水) 17:30:42
>>479
無理して本気になる必要ないよ。
好きなことだけ本気でやればいい。
仕事なら話は別だけどね。
0485デフォルトの名無しさん2008/06/11(水) 17:33:54
>>474
おいおい、弁解するのはかまわないけど、
勝手に「俺たち」で括るのはやめてくれよ。
お前みたいな言う事がコロコロ変わる幼稚な奴と
一緒にされたら気分悪いだろ。
0486デフォルトの名無しさん2008/06/11(水) 17:36:15
ブログペットやマルチにいちいちマジレスする必要もないと思うんだ。(´・ω・`)
0487デフォルトの名無しさん2008/06/11(水) 18:04:32
>>479
これはひどいww
0488デフォルトの名無しさん2008/06/11(水) 18:41:12
>>485
必死すぎw
0489デフォルトの名無しさん2008/06/11(水) 18:57:30
>>488
必死だから何だ?
マジで気持ち悪いからな。お前も含めて。
書き逃げばっかりしてないで意見があるなら書けよ。
0490デフォルトの名無しさん2008/06/11(水) 19:32:58
http://www.inf.hs-zigr.de/~wagenkn/PP-Buch/

#!C:/Programme/PLT/mzscheme -r

(require (lib "cgi.ss" "net"))

(display "content-type: text/html") (newline)
(newline)

(display "<HTML>")(newline)

(display "<HEAD><TITLE>cgi-script's response</TITLE></HEAD>")(newline)

(display "<BODY>")(newline)

(display "Hello, I'm Mr. ")
(display (extract-binding/single 'surname (get-bindings)))
(display ". <BR>")(newline)
(display "Just call me ")(display (extract-binding/single "firstname" (get-bindings)))
(display ". <BR>")(newline)

(display "</BODY>")(newline)

(display "</HTML>")(newline)
0491デフォルトの名無しさん2008/06/11(水) 20:55:25
(define λlambda)
0492デフォルトの名無しさん2008/06/11(水) 22:51:48
lambdaは構文だからdefine-syntaxやdefine-macroにしたほうがポータブル
0493デフォルトの名無しさん2008/06/12(木) 01:55:43
scheme初心者なんだけどほんとに再帰って難しい
入門書読んでて再帰の便利さはなんとなく伝わったけど・・・

やっぱ上級者になると普通に使えるんですよね
俺ってやっぱりダメな子・・・

         |        |/(-_-)\|
          |        |  ∩ ∩   |
          |           ̄ ̄ ̄ ̄ ̄
        :::, ―――、
       ::::/./^^^^^^'vl
     :::::::| | /  \ ||
      :::::::(sl rェ , rェ |') ウツダ
      :::::゙ゝ、 -  ノ
     :::::/ l  ̄ ̄lヽ
     :::::|-|/l⌒l⌒l-|
     :::::\二、_)二ノ _____________
      :::::|||  |:|  |
      /`ー(⌒)(⌒)
     /;;;;;;;;;;;;;;;; ̄;;;;; ̄
   /
 /

0494デフォルトの名無しさん2008/06/12(木) 02:10:18
>493
昔むかし、Pascalの授業の宿題で再帰を使わないと事実上解けない問題を
「再帰呼び出しと言うものを全く知らずに」何とか解こうと悪戦苦闘した
俺よりはマシw。
0495デフォルトの名無しさん2008/06/12(木) 02:14:54
ちなみにその教科書にはその問題が記述されている箇所以前に
再帰呼び出しを説明している部分がほとんど無かった。

今なら考えられない教科書だと思う。
0496デフォルトの名無しさん2008/06/12(木) 02:19:25
極めて教育的な良い教科書だな
0497デフォルトの名無しさん2008/06/12(木) 02:22:45
一行一行その時の値がいくつになるか紙に書いてみたらわかると思う
0498デフォルトの名無しさん2008/06/12(木) 02:23:14
「再帰」という単語をほとんど使わずに
それを記憶に焼き付けさせたのか
0499デフォルトの名無しさん2008/06/12(木) 02:32:13
さらにちなみに俺の場合(Pascalでの再帰の場合)は
見かけ上、同じ名前の変数や関数でもシンタックス(戻り番地など)と
共にスタック上に別もの扱いで次々と積まれて行く事が分かって
ようやく納得が行ったよ。

そこに気づくまでは訳が分からなかった。
0500デフォルトの名無しさん2008/06/12(木) 02:33:08
ゲームコンテストに出しなさい。
http://www.tohofuhai.com/  豆腐ゲームコンテスト
http://kirara111.sakura.ne.jp/  星屑きらら杯
http://3punge.com/ 3分ゲーコンテスト(今休止中)

0501デフォルトの名無しさん2008/06/12(木) 02:55:49
>>494
昔pascalとくれば東大の学生だったんだな。
0502デフォルトの名無しさん2008/06/12(木) 03:30:00
Eclipse3.3+Cups使っている人いる?
なんか環境自体が、うまく動いていないような気がするのだが・・・
0503デフォルトの名無しさん2008/06/12(木) 03:48:30
再起で解け、ループで解けない問題はない。
0504デフォルトの名無しさん2008/06/12(木) 04:16:06
それは「問題」という言葉の意味を取り違えてるのでは。
>>494の思い出話に出てくる「問題」は、あくまで宿題なわけで。
たとえば身も蓋も無い例をいえば、「ただし、ループを使ってはいけない」と書かれた「問題」は、
再帰で解けてもループでは解けないよ。
0505デフォルトの名無しさん2008/06/12(木) 08:09:22
>>494 >>499
Pascalの機能として知らなかったのなら話はわかるが、
再帰の概念がわからなかったっていうのは・・・
高校の数学をさぼってたと考えられる。
0506デフォルトの名無しさん2008/06/12(木) 09:30:12
再帰じゃないと解けない問題なんてあるのか?
「再帰を使用せよ」と指定されてないかぎり、なんでもif/gotoで書き直せる
はずなんだが。
0507デフォルトの名無しさん2008/06/12(木) 09:49:54
例:「再帰を使用せよ」って指定された問題
0508デフォルトの名無しさん2008/06/12(木) 09:59:14
Schemeの末尾再帰はむしろgotoに近い機能ですよ
Schemerはgotoを嫌っているわけではないと思います
0509デフォルトの名無しさん2008/06/12(木) 10:26:12
ackermann関数を再帰なしで
0510デフォルトの名無しさん2008/06/12(木) 10:31:17
現在の有限の記憶域の計算機で計算できるものは再帰なしで計算できる。
配列をスタックと看做してループすれば再帰と等価。
たぶん。
無限の記憶域の場合は等価かどうかはわからない。
0511デフォルトの名無しさん2008/06/12(木) 10:44:03
gogo ackermann!!
0512デフォルトの名無しさん2008/06/12(木) 11:21:09
>>510
>配列をスタックと看做してループすれば再帰と等価
それじゃ関数の呼び出し部分を自分で作ってるのと同じじゃないか?
0513デフォルトの名無しさん2008/06/12(木) 11:35:21
>>510 たらい回し関数ってループに展開可能かい?
0514デフォルトの名無しさん2008/06/12(木) 12:01:04
>>512
そう。
端的に言えば再帰を使わずに仮想機械を組む。
その中で仮想言語で再帰的プログラムを組む。
表層言語には再帰は現れず、
データ(仮想言語)に再帰が現れるだけ。
CPUは再帰的ではなく反復的に計算するけど
再帰計算ができるでしょ?
それをソフトウェアでするだけのこと。
再帰的なデータも許さないとなれば
再帰的アルゴリズムが表現できず
チューリング完全でなくなる。
0515デフォルトの名無しさん2008/06/12(木) 12:01:43
Ackもtaraiも可能です。
>>510
無限記憶領域でも等価です。

詳しくは計算理論の入門書で。
0516デフォルトの名無しさん2008/06/12(木) 13:17:31
>>493
上級者になると、ていうより基礎中の基礎。
ドラゴンボールで言えば舞空術。
囲碁で言えばシチョウ。
でもあのポール・グレアムでさえ
プログラムを習いたての頃は反復アルゴリズムしか知らず
再帰を使いたいなどと考えたことはなかったし
(Ansi Common Lisp)
19歳の時には
「たぶんLispを学ぶべきなんだろう。しかしLispはあまりに異質に見える。」
(Lispがそんなにすごいなら ---If Lisp Is So Great---)
などと考えてたんだから
頑張れ!
0517デフォルトの名無しさん2008/06/12(木) 13:17:52
>>503
あたりまえじゃないか。もちろん逆も真。
0518デフォルトの名無しさん2008/06/12(木) 13:30:10
有名な再帰画像

Drosteココア
http://en.wikipedia.org/wiki/Image:Droste.jpg
メリーミルク
http://mognavi.jp/image/food/00/01/51/4902705021471.jpg
0519デフォルトの名無しさん2008/06/12(木) 13:34:59
>>493の書き込みを見て、ふと思った。
再帰を見て、わざわざこんなことしなくても・・・と思ってしまう問題が多い。
たまに再帰があって良かったなと思う程度。
僕は、きっとLispに向いてない。


ちなみに、ほとんどLispはできません。
0520デフォルトの名無しさん2008/06/12(木) 13:51:53
>>519だが、連投すまん。
この質問に的確に答えてくれる人がいたら、
みんなの(僕の)ためになるんじゃないかと思って。

たとえば、再帰を使うめっちゃ初歩的な関数lengthがあるよね

(defun length (lst)
(if (null lst)
0
(+ 1 (length (cdr lst)))))

再帰がわからない人って、読むときにlengthって関数の
意味が知りたいのに(わかってないのに)、lengthを使われても
わかるわけないじゃんってことじゃない?
0521デフォルトの名無しさん2008/06/12(木) 13:55:28
その辺について、ANSI Common Lispで言ってたね。
以下、それを引用しているページから引用。

初めのうちは再帰は理解するのが難しいと思う人が多い。
難しいと思ってしまうのは、主に関数に対して誤ったメタファ(比喩)をあてはめていることによる。
人々は関数をマシンの一種ととらえがちである。
原料がパラメータで届き、ほかの関数に下請けに出して処理し、最後に完成品を組み立てて、返り値として出荷する。
関数に対してこのメタファをもっていると、再帰は不可能ということになる。
マシンがどうやって作業を自分自身に下請けに出すのか?
動作中のマシンにはそんな余裕などないじゃないかと思ってしまうことになる。

関数は進行しつつあるプロセスであると見る方が、メタファとしては適当であろう。
再帰はプロセスの中では自然なものである。日常生活でも再帰的なプロセスをよく見る。
たとえば、ヨーロッパ史における人口変化に関心をもっている歴史家を考えてみよう。
資料を調べるプロセスは以下のようなものだろう。

1. 1 つの資料を手に入れる
2. 人口変化に関する情報を探す
3. その資料がほかの役立ちそうな資料に言及していたら、ほかの資料を調べる

このプロセスは理解しやすいものだが、第 3 ステップにより同じプロセスが何度か適用されることがあるので、
再帰的なプロセスになっている。
0522デフォルトの名無しさん2008/06/12(木) 14:00:20
>>520
なるほど、そういう風に悩むのか。

まず、lengthの中のlengthが使われるのはnullでないときだけ、
つまり () に対する length の値は length を使わずに 0 と決まっている。
で、それ以外については length を使うわけだが、だんだん短くなっていつかは 0 が返る。

という具合にステップバイステップで考えていくと判りやすいんじゃないかな。
0523デフォルトの名無しさん2008/06/12(木) 14:02:50
文系の奴は頭だけで理解しようとするからイカン
グダグダ言ってないで手も動かせ

そう言っていた数学の先生がいたとかいないとか
The Little Schemerなんかもそのクチか
0524デフォルトの名無しさん2008/06/12(木) 14:05:57
でもまぁ実際には、理系にとっても「体感」というのは大事だよな。
0525デフォルトの名無しさん2008/06/12(木) 14:20:38
数学的直観って言葉があるくらいだからね。

自分は数列、漸化式が得意で好きだったから、
再帰は何も悩む所がなかった。

実装手法もPコードですぐに理解できた。(東大ではありません>>501)
浮動点による意味づけを知った時には、
漸化式みたいでわくわくした。
0526デフォルトの名無しさん2008/06/12(木) 14:43:07
>>521
名文をありがとう。

>>522
う〜ん、自分流に噛み砕くと、
(1)停止することを確認
(2)cdr部分を取って、空リストになるまでは1足し続ける(lengthの場合)
ってことですかね。

>>525
うらやましい。
0527デフォルトの名無しさん2008/06/12(木) 15:00:29
部分問題に分けて、(car, cdr)
部分問題毎に適切な処理、(1, length)
部分問題の解を統合。(+)
部分問題の収束地点の設定。(null, 0)

分割統治法の一番極端な形、一要素とそれ以外に分ける。
後は下請け(再帰的関数呼出し)に任せる
0528デフォルトの名無しさん2008/06/12(木) 16:27:08
いちいちcarとかcdrみたいな「処理」で取り出させるのが前時代的なんだよなー
LISt Processorなのにパターンマッチが標準で無いってどういうことよ
0529デフォルトの名無しさん2008/06/12(木) 16:28:49
>>528
簡単に作れるからでは?
0530デフォルトの名無しさん2008/06/12(木) 16:31:19
>>529
簡単に作れるものほど言語が準備すべきだと俺は思う。
そうでないと人によってそれぞれの実装ができてしまって
言語の「中に」バベルの塔ができちゃうからね(実際Lispはそうなっちゃってるのでは?)
0531デフォルトの名無しさん2008/06/12(木) 16:35:42
パターンマッチこそが言語内言語なんだよね。
汎用のパターンマッチを使うよりも効率的な専用マッチャーが簡単に書けるから、
必要性が低いのだ。正規表現があまり使われないのも、だいたい同じ理由だ。
0532デフォルトの名無しさん2008/06/12(木) 16:40:44
処理系毎の拡張で用意されてるでしょ
0533デフォルトの名無しさん2008/06/12(木) 16:43:07
汎用のPrologインタプリタでさえ、Lispなら100行くらいで書けるからなあ。
0534デフォルトの名無しさん2008/06/12(木) 16:44:27
>>528
君の考える「パターンマッチ」の具体的な仕様と使用例を示してくれると、
より有意義な議論ができると思う。
0535デフォルトの名無しさん2008/06/12(木) 17:51:19
パターンマッチって分岐と分解を同時に行う処理だと思ってる
大抵は分岐の内容に応じてリストを分解するから一度に処理するのは適切な抽象化なはず
下にリストの内容を1だったら2、2だったら5、それ以外だったらそのままにして変換する関数を
書いてみたがどうみてもパターンマッチ版の方がわかりやすい(どうやってパターンマッチを実装するのかは
しらないけど。あとmap使えというのは禁句)
みんなのLispプログラムもみなおしてみたらパターンマッチを使った方がスッキリする部分が多くあるのでは?
このスレにもパターンマッチを「ふわふわしたおまけ」としかみなしてない人が結構多いと思うから
俺のレスがパターンマッチを使うきっかけになってくれれば幸いだ。


(defun (hoge lst)
(cond ((eq (car lst) 1)
(cons 2 (hoge (cdr lst))))
((eq (car lst) 2)
(cons 5 (hoge (cdr lst))))
((and (not (null? lst)) (list? lst))
(cons (car lst) (hoge (cdr lst))))
(else
nil)))

(defun (hoge lst)
(pm lst
((| 1 xr)
(cons 2 (hoge xr)))
((| 2 xr)
(cons 5 (hoge xr)))
((| x xr)
(cons x (hoge xr)))
(else
nil)))
0536デフォルトの名無しさん2008/06/12(木) 17:59:53
>>535
後者が簡潔だが、前者が判りやすい。おそらく効率は前者が勝る。
「ふわふわしたおまけ」とは思わないけど、言語の中に別の言語を導入するような
気持ち悪さは感じる。

まあ好きな人は使えば良いのでは?という程度かなあ。
0537デフォルトの名無しさん2008/06/12(木) 18:20:59
>>535
CL?Scheme?
0538デフォルトの名無しさん2008/06/12(木) 18:27:26
俺パターンマッチ入りの俺Lisp言語だろw
0539デフォルトの名無しさん2008/06/12(木) 20:20:34
パターンマッチはなじむと便利
可読性とかは知らんけど
0540デフォルトの名無しさん2008/06/12(木) 20:22:11
まあ関数型言語だとおなじみ
0541デフォルトの名無しさん2008/06/12(木) 20:25:28
頑張れば CLtL3 に入れてもらえるかもw
0542デフォルトの名無しさん2008/06/12(木) 20:28:51
535のプログラムみて思ったんだけど
Listだけどnilじゃないのを一発で判別する関数ってないんかね
0543デフォルトの名無しさん2008/06/12(木) 21:05:06
consp
pair?
0544デフォルトの名無しさん2008/06/12(木) 21:41:28
来月「Practical Common Lisp」の訳書が出るっぽい
http://www.bk1.jp/product/02997001
0545デフォルトの名無しさん2008/06/12(木) 21:47:48
>>544
原著よりも安いのか。
園城さんって、LispUser.netの人ですね。
■ このスレッドは過去ログ倉庫に格納されています