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


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

Lisp Scheme Part26



1 名前:デフォルトの名無しさん mailto:sage [2009/04/24(金) 19:12:39 ]
※ ここはCommon Lisp、SchemeをはじめとするLisp族全般のスレです ※

■過去スレ
 Part25: ttp://pc12.2ch.net/test/read.cgi/tech/1231856193/
 Part24: ttp://pc11.2ch.net/test/read.cgi/tech/1224939205/
 Part23: ttp://pc11.2ch.net/test/read.cgi/tech/1215875388/
 Part22: ttp://pc11.2ch.net/test/read.cgi/tech/1211381920/
 Part21: ttp://pc11.2ch.net/test/read.cgi/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://pc11.2ch.net/test/read.cgi/tech/1151025773/
 Part14: ttp://pc11.2ch.net/test/read.cgi/tech/1132275726/
 Part13: ttp://pc11.2ch.net/test/read.cgi/tech/1115901841/
 Part12: ttp://pc11.2ch.net/test/read.cgi/tech/1100229366/
 Part11: ttp://pc11.2ch.net/test/read.cgi/tech/1091456033/
 Part10: ttp://pc11.2ch.net/test/read.cgi/tech/1075630259/
 Part09: ttp://pc11.2ch.net/test/read.cgi/tech/1069594582/
 Part08: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
 Part07: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
 Part06: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
 Part05: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
 Part04: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
 Part03: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
 Part02: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
 Part01: ttp://piza2.2ch.net/tech/kako/987/987169286.html

■テンプレート置き場
 ttp://wiki.fdiary.net/lisp/ (id:guest pass:cl)

488 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:17:18 ]
Common Lispでやりたいのか、Schemeでやりたいのか
どういう結果が欲しいか
はっきり書かないと

489 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:26:27 ]
>>488
ごめんなさい、最初に書いてなかった。schemeです。

490 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:36:51 ]
>>487
> でも apply より (list 0 `,@a) の方が直截的で、何がやりたかったか明確じゃないですか。

そうか?

491 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:41:51 ]
(0 1 2 3) がほしかったら`(0 ,@a)だな


492 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:42:29 ]
俺は`(0 ,@a)ってやるな
しかし、applyこんな風に使えるんだな

493 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 12:50:34 ]
ちなみに
`(0 ,@a) == `(0 . ,a) == (cons 0 a) == (apply list 0 a)
パイソニアンが見たら青筋たてそうだな(笑

494 名前:493 mailto:sage [2009/06/14(日) 12:55:30 ]
あ、見た目が同じだけどリストの構造は違うものになるんだった。すまん。

495 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:17:38 ]
>>491-492
リストが欲しい時はそれが自然ですね。
他の関数の引数に展開したい時は apply で我慢するかぁ。

>>490
違う?要は apply があんま好きじゃないってだけなんだけど。
scheme だと ((car (list + -)) 1 2) ができるって知った時はナイス!って思った。

496 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:26:59 ]
>>494 仲間はずれはapplyで作ったやつ?



497 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 17:07:32 ]
(append '(0) a)

498 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 21:49:52 ]
>>495
perl知らないせいか (list 0 `,@a) じゃ何がやりたかったかさっぱりわからなかった。
aの中身は実行時にしか決定されないからコンパイルするとlistでなくapplyが
呼ばれる。ソースコードに書いていないのに。むしろわかりにくい。

499 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 22:53:09 ]
apply使うと損した気分になったり不愉快になる

500 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 23:12:44 ]
病院へ池

501 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 23:29:34 ]
Applyが嫌いならMicroSoftyなら良いのか?

502 名前:495 mailto:sage [2009/06/14(日) 23:53:15 ]
>>498
俺だって perl 知らないよ。

えー、分かりやすいよ。
apply って大体にして、scheme では変数をリストの先頭に置いて関数を呼び出せるんだから
実質、この用途 (リストに格納されている要素を引数として関数に渡す)
のためだけの関数でしょ?
`( ,@a) で展開できるんだから `,@a も展開できたっていいじゃん。
apply なんて不要になるよ。

