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


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

Lisp Scheme Part22



1 名前:デフォルトの名無しさん mailto:sage [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

449 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:48:12 ]
>>445
コマンドプロンプトに、UTF-8でエンコードされた「こんにちは」を出力すると、
そう表示されるな。

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

お前、ネイティブエンコーディングって何か理解してないだろ?

450 名前:デフォルトの名無しさん mailto:sage [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として出力されるから・・・・
わけわからないことになりますが・・・

451 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 03:33:43 ]
そこまで判ってて、なぜ「わけわからない」になるのか、わけわからないw

452 名前:デフォルトの名無しさん mailto:sage [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

453 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:43:32 ]
>>452
UTF-8でビルドした犯人は俺だ。
でもShift_JISでビルドしたものを配布すると他国の人が困るんじゃないかな。
それともGauche-mingw-0.8.13-sjis.exe とかを作る?

454 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 08:44:57 ]
>>451
毒を出しすぎ。

455 名前:UTF‐8はXML標準…でも日本語「だけ」苦手?(ТΤ mailto:sage [2008/06/11(水) 10:18:00 ]
LISPをざっとみた感想です;

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

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

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

英語(印欧語)センスを鍛えようw ゎぁぃ モレオワタ(AA略)

456 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 11:30:34 ]
個人的には、Lispは「言語」ではないと思ってる。
図形、地図、表、レゴブロック、そういったもの達のほうにずっと近い。

だから>>455を読んで、日本語の話者だから戸惑うのではなく、
言語に触れるモードで触れるから戸惑うのではないか、みたいなことを感じた。

457 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 11:52:23 ]
黒板に自然法則とか書く時はそれでいい
プログラマの意図が分かるように書きたいときは、言語っぽくないと困る



458 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 12:09:57 ]
>>455
日本語もまともに書けないのはよくわかった。

459 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 12:50:18 ]
>>458
自分の読解力のなさを棚にあげるのはやめようぜ

460 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 12:56:30 ]
>>455
そんじゃ、印欧語話者の間でPy(ピー)が人気なのは何で?素朴な疑問〜


461 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:03:57 ]
というか、国際的にもLisp/Schemeは日本では大人気。

462 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:04:09 ]
>>469
ほう、なら455を日本語で説明してくれんか?
3行目から出てくる括弧の使い方から。
特攻の拓みたいに特殊な言語かと思ったよ。

463 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:04:37 ]
ごめん459だった。

464 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:14:22 ]
「直感的には」わかりにくかったけれど、
→ 直感的には判りにくいけれど、
「印欧語話者の生成文法で言う言語本能ってだいたいこんな感じなんじゃないか?」と思った。
→ 印欧語話者の生成文法で言う「言語本能」って、大体こんな感じなんじゃないか?と思った。


465 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:54:50 ]
>>453
Windowsのことはよく知らないんだけど、入出力コードはカレントロケールに合わせる
みたいなことって難しいの?

466 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:56:52 ]
>>459
俺も>>455が何を言いたいのか理解できなかった。
読解力無いのかなあ。

467 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:05:44 ]
>>464
5行目以降もまるで判らんので、その調子で翻訳お願いしますね。>459
こんな物を読解する能力なら不要だと確信してるけど、
>>456でいきなり会話が成立した(らしい)事が、本当に不思議でしょうがない。




468 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:08:50 ]
LISP使いはスノッブが多いな
GEBとかメタマジックゲーム読んで悦に入ってそう

469 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:23:47 ]
コンプレクッスですか

470 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:24:44 ]
>>455が理解できない一人でーす。

>>461
「国際的にも」「日本では」
国際的なのか、日本だけなのか、はっきりしる!
…みたいな日本語の乱れについての話題なのかな?今は。
外国人が一生懸命コミュニケーションしようとする試み
なのかもしれないけど、漢字ひらがな並べれば良い、って物じゃないんです。
半端に学ばれたままだと相手を不愉快にさせますよ。

471 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:32:23 ]
2ちゃんの定型文だけはしっかり使うガイジンかよw
字は読めないけど日本のマンガには詳しい、みたいな。

472 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 14:43:03 ]
いまのとこ一方的に文章吐き出す機能しかないみたいだから
受け答えは期待出来ないと思う

