[表示 : 全て 最新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)

590 名前:576 mailto:sage [2009/06/25(木) 07:06:29 ]
時間ができたので継続渡しの再帰版を書いてみた。
もう>>564氏のカタはついたようだが、すこしだけ短くなった気もするので
エロイ人からの突っ込みを期待して書いておくことにする。

(define (tmap f t)
(define (tmap-cps f t cont)
(cond ((pair? t) (tmap-cps f (car t)
(lambda (x) (cont (cons x (tmap-cps f (cdr t) values))))))
((null? t) '())
(else (cont (f t)))))
(tmap-cps f t values))

591 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 12:17:36 ]
つ ((null? t) (cont t))
tmap-cps自体を関数として使うつもりがあるなら
内部でvaluesを決めうちしちゃだめよ

592 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 13:08:42 ]
>>590
次はクロージャを使わずに継続をスタックで表現してみよう

593 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 13:22:41 ]
>>590
>(cont (cons x (tmap-cps f (cdr t) values)))
部分式の値は一時変数に入れてから使う。
(tmap-cps f (cdr t) (lambda (y) (cont (cons x y))))

本当は
(cdr-cps t (lambda (d) (tmap-cps f d (lambda (y) (cons-cps x y cont)))))
と書きたい。

en.wikipedia.org/wiki/Continuation-passing_style
>The key to CPS is to remember that
>(a) every function takes an extra argument, its continuation, and
>(b) every argument in a function call must be either a variable or a lambda
>expression (not a more complex expression).

594 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 09:08:05 ]
GIMPのscript-fu (基本的にR5RS準拠) では
真偽値 #t, #f とは別に TRUE, FALSE の定数が用意されています。

標準のダイアログで真偽値を受け取ると TRUE, FALSE で受け取ってくるので
条件判定を

(if (= flag TRUE) 処理)

と書かなければいけないのですが、マクロなどを使って

(if flag 処理) と書けるようにするにはどうすれば良いでしょうか?

595 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 10:09:07 ]
>>594
うちのWindows上のGIMP 2.6.6でマクロを評価すると、
Script-Fuコンソール固まるから詳しいことは言えないけど、
hygienicじゃない伝統的なマクロは使えるみたいだから、