503 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 00:15:45 ]
quasiquote をとびこえて更に外側の括弧が表すリストの一部になるというのはダサいだろ。
list の場合だったらともかく、マクロだったらどう展開されるやら想像がつかん。
かと言ってマクロ展開より先にスプライシングするわけにもいかんし。

504 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 00:30:36 ]
>>503
quasiquote の展開はリード時にやんなきゃ駄目じゃない?
とはいえリード時には関数かマクロかわからないしなあ。

確かに、単純な場合にはよさげにみえるけど、
ちょっと入り組んだことになっただけで落とし穴だらけになりそうだね。


505 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 00:41:00 ]
aがリストかどうかもわからん

506 名前:502 mailto:sage [2009/06/15(月) 01:03:52 ]
>>503
あー、マクロ内で使われるとまずいのね。確かに。
apply だったら自動的に関数only だからそこは大丈夫だったのか。
んじゃ、マクロ内では `,@ は自粛でいいじゃんw。駄目?
だって apply も 関数にしか適用できないんだからお相子だって



507 名前:502 mailto:sage [2009/06/15(月) 01:08:33 ]
>>505
それはこれに限らず ,@ 全てが受ける制約じゃん

508 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 01:10:58 ]
まあ、おそらく自分よりはるかに頭の良い人が必要だと思って
残してある機能なわけだから、、、と俺なら考えるかな。

509 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 01:23:33 ]
>>506
そろそろ実装方針を示してはくれんか。

510 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 02:28:17 ]
>>508
paul grahamはこう言ってるよ。

tamo.tdiary.net/20080304.html#p01
> たとえば cond マクロ。こいつには Lisp 1 からこのかた余計な括弧がびっしり付いてきて、
> それを誰も何ともしてこなかった。
> if と cond を押しつぶしてひとつのオペレータにする Arc の技も、
> 誰かがとっくに見つけていたっておかしくなかったのだが、 間違いなくそんな周知の事実はない。

www010.upp.so-net.ne.jp/okshirai/arcll1-j.html
> いくぶん躊躇しながらも、彼は伝統的なLisp
> のletが嫌いだ、なぜならletによって一段インデントが深くなるからだ、と認めた。彼
> が躊躇したのは、letは「正しい」ことだと原則としてはわかっているからだ。この点
> では、「誰にとって正しいの?」と尋ねなくてはならない。なぜなら彼よりも実際頭の
> よいプログラマがいるとは思えないからだ。

>>503
> quasiquote をとびこえて更に外側の括弧が表すリストの一部になるというのはダサいだろ。
一理あるかもしれない。見方によっては荒っぽくて汚い。

>>509
実装方針?quasiquoteをいじればできるのかな。どうすりゃできるだろ

511 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 02:45:01 ]
practical-scheme.net/wiliki/wiliki.cgi?Lisp%3AS%E5%BC%8F%E3%81%AE%E7%90%86%E7%94%B1
このページのapplyの項と同じ話題かな?

512 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 06:18:44 ]
盛り上がってるところ悪いんだけどマクロと関数を混同してるんじゃないかな。
(define (conc-len x) (apply + (map length x)))
の定義のように、applyの最終的な評価の際に使われる引数が式の読み込み時に
わかるという保証はないんだよ。,@じゃこの関数は定義できないでしょ?

513 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 08:45:30 ]
>>512
ごめん、よく分からない。
,@ って実行時に展開されないの?
(define (conc-len x) (+ `,@(map length x))) じゃ駄目?

514 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 08:50:09 ]
quasiquote まわりは全部 syntax だよ

515 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 09:09:28 ]
ttp://www.math.u-toyama.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html#SEC39
「コンマアットマークは、リストかベクタの<qqテンプレート>内部に書かなければならない」

516 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 10:08:49 ]
gosh> (car ',@x)
unquote-splicing



517 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 10:54:36 ]
分かりやすいといいつつ続く文章が説明に全くなっていない件について。
自分の脳内が世界の全てって人なんだろうなあ。