473 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:34:47 ]
>>465
このへんに問題点が書かれている。
practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aWindows%2fVC%2b%2b%3alog%3aold_2007#H-1ctgw0n
これはVC++の話だけどMinGWも同様と思われる。


474 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:37:14 ]
>>462
俺も理解できないんだが、
>>456が回答してるんだから
理解できる文章なんだろ。
俺たちが読解力不足ってだけで。
と思っただけ。

475 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 15:40:11 ]
文章を理解したのではなく、その他の能力(ESPなど)を用いたのではないかと思う

476 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:06:49 ]
文章はともかく言葉の意味がわからない
言語学用語なのかな?
あるいはLispを齧ったばかりの455さんが戯れに組んだELIZAじゃないだろうなw

477 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:08:45 ]
455、人気者だなw



478 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:19:09 ]
>>450
MS-Windows使わない人なんでハズしている可能性あるが…

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

Win32のコンソールAPIは最低限の依存で済ませているみたい。
Gaucheもそうだろうから、利用できるんじゃないか。

479 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:02:49 ]
Lispは素晴らしい言語だと思うのですが
Lispが生き残ってるのはEmacsのおかげ
実用には耐えないが一部ハッカーの趣味で使われている
など否定的な意見のみが見られてイマイチ本気になれません
Lispで作られたアプリケーションを教えていただけないでしょうか

480 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:05:39 ]
マルチかよ

481 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:08:28 ]
これは酷い

482 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:29:13 ]
>>455-479の人気に嫉妬


483 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:30:39 ]
【入門】Common Lisp その4【質問よろず】
pc11.2ch.net/test/read.cgi/tech/1201402366/860

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

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

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

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

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



484 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:30:42 ]
>>479
無理して本気になる必要ないよ。
好きなことだけ本気でやればいい。
仕事なら話は別だけどね。

485 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:33:54 ]
>>474
おいおい、弁解するのはかまわないけど、
勝手に「俺たち」で括るのはやめてくれよ。
お前みたいな言う事がコロコロ変わる幼稚な奴と
一緒にされたら気分悪いだろ。