(define-macro (dialog-if test then . else)
`(if (= ,test TRUE) ,then ,@else))

みたいなのでいいんじゃないか。

最悪、マクロ使えないなら、他の処理系でS式変換すればいいと思う。

596 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 10:19:17 ]
再帰を全て末尾再帰に変形する手続きとか論文のネタになってそうなものだけど
どなたかご存じない?

597 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 10:22:21 ]
CPS?
foldrとfoldlの双対性?

598 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 11:22:23 ]
>>595
GIMP2.6.5で試したところ期待通りの動作になりました。
ありがとうございます。



599 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:44:46 ]
最近思うこと
schemeはカリー化を言語組み込みでサポートしたほうが
シンプルになるように思うんだけど
今からそんなことをせずともpa$もcutもあるわけで
R6RSはすでに十分実用的になってしまった感がする

R5RSまでのシンプルさのが、良いなぁ

600 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 11:04:33 ]
前にも言ったけどね
R5RSのマクロはcons, quote, quasiquote, mapなど一切使わないで書けるよ
という意味でLisp界にとって危険な存在だからね
黒歴史ということにしたい人もいるだろう

601 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 13:10:18 ]
カリー化って引数の並び順に依存するから
そのままだとあんま便利とは思えない。
名前付きのキーワード引数をサポートして
オプションを固定化するために使えればいいけど。
(define (http cmd host port url auth ... )〜)
(define htttpa (http :host "192.168.10.2" :auth ""))
(httpa :cmd "GET" :port 8080 :url "/")

でも引数全部埋めないと実行できないから不便か


602 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 14:40:01 ]
引数を全部埋めるってのはデフォルト値の提供で解決するが
しかし、どちらにせよ名前付き引数は嫌いだなぁ
5引数あって3引数埋めたら
2引数の:hoge :fugaを埋めたら使えるカリー化関数になるが
これってつまるところ、structuralに型がついた関数なわけで
ちょっと息苦しい

大体、引数が2個か3個の関数は多いし
引数の順番を入れ替えるのは3引数のflipみたいなのを使えばよくね
(map (- 1) '(1 2 3))
(map (flip - 1) '(1 2 3))

603 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 15:53:12 ]
>>602
うん、だからカリー化って意味ねーなと思って
つーかカリー化前提でデフォルト値の提供ってどうすんの?

そもそも引数たくさんあるような関数なら
自力でmake-httpみたいなパラメータ固定化手段を用意するだろうし


604 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 16:00:44 ]
足し算とか、引数の性質が簡単なやつならカリー化もいいけど
引数に値と関数を取るようなやつとか、
関数をいくつも引数にとって関数を返す関数なんかをカリー化したら
保守できなくなりそうだよ

>>599
試しに作って公開してみてよ

605 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 17:09:16 ]
カリー化はS式にターメリックやらスパイスを使えばいいよ

606 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 17:43:41 ]
それ何て

607 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 19:54:04 ]
ここできいて良いかわからないですが
gauche-glをcygwinで動かせた人います?

608 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 20:35:17 ]
やったことないけど出来るはず。
ちなみにMingwでは出来た。



609 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 21:07:16 ]
cygwinで0.8.13では動いたよ
0.8.14ではなんかしらんがコケた

610 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 21:16:31 ]
OpenBSDでguile-1.9.0のビルドがコケるんでソースを追ってみたんですが
guileもboehm-gcを使ってたって知りませんでした
それも5.2とか古いver
よく今まで動いてたなとゾッとしました(メジャープラットフォームでは問題なかろうけど)
Changes in 1.9.0を読んでかなりワクワクしながらビルドしたんですけど
コケるんで萎えて放置中
偶数版リリースまで待ったほうがいいのかなぁ
1.8までのプラットフォームでちゃんと動くようになれば2.0はかなり期待大

611 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 17:15:24 ]
>>608
これを聞いて、mingwのインストールからやってみましたが
私には無理でした。gauche-glのmakeで失敗します
具体的には(home-directory)が#fを返すためにそこでmakeが止まります
gaucheのmingwでのビルドでは全てのテストにパスしていない
(make testは9050/9067 pass)のが原因かもしれません

cygwinは全然だめで
./configure --includedir=ほげ --oldincludedir=ふがを
windowsとcygwinのパス表示で色々試しましたが
GLUT/glut.hどころか、Cのヘッダ(sys/types.h等)も
configureでnoになります。
(gaucheのインストールでは普通にyesになります)
なお、glut自体はcygwin/windowsで動作確認済です

Gauche-boxの存在にその後気づいてインストールしたのですが
バイナリ配布されているgauche-glは
リンク切れになっていました
なんでもいいのでwindows環境でgauche-glが使いたいのですが
バイナリ配布してる箇所って、他にないですかね・・

612 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 17:19:58 ]
ほげとふがをわはとむすにすればうまくいくかもしれない。わけない。

613 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 19:42:22 ]
>>611
saito.s4.xrea.com/?Gauche

614 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 20:26:25 ]
>>613はリンク切れ

615 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 21:05:08 ]
>>614
悪い
今再Up中だからちょっとまってくれや

616 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 21:08:26 ]
>>614
準備出来たでー

617 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 21:14:09 ]
>>613
どうやってビルドしているんだろうか。詳しい手順が知りたい。


618 名前:611 mailto:sage [2009/06/28(日) 21:39:27 ]
>>616
再アプ乙です!!
今、gauche-glの動作を確認しました
これで思う存分図形言語で遊べる、ありがとう



619 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 01:04:48 ]
>>617
忘れた。
でも、ひっかかったのはしょーもないことばっかりだった気がする。
ひっかかったところをそのつど修正すればだいたいいけるよ。
もしかしたら Gauche 自体もちょっとは弄ったかもしんない。

620 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 01:16:01 ]
>>618
Cygwin でなくてよかったんかい?
Mingw でビルドした Gauche はいくつかの機能が使えないよ。
重大なのはプロセスとスレッド関連くらいだけど。

621 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 14:53:46 ]
問題ない
窓使いでcygwin版を使いたがる人は少ないはず

622 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 14:37:48 ]
schemeをさらにシンプルにしようと思って
こんなのを考えてみたんだけどどう思う?
consセルだけのほうが
()について非対称なリストよりもシンプル

;consセル版fold
(define (cfold f a b)
(cond ((not (pair? b)) (f a b))
(else (cfold f (f a (car b)) (cdr b)))))
(define (cfold1 f lst) (cfold f (car lst) (cdr lst)))

;reverseがリストよりもシンプルで効率的に(appendなしで)書ける
(cfold1 (lambda (x y) (cons y x)) '(1 2 . 3))

;このままだと、「空」が表現できないので
;consを仮にこんな風に定義してみる

;()なら無視するcons
(define (conss x y)
(cond ((null? x) y)
((null? y) x) ;片側だけのほうがよいか?
(else (cons x y))))

;末尾に()がないと思っても良い
(cfold (lambda (x y) (conss y x)) () '(1 2 . 3)) ;←これを言語レベルで'(1 2 3)と表記
(cfold (lambda (x y) (conss y x)) () '(1 2 3))

623 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 14:41:18 ]
「リストを末尾の要素に持つリスト」はどう表現するの、それ。

624 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 14:49:58 ]
普通に'(1 2 (1 2))という感じです
(cfold (lambda (x y) (conss y x)) () '(1 2 (1 . 2)))
(cfold (lambda (x y) (conss y x)) () '(1 2 (1 2)))

ただ、空リストからなるリストは表現できないので
これは不備だなぁ
conssを片側だけにしてもreverseは動かないし

625 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 15:01:49 ]
ああ、言ってる意味がわかった
(cdr '((1 2)))が()だから今動いてるけど
そうじゃなかったら動かないですね
そういう意味ではリストの末尾は必ずatomじゃないとダメになるから
これじゃダメだ

626 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 21:12:08 ]
ボクの考えた最強のLISP(Scheme)!
ってネタは尽きないよな
気持ちは判るが、妄想垂れ流す前に一度それで組んでみろよ
>>622みたいなのはすぐ作って確認できるだろ
どう思う?って、俺はまたキチガイかと思ったよ

627 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 21:46:01 ]
>>626
作らない奴はクソだ,と思っているんだろうけど,
設計は設計で,そっちも大事だと思うぞ。
全部作ってみろで返すのはひどい。

628 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 21:57:45 ]
そういうネタだらけでスレが埋まってしまうのは困るけど
閑散としている時のネタとしてはアリじゃないかな



629 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 00:05:48 ]
S式を2分木として見ればどうやっても歪に見える

ドットペアを含むリスト(1 2 . 3)は
 /\
1  /\
  2   3

リスト(1 2 3)は
 /\
1  /\
  2  /\
    3   nil

主観ではcdrがconsかnilに統一されてる後者の方がシンプルだと思う
前者はcdrがatomという可能性をいつも意識するからハゲそう


630 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 02:24:46 ]
竹内先生の入門本が増補改訂版で出るらしいんだが、
Schemeなのかな。CLなのかな。

631 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 09:28:58 ]
ICFPのプログラミングコンテスト、Steele兄貴の招待講演が
Organizing Functional Code for Parallel Execution: or, foldl and foldr Considered Slightly Harmful
ってなってるが、foldは悪なのだろうか
内容が気になるな

632 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 09:51:32 ]
foldじゃなくてl or rだよ。
シーケンシャルなのを問題にしてるんでしょ。

>>630
これかな?
www.amazon.co.jp/初めての人のためのLISP-ソフトウェアライブラリ-3-竹内-郁雄/dp/4781904548
特定の言語を対象としている本じゃないよ。このスレのように。
トピックスが増えるんじゃないのかな。

633 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 10:04:34 ]
演算がmonoidalならfoldも並列化できる

(x + y) + z = x + (y + z) { associative }
x + e = e + x { unit }

x + (y + (z + e)) = (x + y) + (z + e)
(((e + x) + y ) + w) = (e + x) + (y + w)
ちなみにこれはfoldlからfoldrへの相互書き換えが可能になる条件でもある

多分この辺がslightlyに留まる理由で、
結論としてmonad最高!!ってな流れになったりならなかったりという予想

634 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 10:26:36 ]
>>632
HMVはお取り寄せ可能になってる。
www.hmv.co.jp/product/detail/3608319
発行年月 : 2009年06月
出版社 : 翔泳社

seshop.com/には載ってないが


635 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 12:14:49 ]
予約受付中?
www.bk1.jp/product/03125439

636 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 16:08:20 ]
>>633
wじゃなくてz使ってよ、気色悪いw

637 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 18:41:29 ]
うはxxxxxxxxxおkxxxxxxxxxxxxxxxx

638 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 18:59:01 ]
>>634
書店の人が出版社に確認してくれた。当初予定より遅れて
平成21年12月2日だそうだ。楽しみだね。



639 名前:デフォルトの名無しさん mailto:sage [2009/07/02(木) 23:15:22 ]
>>638
\(^o^)/

640 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 00:05:29 ]
入門Gaucheで勉強してるけどp64から急に難しくなってきたぜでもがんばるぜ

641 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 00:07:24 ]
LittleSchemer読もうぜ

642 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 00:21:15 ]
>>641
ありがとうだぜさっそくポチるぜ。

643 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 02:43:14 ]
竹内センセの本が出るのか。それは全力で買いだ。

644 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 04:18:45 ]
一冊あれば十分だけどなw

645 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 04:55:07 ]
増補で付録とか付くんかな?
竹内先生の本は持ってるけど、記念で買おう。

646 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 05:50:44 ]
lisp本、wktkしてきたぜ。

647 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 06:20:20 ]
初めての人向けじゃなくって
もっと突っ込んだの書いて欲しいな


648 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 06:34:49 ]
竹内先生監修シリーズって感じで、5人ぐらいに書かせればいいんじゃねえ?



649 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 09:42:11 ]
Lispじゃないけどそういう感じの本あったよね。
意外と面白くなかったw
それより雑誌bitのTAOの連載を合本したら面白いのに。


650 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 10:45:35 ]
今思えば、ビューティフルコードは初心者に媚びない所だけはよかった
日本であれぐらい書ければ、もっちーがファビョることもなかっただろうに

651 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 18:26:23 ]
>>647
あの本は初心者向けの本じゃないよ。
Lispマニア向けの本だ。初心者が読んでもそれなりに楽しめるけど。

652 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 18:29:18 ]
LISPの本と思わずに、T先生と生徒のかけあいを楽しめばいいんだ。

653 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 20:12:01 ]
初心者向けと書かれるとおれそんなんじゃないし読むことないや
と結局買っても積んだままにしてしまう
お決まりの言語のおさらいを数章割かれてるのを見ると頭に来るからだ
いっそのこと超上級者向けのが興味をそそられる

654 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 20:24:17 ]
>>653
SICP も初心者向だよwW


655 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 21:51:02 ]
だから1章で飽きて放り投げちゃったんだよ。

656 名前:デフォルトの名無しさん mailto:sage [2009/07/03(金) 22:05:20 ]
目次みて1章はつまんなそうだと思ったら3章あたりから読み始めればよかったのに。

657 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 00:37:31 ]
良い本は、
例え初心者向けと銘打たれていても、
光る記述で満ち溢れており、
熟練者でも楽しめるものなのだ。
だからグルの書いた本は面白いのだ。

658 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 01:45:12 ]
苫米地先生の事ですね。わかります。



659 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 01:54:17 ]
>>658
ビビッタ。
実は、最近なぜか洗脳について勉強していたりする。関係あるの?

660 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 02:01:58 ]
Lisperじゃん。

661 名前:デフォルトの名無しさん [2009/07/04(土) 02:02:46 ]
とまちゃんだけはガチ

662 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 02:04:31 ]
sage忘れたすまぬ

663 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 03:21:58 ]
竹内本は目次の時点で駄目だな

664 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 03:34:00 ]
無縁の衆生ですな。

665 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 05:49:37 ]
>>655
もったいないお化けが出るぞ

666 名前:デフォルトの名無しさん mailto:sage [2009/07/04(土) 19:46:29 ]
The Little Schemer買ったお。たくさん勉強するお。

667 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 10:42:05 ]
shibuya.lispどうだった、行った人?

668 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 12:41:05 ]
>>667
面白かったよ。#4あるならLTしようと思ったくらいには(TTはなんいどたかい)。



669 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 12:47:18 ]
すみません、以下のプログラム想定外なことだらけなのですが
以下のs1で、値が変更出来るようなプログラムは書けますか?
schemeは値渡しなので無理なような気もしますが
また、test関数では内部でtをset!しているにもかかわらず
その変更は影響がないように見えますが何故なのでしょうか

(define (s1 t v) (set! t v))
(define (sa t v) (set-car! t v))
(define (sd t v) (set-cdr! t v))
(define (sa2 t v) (let ((r (cdr t))) (set-car! r v)))

(define (test f)
(define t '(()()))
(let ((r (f t 1)))
(print t)
(set! t '(()()))
r))

(test s1)
(test sa)
(test s1) ;why?
(test sd)
(test sa2)
;(map test (list s1 sa sd sa2))

670 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 13:11:03 ]
引数のバインディング変えても外からは見えないだろ。

int f(int x) {
x = 10;
}
やってるのはこれと同じ

671 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 13:17:32 ]
>>669
set! は変数とオブジェクトの結び付き (束縛) を付け替えるオペレータ。
set-car! や set-cdr! はオブジェクト (consセル) の中身を変更するオペレータ。
ってことを念頭に置いて考えるとわかりやすいかも。
あまりに根本的すぎることなのでそこを理解できてないようだとちょっと説明しづらい。

672 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 13:26:06 ]
> また、test関数では内部でtをset!しているにもかかわらず
> その変更は影響がないように見えますが何故なのでしょうか

処理系がわからんから何とも言えんが、
おそらくその処理系は、クォートされたリストをすべての関数呼び出しで共有するように作られているんだと思う。

test 内の (define t '(()())) のところでは、
すべての関数呼び出しで共有される '(()()) というリストを t に束縛する、みたいな処理が行われる。
そこで、(test sa) を実行してしまうと、そのリストが '(1 ()) に書き換えられてしまう。
そのため、次回以降の test の呼び出しでは、'(1 ()) というリストが t に束縛されてしまう。

そもそも scheme では、クォートされたリストに set-car!、set-cdr! しちゃいけないことになってるので、
こんな処理をすること自体が間違い。
やるんだったら、毎回リストを生成するようにする。

(define t (list '() '())

673 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 13:55:51 ]
問題をきちんと理解してから解答を考えよう
って約束したじゃないですかー

674 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 14:02:00 ]
>>672
> 処理系がわからんから何とも言えんが、

むしろ何も言うな

675 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 14:29:33 ]
おまえがな。

676 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 15:05:14 ]
shibuya.lispの参加者、もっと感想・ネタを書いてくれ。
悪口・不満的な話は、直接、主催者にメールでもしてくれ。

677 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 15:24:01 ]
いずれ上がるだろう動画を楽しみに待つ

678 名前:デフォルトの名無しさん [2009/07/05(日) 15:48:43 ]
www.nicovideo.jp/mylist/13373941



679 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 15:53:09 ]
ニコに挙げたのか
つべで探してたわ

680 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 15:53:51 ]
感謝。既に上がってるのは想定外だった

681 名前:デフォルトの名無しさん [2009/07/05(日) 15:54:39 ]
つべはこっち。
www.youtube.com/view_play_list?p=C7D5490AD455E464


682 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:24:59 ]
>>670-672
ありがとうございます

>>671
関数の引数はjavaのように、
実体を指すポインタのコピーが渡ると考えれば良いですよね
set!だとコピーしたポインタ自体を変更しても元データには全く影響がないが
set-car!だと、コピーしたポインタの指す先を変更するので
引数にset-car!しても破壊的変更が可能

だとすれば、参照渡しで実現出来る
関数の実引数の実体を直接書き換えるような
関数の作成は不可能ですね

>>672
>そもそも scheme では、クォートされたリストに set-car!、set-cdr! しちゃいけない
これは初めて知りました。これが原因ですね
コードはGaucheとGuileで試したのですが
どちらもクォートされたリストは共有されるような実装ってことですね

683 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:31:28 ]
>>682
> クォートされたリストは共有されるような実装ってことですね

確か Gauche の場合は REPL が起動してるときは共有されないはず。
だからといってそれを期待しちゃだめなんだけど。

Gauche のマニュアルから引用 ↓

注: R5RSは、リテラル式の値を変更するのはエラーであるとしています。
しかしGaucheはペアとベクタについてはそれが定数であるかどうかをチェックしておらず、
set-car!やvector-set!等の破壊的手続きによってそれらの値を変更してもエラーは報告されません。
そうした場合の動作は不定です。

684 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:45:19 ]
参照渡しって何か
ダイナミックスコープっぽいような気がするけど
この二つは何か関係あるのかな?

685 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:48:13 ]
>>684
関係ない。

686 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:49:34 ]
全く関係ない。
参照渡しは仮引数/実引数バインディングスタイルの一つ
ダイナミックスコープは自由変数のルックアップスタイルの一つ

687 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:52:02 ]
そんなめんどうな話なのか?
局所変数と大域変数の話なのでは。
湯浅先生の「Scheme入門」だとP32〜。

688 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:58:16 ]
koguro さんのトークは資料が見やすくていいなー



689 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 19:13:16 ]
いちいちそんな糞本挙げなくていいよ

690 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 19:19:18 ]
湯浅先生を糞呼ばわりできるお前って何様?






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

前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