518 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 11:41:03 ]
>>517
えー、分かりやすいよ。
lisp って大体にして、言語を拡張できるのが売りなんだから
実質、この用途のためだけの言語でしょ?
perl で展開できるんだから lisp も展開できたっていいじゃん。
perl なんて不要になるよ。

519 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 11:47:44 ]
replのreadの段で,@を自分の思うように仕込めばいいじゃん


520 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 12:12:38 ]
>>518
> 実質、この用途のためだけの言語でしょ?

へー

521 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:39:08 ]
>>513
一言で言えばnoです。
マクロと関数の違いについて理解していますか?式の変換と評価の違いがわかりますか?

522 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 15:12:54 ]
backquoteは、
`(,x y ,z)と書くところを、
'(`x y `z)と書ければ、
'(x y z)との字面の対象性上は美しいが、
中を見なければquoteすら効率的に評価できなくなる。O(1)→O(n)

>>513もそうだが、"全体"の構造や評価に影響を与える"部分"があるのはよくない。

523 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 17:37:21 ]
Perlは展開「できる」というか、展開「しちゃう」言語なんだよな。
展開させないために、リファレンスという機能を使わなきゃいけない。

>>522
> "全体"の構造や評価に影響を与える"部分"があるのはよくない
ここ同意。美しくもないし、わかりやすくもないと思う。

そういう展開をさせたいという意志を、applyが一手に引き受けている現状のほうが、
俺には綺麗だし把握しやすい。

524 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 19:11:38 ]
どっちがいいかっていうことには主観的な部分もあるだろうけど、
少なくとも Lisp はこういう理由でこういう選択をした、ってことだ。

525 名前:513 mailto:sage [2009/06/15(月) 20:26:30 ]
>>517
確かに説明になってなかったね。すまん。

>>519
自分の外の括弧に展開させることなんてできないんじゃない?
やっぱやろうとしたら要素に `,@ がある括弧は apply に読み替えるって
動作が必要だから、処理系の実装になっちゃうから無理だな。
しかもそのチェックがコストだろうし。

>>521
,@ が実行時に展開してるように見えたから混同しちゃった。
どうやって ,@ は可変のリストを展開できるんだろうって思ったけど
たぶん apply に変換させてるだけなんだよね?

>>522-523
よくない派が多数か。んじゃやっぱあんまいけてないんだろうな。これはあきらめる。

526 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 20:33:30 ]
お前ずばり、昔来たquote判ってないちゃんだろ
ネタ提供ありがとう



527 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 20:42:35 ]
横レスだけど、quoteとか評価とかってなにげに難しいですよね。
本読んでCPSやYコンビネータはわかった気になったけど、
何時までもquoteや評価のあたりで何かモヤモヤしてる。

528 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:30:15 ]
>>525
あきらめるってのが良くわからないけど(まるでこのスレを起点に何かを動かすつもりだったみたいな)、
試しにそういう動作をするマイLispを作って遊んでみたらどう?
で、使ってみたらこんな感じだった、って報告を後日改めてここに書き込むとか。

529 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 01:27:38 ]
>>525
例えば psyntax には pure Scheme な quasiquote の実装があるから
眺めてみるといいんじゃない
ttp://www.cs.indiana.edu/chezscheme/syntax-case/

530 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 03:53:44 ]
>>526
その人とは違うよ。
>>528
そうだね。マイLisp作れたら面白そうだ。
汚いやり方でも少なくとも俺には合ってるからね。
俺がSICP読み終える頃には楽勝で実装できるんだろ、きっと。
>>529
quasiquoteは100行くらいか。
syntax だけじゃ多分無理だけど参考にするわ

531 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 04:23:16 ]
quasiquote って効率を考えずに実装するだけならば外側から順に再帰的に
consとappendに展開するマクロみたいな感じですむからそんなに難しくないと思う。