486 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:36:15 ]
ブログペットやマルチにいちいちマジレスする必要もないと思うんだ。(´・ω・`)

487 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:04:32 ]
>>479
これはひどいww



488 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:41:12 ]
>>485
必死すぎw

489 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 18:57:30 ]
>>488
必死だから何だ?
マジで気持ち悪いからな。お前も含めて。
書き逃げばっかりしてないで意見があるなら書けよ。

490 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 19:32:58 ]
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)

491 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 20:55:25 ]
(define λlambda)

492 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 22:51:48 ]
lambdaは構文だからdefine-syntaxやdefine-macroにしたほうがポータブル

493 名前:デフォルトの名無しさん [2008/06/12(木) 01:55:43 ]
scheme初心者なんだけどほんとに再帰って難しい
入門書読んでて再帰の便利さはなんとなく伝わったけど・・・

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

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



494 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:10:18 ]
>493
昔むかし、Pascalの授業の宿題で再帰を使わないと事実上解けない問題を
「再帰呼び出しと言うものを全く知らずに」何とか解こうと悪戦苦闘した
俺よりはマシw。

495 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:14:54 ]
ちなみにその教科書にはその問題が記述されている箇所以前に
再帰呼び出しを説明している部分がほとんど無かった。

今なら考えられない教科書だと思う。

496 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:19:25 ]
極めて教育的な良い教科書だな

497 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:22:45 ]
一行一行その時の値がいくつになるか紙に書いてみたらわかると思う



498 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:23:14 ]
「再帰」という単語をほとんど使わずに
それを記憶に焼き付けさせたのか

499 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:32:13 ]
さらにちなみに俺の場合(Pascalでの再帰の場合)は
見かけ上、同じ名前の変数や関数でもシンタックス(戻り番地など)と
共にスタック上に別もの扱いで次々と積まれて行く事が分かって
ようやく納得が行ったよ。

そこに気づくまでは訳が分からなかった。

500 名前:デフォルトの名無しさん [2008/06/12(木) 02:33:08 ]
ゲームコンテストに出しなさい。
www.tohofuhai.com/  豆腐ゲームコンテスト
kirara111.sakura.ne.jp/  星屑きらら杯
3punge.com/ 3分ゲーコンテスト(今休止中)



501 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 02:55:49 ]
>>494
昔pascalとくれば東大の学生だったんだな。

502 名前:デフォルトの名無しさん [2008/06/12(木) 03:30:00 ]
Eclipse3.3+Cups使っている人いる?
なんか環境自体が、うまく動いていないような気がするのだが・・・

503 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 03:48:30 ]
再起で解け、ループで解けない問題はない。

504 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 04:16:06 ]
それは「問題」という言葉の意味を取り違えてるのでは。
>>494の思い出話に出てくる「問題」は、あくまで宿題なわけで。
たとえば身も蓋も無い例をいえば、「ただし、ループを使ってはいけない」と書かれた「問題」は、
再帰で解けてもループでは解けないよ。

505 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 08:09:22 ]
>>494 >>499
Pascalの機能として知らなかったのなら話はわかるが、
再帰の概念がわからなかったっていうのは・・・
高校の数学をさぼってたと考えられる。

506 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 09:30:12 ]
再帰じゃないと解けない問題なんてあるのか?
「再帰を使用せよ」と指定されてないかぎり、なんでもif/gotoで書き直せる
はずなんだが。

507 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 09:49:54 ]
例:「再帰を使用せよ」って指定された問題



508 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 09:59:14 ]
Schemeの末尾再帰はむしろgotoに近い機能ですよ
Schemerはgotoを嫌っているわけではないと思います

509 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 10:26:12 ]
ackermann関数を再帰なしで

510 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 10:31:17 ]
現在の有限の記憶域の計算機で計算できるものは再帰なしで計算できる。
配列をスタックと看做してループすれば再帰と等価。
たぶん。
無限の記憶域の場合は等価かどうかはわからない。

511 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 10:44:03 ]
gogo ackermann!!

512 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 11:21:09 ]
>>510
>配列をスタックと看做してループすれば再帰と等価
それじゃ関数の呼び出し部分を自分で作ってるのと同じじゃないか?

513 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 11:35:21 ]
>>510 たらい回し関数ってループに展開可能かい?


514 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:01:04 ]
>>512
そう。
端的に言えば再帰を使わずに仮想機械を組む。
その中で仮想言語で再帰的プログラムを組む。
表層言語には再帰は現れず、
データ(仮想言語)に再帰が現れるだけ。
CPUは再帰的ではなく反復的に計算するけど
再帰計算ができるでしょ?
それをソフトウェアでするだけのこと。
再帰的なデータも許さないとなれば
再帰的アルゴリズムが表現できず
チューリング完全でなくなる。

515 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 12:01:43 ]
Ackもtaraiも可能です。
>>510
無限記憶領域でも等価です。

詳しくは計算理論の入門書で。

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

517 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:17:52 ]
>>503
あたりまえじゃないか。もちろん逆も真。



518 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:30:10 ]
有名な再帰画像

Drosteココア
en.wikipedia.org/wiki/Image:Droste.jpg
メリーミルク
mognavi.jp/image/food/00/01/51/4902705021471.jpg

519 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:34:59 ]
>>493の書き込みを見て、ふと思った。
再帰を見て、わざわざこんなことしなくても・・・と思ってしまう問題が多い。
たまに再帰があって良かったなと思う程度。
僕は、きっとLispに向いてない。


ちなみに、ほとんどLispはできません。

520 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:51:53 ]
>>519だが、連投すまん。
この質問に的確に答えてくれる人がいたら、
みんなの(僕の)ためになるんじゃないかと思って。

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

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

再帰がわからない人って、読むときにlengthって関数の
意味が知りたいのに(わかってないのに)、lengthを使われても
わかるわけないじゃんってことじゃない?

521 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 13:55:28 ]
その辺について、ANSI Common Lispで言ってたね。
以下、それを引用しているページから引用。

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

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

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

このプロセスは理解しやすいものだが、第 3 ステップにより同じプロセスが何度か適用されることがあるので、
再帰的なプロセスになっている。

522 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:00:20 ]
>>520
なるほど、そういう風に悩むのか。

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

という具合にステップバイステップで考えていくと判りやすいんじゃないかな。

523 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:02:50 ]
文系の奴は頭だけで理解しようとするからイカン
グダグダ言ってないで手も動かせ

そう言っていた数学の先生がいたとかいないとか
The Little Schemerなんかもそのクチか

524 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:05:57 ]
でもまぁ実際には、理系にとっても「体感」というのは大事だよな。

525 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:20:38 ]
数学的直観って言葉があるくらいだからね。

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

実装手法もPコードですぐに理解できた。(東大ではありません>>501)
浮動点による意味づけを知った時には、
漸化式みたいでわくわくした。


526 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 14:43:07 ]
>>521
名文をありがとう。

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

>>525
うらやましい。

527 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 15:00:29 ]
部分問題に分けて、(car, cdr)
部分問題毎に適切な処理、(1, length)
部分問題の解を統合。(+)
部分問題の収束地点の設定。(null, 0)

分割統治法の一番極端な形、一要素とそれ以外に分ける。
後は下請け(再帰的関数呼出し)に任せる



528 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:27:08 ]
いちいちcarとかcdrみたいな「処理」で取り出させるのが前時代的なんだよなー
LISt Processorなのにパターンマッチが標準で無いってどういうことよ

529 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:28:49 ]
>>528
簡単に作れるからでは?

530 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:31:19 ]
>>529
簡単に作れるものほど言語が準備すべきだと俺は思う。
そうでないと人によってそれぞれの実装ができてしまって
言語の「中に」バベルの塔ができちゃうからね(実際Lispはそうなっちゃってるのでは?)

531 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:35:42 ]
パターンマッチこそが言語内言語なんだよね。
汎用のパターンマッチを使うよりも効率的な専用マッチャーが簡単に書けるから、
必要性が低いのだ。正規表現があまり使われないのも、だいたい同じ理由だ。

532 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:40:44 ]
処理系毎の拡張で用意されてるでしょ

533 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:43:07 ]
汎用のPrologインタプリタでさえ、Lispなら100行くらいで書けるからなあ。

534 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 16:44:27 ]
>>528
君の考える「パターンマッチ」の具体的な仕様と使用例を示してくれると、
より有意義な議論ができると思う。

535 名前:デフォルトの名無しさん mailto:sage [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)))

536 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 17:59:53 ]
>>535
後者が簡潔だが、前者が判りやすい。おそらく効率は前者が勝る。
「ふわふわしたおまけ」とは思わないけど、言語の中に別の言語を導入するような
気持ち悪さは感じる。

まあ好きな人は使えば良いのでは?という程度かなあ。

537 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:20:59 ]
>>535
CL?Scheme?



538 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 18:27:26 ]
俺パターンマッチ入りの俺Lisp言語だろw

539 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 20:20:34 ]
パターンマッチはなじむと便利
可読性とかは知らんけど

540 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 20:22:11 ]
まあ関数型言語だとおなじみ

541 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 20:25:28 ]
頑張れば CLtL3 に入れてもらえるかもw

542 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 20:28:51 ]
535のプログラムみて思ったんだけど
Listだけどnilじゃないのを一発で判別する関数ってないんかね

543 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 21:05:06 ]
consp
pair?

544 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 21:41:28 ]
来月「Practical Common Lisp」の訳書が出るっぽい
www.bk1.jp/product/02997001

545 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 21:47:48 ]
>>544
原著よりも安いのか。
園城さんって、LispUser.netの人ですね。

546 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 21:54:10 ]
>>543
「List」だけどnilじゃない

547 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 22:37:44 ]
>>528
いろいろな人が考えたけど、
S式とうまくマッチするのがないってのが現状。
これだけ時間がかかって見つからないからないんだと思う。

define-syntaxは一部カバーしていると思うが。



548 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 22:57:14 ]
CLOSがパターンマッチみたいなものだと思うのですが

549 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 23:32:04 ]
>>547
昔から、
(match '(a b . c) '(1 2 3 4 5)) =>((a 1) (b 2) (c (3 4 5)))
(match-let (a b . c) '(1 2 3 4 5) (list a b c)) =>(1 2 (3 4 5))
みたいなのや、prologのunification辺りはほとんどの人間が
自分の物を持ってると思うけどな。
こういうのをマクロにしてパターンを定数で取れば特殊化もできる。
今は組み込みにするのが流行だろうけど、
LISP系ならパターンマッチはライブラリで自然に実装できる範囲だから、
あえて入れなかったのでは。






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

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

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