Lisp Scheme Part27
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/07/27(月) 10:15:31■過去スレ
Part26: ttp://pc12.2ch.net/test/read.cgi/tech/1240567959/
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)
0052デフォルトの名無しさん
2009/07/29(水) 19:35:51(define (pa$ fn . args) (lambda more-args (apply fn (append args more-args))))
0053デフォルトの名無しさん
2009/07/29(水) 20:28:19部分適用といって、手続きの引数の一部を固定した新たな引数を返す手続き。
例えば、
((pa$ + 3) 2) ⇒ 5
みたいな。SRFI-26のcutと似たようなもの。cutなら、
((cut + 3 <>) 2) ⇒ 5
こんな感じ。
0054デフォルトの名無しさん
2009/07/29(水) 20:33:400055デフォルトの名無しさん
2009/07/29(水) 21:11:30最初に書いたのは無駄だらけだった(笑)。
(define (power-set ls)
(if (null? ls)
'(())
(let ((subset (power-set (cdr ls))))
(append subset
(map (lambda (x) (cons (car ls) x)) subset)))))
0056デフォルトの名無しさん
2009/07/29(水) 22:22:39おっと失礼。マクロじゃなきゃダメですね。
(defmacro foo (ls n) `(if (= ,n 0) (pop ,ls) (pop (cdr (nthcdr (- ,n 1) ,ls))) ))
0057デフォルトの名無しさん
2009/07/29(水) 23:07:40mzscheme なら curry
ちなみに >>52 の pa$ は片方が空リストになる時にエラーになった
0058デフォルトの名無しさん
2009/07/30(木) 00:37:16curryingのことだったのか。名前の由来には何か歴史的な事情でもある?
0059デフォルトの名無しさん
2009/07/30(木) 02:25:44こんなのは無駄に問題を難しくしてるだけ
(+ 3 2)
これでいいじゃないか
(pa$ + 3) は何を返す?
手続きを作ったところでそれを保存したり表示したりできるわけでもないし
無駄なことをするな
0060デフォルトの名無しさん
2009/07/30(木) 03:20:20歴史的経緯は知らないけれど、部分適用をあらわすのに$を使うのはgaucheの命名規約。
http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a!%E3%81%A8%3f#H-yofpb1
個人的には、curry って名前なら(lambda (x y z) ...) を
(lambda (x) (lambda (y) (lambda (z) ...)))ってしてくれるんじゃないと違和感があるなあ。
可変長引数で困るけど。
>>59
そりゃ実用上はpa$をそんな使い方する人いないでしょ。
0061デフォルトの名無しさん
2009/07/30(木) 07:46:09作った手続きを束縛して再利用するに決まってんじゃん。
もしかして、複数の引数を持つ手続きを呼ぶ際には、
毎回必ず全ての引数の値が異なるようになる呪いを掛けられてる人ですか?
というか、クロージャがファーストクラスな言語でそういう事を言うのが信じられない。
0062デフォルトの名無しさん
2009/07/30(木) 08:07:48partial apply で $ をつけるのは Haskell の $ 演算子由来だそうな
ttp://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%e5%88%9d%e5%bf%83%e8%80%85%e3%81%ae%e8%b3%aa%e5%95%8f%e7%ae%b1%3alog00#H-1bifybk
0063デフォルトの名無しさん
2009/07/30(木) 09:17:140064デフォルトの名無しさん
2009/07/30(木) 09:37:190065デフォルトの名無しさん
2009/07/30(木) 10:08:48(bind (+ 100 $1)) とか (bind (+ 200 . $rest)) とか書けないかな。
直観的になって嬉しいと思うんだけど。
0066デフォルトの名無しさん
2009/07/30(木) 12:44:20前以って arity がわかってるんなら syntax-case で
http://codepad.org/29239gmR
みたいな感じとか。
(bind 1 (+ 100 $1))
みたいに使う。後者の例はどうするのがいいんだろ。
0067デフォルトの名無しさん
2009/07/30(木) 12:57:170068デフォルトの名無しさん
2009/07/30(木) 13:00:09(^(x) (+ 100 x))
0069デフォルトの名無しさん
2009/07/30(木) 13:00:55後者は構文として正しくない
0070デフォルトの名無しさん
2009/07/30(木) 13:06:38@restとすると展開
$restとすると単値(リスト)
がいいかも
((bind (+ 200 @rest)) 300 400) ; ==> 900
((bind (cons 200 $rest)) 300 400) ; ==> (200 300 400)
0071デフォルトの名無しさん
2009/07/30(木) 14:04:09LOL の 5.2 節を参考にしてみたんだけどダサいかな。
マクロ引数を flatten してごにょごにょすればそういうのもできるよ
0072デフォルトの名無しさん
2009/07/30(木) 15:20:22srfi-26 の議論の中で引数の番号つきの部分適用の話が出たことはあるそうだ。
http://srfi.schemers.org/srfi-26/mail-archive/msg00018.html
>>66-67
最も大きい番号を arity とみなす実装。
http://d.hatena.ne.jp/SaitoAtsushi/20080811/1218380989
確かにどこから rest 引数にすりゃいいのか決められないな。
0073デフォルトの名無しさん
2009/07/30(木) 15:33:03単純に最も大きい番号の数より多い引数が rest になるんじゃまずいのかな。
式の中で $1, $2, $3, $rest が使われていたら
(lambda ($1 $2 $3 . $rest) ...) になるみたいな。
0074デフォルトの名無しさん
2009/07/30(木) 15:55:35ありがとうございます。
こういう時にマクロを使うんですね。勉強になります。
0075デフォルトの名無しさん
2009/07/30(木) 16:04:53(define-macro (bind2 . body) `(lambda ($2 . $rest) (lambda ($1) ,@body)))
0076デフォルトの名無しさん
2009/07/30(木) 18:59:240077デフォルトの名無しさん
2009/07/30(木) 19:06:060078デフォルトの名無しさん
2009/07/30(木) 20:12:500079デフォルトの名無しさん
2009/07/30(木) 20:14:170080デフォルトの名無しさん
2009/07/30(木) 20:28:490081デフォルトの名無しさん
2009/07/30(木) 20:32:380082デフォルトの名無しさん
2009/07/30(木) 22:19:40どんな時に使うの?
0083デフォルトの名無しさん
2009/07/30(木) 22:42:53プレースホルダー。
使わない引数とかを表現するのに使う作法。
(define (const a) (lambda _ a)) とか。
0084デフォルトの名無しさん
2009/07/30(木) 22:42:59透明あぼーんと同じ
0085デフォルトの名無しさん
2009/07/30(木) 22:53:15いつもdummy、みたいな変数名を付けてた
0086デフォルトの名無しさん
2009/07/30(木) 22:55:17あくまで作法。
0087デフォルトの名無しさん
2009/07/30(木) 22:59:04まあフロー解析すりゃいいけど
0088デフォルトの名無しさん
2009/07/30(木) 23:00:470089デフォルトの名無しさん
2009/07/30(木) 23:04:28みなさんありがとうございます.
0090デフォルトの名無しさん
2009/07/30(木) 23:14:280091デフォルトの名無しさん
2009/07/30(木) 23:23:040092デフォルトの名無しさん
2009/07/31(金) 17:54:45R6RS のマクロパターンではワイルドカード
それ以外の場所ではただのシンボル
0093デフォルトの名無しさん
2009/07/31(金) 20:57:590094デフォルトの名無しさん
2009/08/01(土) 05:00:54and-let*で _ 使いたくなる時ってある?
単に条件判断のみやりたい時は変数書かなくてもいいわけだし。
0095デフォルトの名無しさん
2009/08/01(土) 10:21:04Lisperの皆様から見てどんな感想でしょうか。
どうもマクロというと難しいという印象強いので、翻訳以前から本は知ってましたけど
読むのは気が引けてました。
また、翻訳レベルはどうでしょうか?Amazonの立ち読み見た限りではかなり良い
翻訳に感じました。
0096デフォルトの名無しさん
2009/08/01(土) 12:34:57単に趣味の問題です:-)
変数だけ書いたり式だけ書いたりするのはバランスが悪く感じるので
'_を使っているんです
Cなんかで変数宣言&初期化する時に=を揃えるような感覚です
int hoge = 10;
int foo = 30;
0097デフォルトの名無しさん
2009/08/01(土) 12:36:090098デフォルトの名無しさん
2009/08/01(土) 12:45:30という話を思い出した。
x = 123;
y = 054;
0099デフォルトの名無しさん
2009/08/01(土) 22:40:23LispマシンっていうのはPC98がBASICだったみたいに
LISPを基本的に動作するパソコンんの事でしょうか?
0100デフォルトの名無しさん
2009/08/01(土) 22:44:520101デフォルトの名無しさん
2009/08/01(土) 22:47:040102デフォルトの名無しさん
2009/08/01(土) 22:49:030103デフォルトの名無しさん
2009/08/01(土) 22:53:07終盤の一部のPC98を除いてROMに最初からBASICインタプリタが塔載されていたことを思うと、
確かにBASICを基本としていたのかもしれないとは思うが、
ハードウェアの構造がBASICに特に有利ということはない。
実際、他の言語の方が効率的に使えた。
一般にLispマシンってのはLispを主要な言語とするだけでなくて、
CPU のインストラクションのレベルから設計時に Lisp を前提とし、
Lisp のために最適化されているようなマシンだと思う。
0104デフォルトの名無しさん
2009/08/01(土) 23:05:310105デフォルトの名無しさん
2009/08/01(土) 23:42:140106デフォルトの名無しさん
2009/08/02(日) 01:20:220107デフォルトの名無しさん
2009/08/02(日) 07:12:030108デフォルトの名無しさん
2009/08/02(日) 10:03:150109デフォルトの名無しさん
2009/08/02(日) 10:05:110110デフォルトの名無しさん
2009/08/02(日) 11:48:22(define (copy ls)
(if (atom? ls)
ls
(cons (copy (car ls))
(copy (cdr ls)))))
(define (atom? x)
(not (pair? x)))
0111デフォルトの名無しさん
2009/08/02(日) 12:03:100112デフォルトの名無しさん
2009/08/02(日) 13:05:54で良い。
0113デフォルトの名無しさん
2009/08/02(日) 14:02:53ウィキペディアに項目あり
0114デフォルトの名無しさん
2009/08/02(日) 19:41:25あ、いや、リストですから。
>>112
なるほど、そうなんですね。
因みにコードは復刊する竹内先生の本にあったものを拝借。
0115デフォルトの名無しさん
2009/08/02(日) 21:24:330116デフォルトの名無しさん
2009/08/02(日) 23:17:07お前はドッペルゲンガーだろ?って (double? ls) => #t #f
0117デフォルトの名無しさん
2009/08/02(日) 23:31:390118デフォルトの名無しさん
2009/08/02(日) 23:31:570119デフォルトの名無しさん
2009/08/03(月) 02:41:23比較じゃなくて、「同じものが存在するか」を調べたいってこと?
Scheme 的には出来ない。
コピーしたときにオブジェクトに何らかのマークをつけるような
データ構造を作ってなんとかするというのが妥当かな。
あんまり知らんけど Ruby には汚染フラグってあったよな?
あんな感じで。
で、なんでそんなことをしたいのやぅぃ?
0120デフォルトの名無しさん
2009/08/03(月) 02:45:390121デフォルトの名無しさん
2009/08/03(月) 02:47:060122デフォルトの名無しさん
2009/08/03(月) 05:05:49より。
(eq? (list ’a) (list ’a)) ⇒ #f
(let ((x ’(a))) (eq? x x)) ⇒ #t
0123116
2009/08/03(月) 08:53:06eq?の動作を誤解してました。
0124デフォルトの名無しさん
2009/08/03(月) 16:23:20名前が長くなるほど、同値性の判断は柔らかくなるよん。
名前が短くなるほ(ry
0125デフォルトの名無しさん
2009/08/03(月) 17:11:16時に使える>eq?
非破壊という前提ならほとんどの処理に当てはまる
0126デフォルトの名無しさん
2009/08/03(月) 17:47:44(define (my-equal? ls1 ls2)
(if (not (pair? ls1))
(eq? ls1 ls2)
(and (my-equal? (car ls1) (car ls2))
(my-equal? (cdr ls2) (cdr ls2)))))
ところでconsはeq?と並んで基本関数だと本にあったはず。
でも、SICPでconsも定義されていたような覚えがあるんだけど。
consも作れる?
0127デフォルトの名無しさん
2009/08/03(月) 17:51:360128デフォルトの名無しさん
2009/08/03(月) 18:16:04(define ((cons a b)p)(p a b))
(define (car p)(p (lambda(a b)a)))
(define (car p)(p (lambda(a b)b)))
0129デフォルトの名無しさん
2009/08/03(月) 18:24:12それそれ。中西先生の本にあった基本5関数の話が崩壊してしまった
気分になるんですよ。
0130デフォルトの名無しさん
2009/08/03(月) 18:24:520131デフォルトの名無しさん
2009/08/03(月) 18:56:050132デフォルトの名無しさん
2009/08/03(月) 18:59:25ちなみに「印字する関数」だけじゃ済まなくなるぞ
0133デフォルトの名無しさん
2009/08/03(月) 20:29:06QUOTE LAMBDA IF (COND)といった特別式は別に必要なんじゃないかな
5関数とリスト構造だけでチューリング完全なら教えてほしい
自分はかなり考えたけど無理だった
(もっともLAMBDAがあれば基本5関数もIFもいらなくなるけど。QUOTEはいるかな)
0134デフォルトの名無しさん
2009/08/03(月) 20:39:370135デフォルトの名無しさん
2009/08/03(月) 20:52:44マッカーシー先生のLispの最初の論文にはcondが使われているし
基本関数とは別物では?
[ → ; → ; → ]
0136デフォルトの名無しさん
2009/08/03(月) 21:37:05http://www-formal.stanford.edu/jmc/recursive/node3.html
0137デフォルトの名無しさん
2009/08/03(月) 21:48:37wikiを始め基本5関数"のみ"でチューリング完全と言及されているものも多いんだけど
λ計算を初めて知った時、それだけでチューリング完全になるなんて思いもつかなかった自分には
基本5関数"のみ"ではチューリング完全ではないとは断定できなくて…
チャーチ数とかYコンビネータとか思いつくような人ならアレだけでチューリング完全に仕立て上げられちゃうんじゃないかとも思ったもんで
0138デフォルトの名無しさん
2009/08/03(月) 22:22:44そこに合成・再帰の操作を許して得られる関数のクラスがチューリング完全、
という言い方になるんだろうね
0139デフォルトの名無しさん
2009/08/03(月) 22:40:47結局、基本5関数はチューリング完全なλ算法系の上で"Lisp"を構築するプリミティブにすぎないって話になっちゃうんじゃないかな
基本5関数とチューリング完全性は無関係ってことに
0140デフォルトの名無しさん
2009/08/03(月) 22:46:350141デフォルトの名無しさん
2009/08/03(月) 22:58:080142デフォルトの名無しさん
2009/08/03(月) 23:02:44「リスト」が曲者かと
0143デフォルトの名無しさん
2009/08/03(月) 23:06:440144デフォルトの名無しさん
2009/08/03(月) 23:13:020145デフォルトの名無しさん
2009/08/03(月) 23:18:370146デフォルトの名無しさん
2009/08/03(月) 23:27:35マクロの束縛にはdefine-syntaxを,と使い分けるのはなぜ
なんでしょう? たとえば,どちらもdefineでできたとしたら
不都合が起きるような場合はありますか? Common Lispが
手続きとそれ以外の値とを別々のスコープで扱うように,
Schemeではマクロとそれ以外の値とを別々のスコープで扱う
ということ?何を意図しての仕様かがもうひとつわかりません
0147デフォルトの名無しさん
2009/08/04(火) 00:11:210148厨房
2009/08/04(火) 00:56:52勉強がんばるっす!!
0149デフォルトの名無しさん
2009/08/04(火) 01:04:250150デフォルトの名無しさん
2009/08/04(火) 01:05:36実装を意図しての仕様ですが何か?
0151デフォルトの名無しさん
2009/08/04(火) 01:09:20厨房には早過ぎるだろ・・・
■ このスレッドは過去ログ倉庫に格納されています