`@,で展開するのはもはやquasiquoteとは別の文法を導入しているような気が。
別にあっても悪くはないと思うけどもこれだけだと単なるapplyの中置演算子版みたいだし、
特殊な文法用意するのはlispらしくないし別にapplyつかえばいいじゃんということな気がする


532 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 04:49:20 ]
>>530
SICP読破を目指して本ばっかり読んで頭でっかちになるより、ちゃんと手を動かして
コードを書きつつ試行錯誤して正しい理解を身につけてほしいと思う今日この頃。
べつにトンチンカンなことを言ってスレを賑わすのが悪いと言ってるんじゃないだが、
本に書いてある意味論以外に、コードがどういう流れで処理されて実行結果に
たどり着くのかという流れを理解してから物を言った方がいいよ。

それとquasiquoteのオレサマ実装ぐらいSICPなんて読まんでもHaskellの48時間で
書くやつで誰でもできると思うけど。

533 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 06:56:16 ]
SICPは量は多いかもしれないが難解ではないよ。
本当に難しくなるのは、SICPで扱っていない枝葉末節が絡んできた時。

534 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 07:53:23 ]
しかしapplyも変な仕様だよな。
Schemeも同じ仕様なのはどういうわけだろ。
(append (list arg1 ...) args)をas isにすれば、
コンパイル時に余計なコンスセルを消費しないのは確かだけど、
余計なお世話のような気がする。
便利主義の昔のLispはまあいいとしても。

535 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 09:08:38 ]
彼は高校生くらいだろ
気持ちわかるよ
俺も滝に打たれるような気持ちでアセンブラ書いてた時期があったから
これが済んだらスーパープログラマーになってるはず、みたいなw
まあ無駄にはなってないけどさ

536 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 19:15:53 ]
codepad.org/g2dULeuu



537 名前:デフォルトの名無しさん mailto:sage [2009/06/16(火) 21:16:20 ]
ふつう48時間かかるものが、
枝葉末節を知っているだけで生産性が100倍以上になるわけだ。

538 名前:530 mailto:sage [2009/06/16(火) 22:10:10 ]
>>536
おー、`,@ で展開ができるよ! ありがとう、面白い。>>512もできた。
mzsceme は #%app で関数実行の前に細工ができるのか。
#mzscheme よく分からないけど (require m) は (require "filename") だよね。

539 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 11:53:24 ]
>>538
モジュール名

540 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 12:42:36 ]
悪い意味じゃなくて、Gauche本がSchemeの全て
な人が増えた気がする。


541 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 12:52:39 ]
初学者に読んで貰うような本が出たら、
それしか読んでない人が増えるのは当たり前だわな。
アホですか?(悪い意味ではなく)

542 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 14:18:14 ]
それしか読んでない≠それを全てと考える
なはずなのにそれがイコールで結ばれじゃう単細胞が多いってこと

543 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 14:54:56 ]
maximaのコードを高速化したい
compileでcommon lispに変換はできる
それをschemeで動くようにしてstalinで実行が一番高速なんだろうか

544 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 17:39:23 ]
YpsilonとStalinってどっちが速いの?

545 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 17:39:48 ]
stalinに決まってるだろボユゲ

546 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 17:40:58 ]
>>543
生きている間にコンパイル終らないよ



547 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 18:32:53 ]
stalin自身を高速化したいときはどうすんの

548 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 19:22:23 ]
最適化をしないようなオプションを設定する(本末転倒)

549 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 19:22:41 ]
stallinを動かすマシンを高速化する

550 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 21:35:45 ]
Gauche本は参考文献を示していない。

551 名前:デフォルトの名無しさん mailto:sage [2009/06/17(水) 23:27:27 ]
>>550
だから?
別に気にするところじゃないだろ。

552 名前:デフォルトの名無しさん mailto:sage [2009/06/18(木) 09:17:07 ]
君も気にし過ぎでは。

553 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 03:28:11 ]
schemeからcommon lispへのtranslaterはないみたいだけど
逆はあった.

common lispからschemeに乗り換えて見ようかと思うんだけど
大幅に違うのは継続ぐらい?

554 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 03:32:06 ]
practical-scheme.net/wiliki/wiliki.cgi?Scheme:マクロ:CommonLispとの比較:意味論

555 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 06:53:11 ]
>>553
Lisp-1とLisp-2の違いとか、結構色々違いがあると思うけど。

556 名前:デフォルトの名無しさん mailto:sage [2009/06/20(土) 09:16:29 ]
専ブラからだったら「リンクをコピー」でないと
practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%e3%83%9e%e3%82%af%e3%83%ad%3aCommonLisp%e3%81%a8%e3%81%ae%e6%af%94%e8%bc%83%3a%e6%84%8f%e5%91%b3%e8%ab%96



557 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 16:50:46 ]
オレオレlispを作ってみたいのでちょっと質問

schemeでは#fのみが偽だそうですが
Common lisp使いから見たらこれはどうなんでしょうか

なんとなく、#fと()がどちらも偽のほうが使いやすそうには思いますが
問題になるケースがあったりするのでしょうか?

558 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 16:57:35 ]
型チェックを厳しくしたいか、
(not-empty? x)の代わりにxが書ける簡便さを選ぶかの違い。
あなたのセンスで決めてOK

559 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 16:59:08 ]
オレオレlispならいいけど、オラオラschemeを目指す場合、
意味が変わるので既存のschemeのコードがそのまま動かない
問題になるのはそれぐらい
既存のコードがきっちり動くってのはそれだけで楽しいから
昔scheme作った時泣く泣く準拠させたよ
中途半端はよくないと思った

560 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 17:10:24 ]
なるほど。
作りたいのはオラオラschemeに近いので
とりあえず#fのみにしとくのが無難そうですね
ありがとう

561 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 22:19:05 ]
>>559
それschemeじゃなくなっちゃうよ、Schemeみたいな俺Lispだよ

Schemeを名乗るならRnRSに準拠しないと。
Lisp属を名乗るだけならなんでもいいけどさ。

;;;; commonlispを名乗ると完成するまで大変過ぎる


562 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 22:49:08 ]
変なのきた

563 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 22:50:30 ]
SchemeはRnRSにあらず
RnRSからSchemeが生まれたんじゃなくて
RnRSは後からできたわけでしょ?
他人に使わせることや複数人で開発することがあるとすれば
規格準拠にしたほうがいいに決まっているけど

564 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 22:55:20 ]
すみません、質問させてください
木構造のmapのiter版って作れるんでしょうか

なんとかこんなのを書いてみたんですが、flattenされてしまってます
(define (tmap f t)
(define (aux f t r)
(cond ((null? t) r)
((not (pair? t)) (cons (f t) r))
(else (aux f (cdr t) (aux f (car t) r)))))
(reverse (aux f t ())))

(tmap (lambda (x) (* x x)) '((1 2) (3 (4 5))))
;こうなって欲しい
'((1 4) (9 (16 25)))

565 名前:デフォルトの名無しさん mailto:sage [2009/06/21(日) 23:37:10 ]
(define (tmap f t)
(cond
((pair? t)
(if (pair? (car t))
(cons (tmap f (car t)) (tmap f (cdr t)))
(cons (f (car t)) (tmap f (cdr t)))))
(else t)))
こうかな
>(tmap (lambda (x) (* x x)) '((1 2) (3 (4 5))))
=>((1 4) (9 (16 25)))

566 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 00:08:38 ]
lisp/schemeでリファクタリングしてると、時間があっという間に過ぎてしまうんですが、同じ
経験をしている人いますか?



567 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 03:30:41 ]
>>564
(define tmap (lambda (f x) (if (pair? x) (map (cut tmap f <>) x) (f x))))

568 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 06:12:44 ]
>>564
普通に書くと再帰が二カ所あるので、単純な繰り返しにはできない
末尾呼び出し版でよければ、CPSでこんな感じ

(define (tmap f t)
(define (aux t cont)
(cond ((null? t) (cont t))
((not (pair? t)) (cont (f t)))
(else (aux (car t)
(lambda (r1)
(aux (cdr t)
(lambda (r2)
(cont (cons r1 r2)))))))))
(aux t values))

569 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 06:44:58 ]
>>564
(define (tmap f t)
(define (aux f t r s)
(cond
((null? t)
(if (null? s)
(reverse r)
(aux f (caar s) (cons (reverse r) (cdar s)) (cdr s))))
((not (pair? t))
(if (null? s)
(f t)
(aux f (caar s) (cons (f t) (cdar s)) (cdr s))))
(else
(aux f (car t) '() (cons (cons (cdr t) r) s)))))
(aux f t '() '()))

570 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 07:00:57 ]
On Lispに書いてあるみたく継続使ってもいいよね。

571 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 07:21:29 ]
リストの入れ子ならともかく
木構造ならcdrも'()でもpairでもない場合があるだろ。


572 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 07:54:59 ]
二分木ならともかく
木構造なら子が3個以上の場合があるだろ。

573 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 08:23:16 ]
どちらも矛盾しないお

574 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 08:45:26 ]
571は572を包含するが、逆はムリ。
Lispの汎用的な処理で木構造といえば普通は571の方の定義。copy-treeとか。
www.lispworks.com/documentation/HyperSpec/Body/26_glo_t.htm#tree
これはCommon Lispだけど、Schemeがこれに異を唱えるという話も聞かない。

575 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 08:50:36 ]
ただし564はそれを意図したものではないと思われる。

576 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 09:10:45 ]
ローテク版。アルゴリズム的には一番簡単?
(define (tmap func tree)
(cond ((null? tree) '())
((pair? tree) (cons (tmap func (car tree)) (tmap func (cdr tree))))
(else (func tree))))




577 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 09:49:16 ]
この場合はどうする?
(tmap null? '((() 2) (3 (() 5))))
;こうなって欲しい
((#t #f) (#f (#t #f)))

578 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 10:26:36 ]
(branch (leaf 1) (leaf 2))みたいにタグをつけないと
(leaf ())と(branch)の違いが曖昧になるね

579 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 10:36:43 ]
>>576 末尾再帰のものも、最初はそういうのから始めて継続渡しに変換して作る。
練習がてら、やってみたら。
(define (tmap f t)
  (let loop ((t t) (r '()) (s '()))
    (if (pair? t)
        (if (list? (car t))
            (loop (car t) '() (cons (list (cdr t) r) s))
            (loop (cdr t) (cons (f (car t)) r) s))
        (if (null? s)
            (reverse r)
            (let ((st (list-ref (car s) 0)) (sr (list-ref (car s) 1)) (s (cdr s)))
              (loop st (cons (reverse r) sr) s))))))

>>577
carに現れる'()を要素とみるか空ノードとみるかの違い。
上の関数は4行目の list? を pair? にかえるという実にそのものの変更で所望の動作に。

580 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 23:06:49 ]
(quote ())と(#%app)の違い。

581 名前:564 mailto:sage [2009/06/22(月) 23:39:28 ]
みなさん色々ありがとうございました。
>>567はとても短いし
>>568はすごく参考になります
主に>>568を参考に、
>>571>>577のケースも含めて動くものを書いてみました。

(define (tmap f t)
(define (aux t cont)
(cond
((and (pair? t) (null? (car t)))
(aux (cdr t) (lambda (r) (cont (cons (f (car t)) r)))))
((null? t) (cont t))
((not (pair? t)) (cont (f t)))
(else (aux (car t)
(lambda (r1)
(aux (cdr t)
(lambda (r2)
(cont (cons r1 r2)))))))))
(aux t values))

以下のパターンで動きます
(tmap (lambda (x) (* x x)) '((1 2) (3 (4 5))))
(tmap (lambda (x) (* x x)) '((1 . 2) (3 (4 . 5))))
(tmap null? '((() 2) (3 (() 5))))
(tmap (lambda (x) (* x x)) ())

582 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 00:59:09 ]
ドットペアについては方針が分かれるよな
リスト表現としてのツリーを普段どう見てるか
・対応する →初心者
・無視する →中級車
・エラーにする →高級車


583 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 01:43:54 ]
car だけに

584 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 01:46:36 ]
クダーらないギャグを言うなよ。

585 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 01:48:47 ]
てめーもクッダらねーぞ

586 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 01:52:39 ]
こんな時だけ加速するなw



587 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 02:20:07 ]
carだけに

588 名前:デフォルトの名無しさん mailto:sage [2009/06/23(火) 04:51:56 ]
ヌルポ






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

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

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