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

Lisp Scheme Part27

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/07/27(月) 10:15:31
※ ここはCommon Lisp、SchemeをはじめとするLisp族全般のスレです ※

■過去スレ
 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)
0083デフォルトの名無しさん2009/07/30(木) 22:42:53
>>82
プレースホルダー。
使わない引数とかを表現するのに使う作法。
(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
prologではそれで最適化とかなかったっけ
まあフロー解析すりゃいいけど
0088デフォルトの名無しさん2009/07/30(木) 23:00:47
ああ、CLやschemeは_も変数として定義出来るのを忘れてたよ
0089デフォルトの名無しさん2009/07/30(木) 23:04:28
82です.分かりました.
みなさんありがとうございます.
0090デフォルトの名無しさん2009/07/30(木) 23:14:28
Erlang だと _X みたいな変数は自動で CL で言うところの ignore 扱いになるね
0091デフォルトの名無しさん2009/07/30(木) 23:23:04
haskell でも言語仕様でプレースホルダーとしての意味を規定してたはず。
0092デフォルトの名無しさん2009/07/31(金) 17:54:45
>>82
R6RS のマクロパターンではワイルドカード
それ以外の場所ではただのシンボル
0093デフォルトの名無しさん2009/07/31(金) 20:57:59
自分はand-let*の中でよく使いますね < '_
0094デフォルトの名無しさん2009/08/01(土) 05:00:54
>>93
and-let*で _ 使いたくなる時ってある?
単に条件判断のみやりたい時は変数書かなくてもいいわけだし。
0095デフォルトの名無しさん2009/08/01(土) 10:21:04
SICP昔読んだ程度の初心者なのですが、最近翻訳された「Let Over Lambda」は
Lisperの皆様から見てどんな感想でしょうか。

どうもマクロというと難しいという印象強いので、翻訳以前から本は知ってましたけど
読むのは気が引けてました。

また、翻訳レベルはどうでしょうか?Amazonの立ち読み見た限りではかなり良い
翻訳に感じました。
0096デフォルトの名無しさん2009/08/01(土) 12:34:57
>>94
単に趣味の問題です:-)
変数だけ書いたり式だけ書いたりするのはバランスが悪く感じるので
'_を使っているんです
Cなんかで変数宣言&初期化する時に=を揃えるような感覚です
int hoge = 10;
int foo  = 30;
0097デフォルトの名無しさん2009/08/01(土) 12:36:09
揃わなかった:-(
0098デフォルトの名無しさん2009/08/01(土) 12:45:30
Cの代入で桁をきれいに揃えようとして0で埋めたら8進になっちゃった
という話を思い出した。

x = 123;
y = 054;
0099デフォルトの名無しさん2009/08/01(土) 22:40:23
すみません、どこで質問していいのか分からなかったので教えてください
LispマシンっていうのはPC98がBASICだったみたいに
LISPを基本的に動作するパソコンんの事でしょうか?
0100デフォルトの名無しさん2009/08/01(土) 22:44:52
まずはPC98が何だったか調べる作業から始めろ
0101デフォルトの名無しさん2009/08/01(土) 22:47:04
てにをはがおかしい
0102デフォルトの名無しさん2009/08/01(土) 22:49:03
いや、てにをはを直したとしても、繕い切れない何かがある
0103デフォルトの名無しさん2009/08/01(土) 22:53:07
>>99
終盤の一部のPC98を除いてROMに最初からBASICインタプリタが塔載されていたことを思うと、
確かにBASICを基本としていたのかもしれないとは思うが、
ハードウェアの構造がBASICに特に有利ということはない。
実際、他の言語の方が効率的に使えた。

一般にLispマシンってのはLispを主要な言語とするだけでなくて、
CPU のインストラクションのレベルから設計時に Lisp を前提とし、
Lisp のために最適化されているようなマシンだと思う。
0104デフォルトの名無しさん2009/08/01(土) 23:05:31
ELIS/TAOってどこかで動いているんかな?
0105デフォルトの名無しさん2009/08/01(土) 23:42:14
シュレディンガーの猫みたいな問いだな
0106デフォルトの名無しさん2009/08/02(日) 01:20:22
俺の横で寝てるよ
0107デフォルトの名無しさん2009/08/02(日) 07:12:03
猫が?竹内先生が?
0108デフォルトの名無しさん2009/08/02(日) 10:03:15
俺が
0109デフォルトの名無しさん2009/08/02(日) 10:05:11
せつこ! それシュレディンガーやない、ドッペルゲンガーや!
0110デフォルトの名無しさん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:10
ベクタを忘れてる
0112デフォルトの名無しさん2009/08/02(日) 13:05:54
(define (copy . ls) ls)
で良い。
0113デフォルトの名無しさん2009/08/02(日) 14:02:53
>>99
ウィキペディアに項目あり
0114デフォルトの名無しさん2009/08/02(日) 19:41:25
>>>111
あ、いや、リストですから。

>>112
なるほど、そうなんですね。

因みにコードは復刊する竹内先生の本にあったものを拝借。
0115デフォルトの名無しさん2009/08/02(日) 21:24:33
ディープコピーwするなら110しないとだめだよ
0116デフォルトの名無しさん2009/08/02(日) 23:17:07
copyされたものかどうかを見抜くことってできないですか?

お前はドッペルゲンガーだろ?って (double? ls) => #t #f
0117デフォルトの名無しさん2009/08/02(日) 23:31:39
eq?で十分だけど?
0118デフォルトの名無しさん2009/08/02(日) 23:31:57
見抜くことが出来たらコピーではないとおもう
0119デフォルトの名無しさん2009/08/03(月) 02:41:23
>>116-117
比較じゃなくて、「同じものが存在するか」を調べたいってこと?
Scheme 的には出来ない。
コピーしたときにオブジェクトに何らかのマークをつけるような
データ構造を作ってなんとかするというのが妥当かな。
あんまり知らんけど Ruby には汚染フラグってあったよな?
あんな感じで。
で、なんでそんなことをしたいのやぅぃ?
0120デフォルトの名無しさん2009/08/03(月) 02:45:39
set-car!set-cdr!を禁止すればeq?でいいんだけど?
0121デフォルトの名無しさん2009/08/03(月) 02:47:06
いやいやルートから比較するならやっぱりeq?で十分だけど?
0122デフォルトの名無しさん2009/08/03(月) 05:05:49
http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_idx_434
より。
(eq? (list ’a) (list ’a)) ⇒ #f
(let ((x ’(a))) (eq? x x)) ⇒ #t
01231162009/08/03(月) 08:53:06
ああ、そっか。eq?でいいのですね。
eq?の動作を誤解してました。
0124デフォルトの名無しさん2009/08/03(月) 16:23:20
>>123
名前が長くなるほど、同値性の判断は柔らかくなるよん。
名前が短くなるほ(ry
0125デフォルトの名無しさん2009/08/03(月) 17:11:16
フィルター処理で同一か判断する(何もフィルタリングされなかった)
時に使える>eq?
非破壊という前提ならほとんどの処理に当てはまる
0126デフォルトの名無しさん2009/08/03(月) 17:47:44
組込み関数のequal?ってこんな感じ?
(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:36
覚えがある、じゃなくて読み返せ
0128デフォルトの名無しさん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
>>128
それそれ。中西先生の本にあった基本5関数の話が崩壊してしまった
気分になるんですよ。
0130デフォルトの名無しさん2009/08/03(月) 18:24:52
それじゃ印字もできないし、「作れる」とは言わない
0131デフォルトの名無しさん2009/08/03(月) 18:56:05
印字する関数を作れば良いだけ
0132デフォルトの名無しさん2009/08/03(月) 18:59:25
じゃあ作れよ
ちなみに「印字する関数」だけじゃ済まなくなるぞ
0133デフォルトの名無しさん2009/08/03(月) 20:29:06
基本5関数っていっても「関数」は5つあればいいけど
QUOTE LAMBDA IF (COND)といった特別式は別に必要なんじゃないかな
5関数とリスト構造だけでチューリング完全なら教えてほしい
自分はかなり考えたけど無理だった
(もっともLAMBDAがあれば基本5関数もIFもいらなくなるけど。QUOTEはいるかな)
0134デフォルトの名無しさん2009/08/03(月) 20:39:37
そりゃラムダ計算がチューリング等価だからなぁ…
0135デフォルトの名無しさん2009/08/03(月) 20:52:44
>>133
マッカーシー先生のLispの最初の論文にはcondが使われているし
基本関数とは別物では?
[ → ; → ; → ]
0136デフォルトの名無しさん2009/08/03(月) 21:37:05
>>133
http://www-formal.stanford.edu/jmc/recursive/node3.html
0137デフォルトの名無しさん2009/08/03(月) 21:48:37
うん、論文では特別式にあたるものも使われているにもかかわらず
wikiを始め基本5関数"のみ"でチューリング完全と言及されているものも多いんだけど
λ計算を初めて知った時、それだけでチューリング完全になるなんて思いもつかなかった自分には
基本5関数"のみ"ではチューリング完全ではないとは断定できなくて…
チャーチ数とかYコンビネータとか思いつくような人ならアレだけでチューリング完全に仕立て上げられちゃうんじゃないかとも思ったもんで
0138デフォルトの名無しさん2009/08/03(月) 22:22:44
基本5関数のみだったら単に5つの関数でしかないわけで、
そこに合成・再帰の操作を許して得られる関数のクラスがチューリング完全、
という言い方になるんだろうね
0139デフォルトの名無しさん2009/08/03(月) 22:40:47
そうなんだろうけど、λ(lambda)かdefun(label)があればそれだけでチューリング完全なわけで
結局、基本5関数はチューリング完全なλ算法系の上で"Lisp"を構築するプリミティブにすぎないって話になっちゃうんじゃないかな
基本5関数とチューリング完全性は無関係ってことに
0140デフォルトの名無しさん2009/08/03(月) 22:46:35
だからそのLAMBDAやLABELを基本関数で記述している、というのが上の論文の肝でしょ
0141デフォルトの名無しさん2009/08/03(月) 22:58:08
ところで「チューリング完全である」っていう述語はどうやって記述すればいいの?
0142デフォルトの名無しさん2009/08/03(月) 23:02:44
ttp://ja.wikipedia.org/wiki/%E7%B4%94LISP
「リスト」が曲者かと
0143デフォルトの名無しさん2009/08/03(月) 23:06:44
うーん記述には特別式を使っているように思えるけどなぁ…
0144デフォルトの名無しさん2009/08/03(月) 23:13:02
http://lib.store.yahoo.net/lib/paulgraham/jmc.lisp
0145デフォルトの名無しさん2009/08/03(月) 23:18:37
condもdefunも使ってるじゃないですか
0146デフォルトの名無しさん2009/08/03(月) 23:27:35
R5RSで,シンボルと通常の値の束縛にはdefineを,シンボルと
マクロの束縛にはdefine-syntaxを,と使い分けるのはなぜ
なんでしょう? たとえば,どちらもdefineでできたとしたら
不都合が起きるような場合はありますか? Common Lispが
手続きとそれ以外の値とを別々のスコープで扱うように,
Schemeではマクロとそれ以外の値とを別々のスコープで扱う
ということ?何を意図しての仕様かがもうひとつわかりません
0147デフォルトの名無しさん2009/08/04(火) 00:11:21
あと5年待てば判るよ
0148厨房2009/08/04(火) 00:56:52
すいません人工知能で彼女作りたいんですけどやっぱ人工知能はLispがいいんでしょうか?
勉強がんばるっす!!
0149デフォルトの名無しさん2009/08/04(火) 01:04:25
人工少女で我慢しなさい
0150デフォルトの名無しさん2009/08/04(火) 01:05:36
>>146
実装を意図しての仕様ですが何か?
0151デフォルトの名無しさん2009/08/04(火) 01:09:20
>>149
厨房には早過ぎるだろ・・・
0152デフォルトの名無しさん2009/08/04(火) 14:07:22
>>146
マクロ展開は普通は評価の前に行なわれる。
要するにマクロ展開と関数の評価は異なるレイヤで行なわれる。

もしマクロを第一級に格上げしたとしたら、
set! されたときに展開しなおしとか必要になって、
付随する様々な挙動が破綻してわけわかんなくなる。
不都合とかいうレベルの話じゃねーよ。 論外だろ。

まぁ、そういう Lisp があってもいいかとは思うけど、
Scheme では無理だし、パフォーマンス的にはかなり不利になるはず。
0153デフォルトの名無しさん2009/08/04(火) 14:35:45
C++テンプレートのコンパイル時実行のようなもの
0154デフォルトの名無しさん2009/08/04(火) 14:45:44
set! されたときにインライン展開しなおしとか定数伝播しなおしとか必要になって
のようなもの
0155デフォルトの名無しさん2009/08/04(火) 16:18:42
人工彼女の話と聞いてすっ飛んで参りました、ハイ。
0156デフォルトの名無しさん2009/08/04(火) 16:38:14
emacs23リリースされたけどlisperには関係ないのかな
0157デフォルトの名無しさん2009/08/04(火) 16:42:10
javascriptでもマクロ以外はlispと同じようなことできるの?
0158デフォルトの名無しさん2009/08/04(火) 18:03:01
人工彼女よりも生身の彼女の方がエキサイティングで楽しいよ。(笑)

ところでウィノグラードの積木をする少女のプログラムは今のパソコンの
性能なら十分に動くと思うのだけど、誰か動かしてないかな?
マイクロプランナーってPrologみたいなもの?
0159デフォルトの名無しさん2009/08/04(火) 19:02:22
>>157
JavaScript とか Ruby を「広義のLisp」に含めようとする人すらいるが、
構文木を操作することを可能にしたマクロと、マクロの大前提であるS式こそが Lisp の本質だと思う。
「マクロ以外は」と言ってしまうとせいぜいがクロージャとリスト操作くらいだろ?
JavaScript でもそれらを扱えるのは確かだが、
最も重要なマクロを除いてしまった上で「同じようなこと」が出来たからって…
0160デフォルトの名無しさん2009/08/04(火) 20:08:16
昔lisp好きのruby信者だったけど、実際のものをschemeやらで書くようになって、
今までruby信者だったことを恥じたね。
バカみたいにシンタックス増やしてその議論に時間裂いて如何に信者を増やすかが、その人たちの言う言語なんだと...
carとcdr、"(" と ")" 、applyとeval、言語のシンタックスが提供するのなんてこの2極で十分だ。(極論だけど)
言語作者のエゴが作る多すぎるルールは戒律になって自由に対してのしかかってくるだけだよ。

(この戯言で怒った人はごめんね☆)
0161デフォルトの名無しさん2009/08/04(火) 20:13:51
さらに進んでSKIで十分と言えるようになれば一人前
0162デフォルトの名無しさん2009/08/04(火) 20:18:28
>>152
Guileはそういうとここだわってますよね
> (define (hoge) (begin (display 'function) (newline)))
> (define (foo) (hoge))
> (foo)
function
> (define-macro (hoge) '(begin (display 'macro) (newline)))
> (foo)
macro

親処理系のSCMで動かないこのコードがGuileで動くってことはわざわざ追加された仕様なんでしょうね
0163デフォルトの名無しさん2009/08/04(火) 20:26:59
それはただの処理系依存の話
gaucheの最適化レベルが低いってだけ
0164デフォルトの名無しさん2009/08/04(火) 20:31:06
Guileです
01651602009/08/04(火) 20:37:43
>>161
SKIってSKIコンビネータなんちゃらってやつ?
とにかく読み漁ってみるわ。
まじで情報サンクス。
やっと計算云々のコアにたどり着けるような気がする...
今まで童貞で良かったわ。きっとセックスより気持ち良いに違いない。
0166デフォルトの名無しさん2009/08/04(火) 20:49:07
>>165
全然違うものですがPostScriptとSECD仮想機械も面白いものですよ。
PostScriptにはつい最近興味を持ち始めたのですが
Forthよりコッチ側(関数的プログラミングとか)に近くて
末尾呼び出しの最適化もされるし驚きでした。
(ループが再帰で書ける!)
SECD仮想機械はS式ベースの仮想機械で
これをベースにしたScheme処理系もあるみたいです。
0167デフォルトの名無しさん2009/08/04(火) 20:54:13
センスのあるやつはコードを書く
センスの無いバカは理論をやる
それが計算機の世界
0168デフォルトの名無しさん2009/08/04(火) 21:05:47
いまはなきLispMe
0169デフォルトの名無しさん2009/08/04(火) 21:12:14
>>167
○ センスの無いバカは理論「だけ」をやる
0170デフォルトの名無しさん2009/08/04(火) 21:31:27
理論をまったく知らないでコードを書くのは例外なく馬鹿
0171デフォルトの名無しさん2009/08/04(火) 22:27:40
>>166
かなり面白そう。
PostScriptは名前だけ知ってたんですが、初めて見ました。
というか、S式 -> ps とかすごく簡単に書けそうでプロッターとしていけますね。
SECD仮想機械は機械的(物理的?)な観点から見れそうなので、今までlisp系を観念的にしか見てなかった自分としては、今までとは対極の見方が出来そうです。
情報サンクスです。
0172デフォルトの名無しさん2009/08/04(火) 22:58:28
>>171
PostScript で Lisp 書いたり PostScript で書いた Lisp で Lisp を書いた人もいる。
http://blog.bugyo.tk/lyrical/2008/01/-o-lisppostscriptlisp.html
0173デフォルトの名無しさん2009/08/04(火) 23:04:20
素直にCをベースにしたscheme処理系を見ればいいのに
据え膳食わぬは男の恥
0174デフォルトの名無しさん2009/08/05(水) 02:09:50
すいません、下のスレの
http://pc12.2ch.net/test/read.cgi/tech/1233143342/

(((() #0="a" #0# #0#) (#1="b" (#1# (#1#) . #2="c") . #2#) . #2#))

この#0#とかの表記がよく判りません。
自己参照してるっぽいのは判るんですが、
どこかに読み方の説明ないですかね。
#0=と#0#は違うのかな?
0175デフォルトの名無しさん2009/08/05(水) 02:22:09
>>174
読み方の説明ならこれか
http://www.lispworks.com/documentation/HyperSpec/Body/02_dho.htm
http://www.lispworks.com/documentation/HyperSpec/Body/02_dhp.htm
これ
http://srfi.schemers.org/srfi-38/srfi-38.html
0176デフォルトの名無しさん2009/08/05(水) 02:53:47
>>174は文字列に対して適用してますが、↓と意味は違うんですかね?
(((() "a" "a" "a") ("b" ("b" ("b") . "c") . "c") . "c"))
それぞれの文字列がeq?にならないからってことかな?
0177デフォルトの名無しさん2009/08/05(水) 08:32:15
>>176
そのとおり。 共有構造を明記できる記法。
見づらいなら write で出力すればよい。
0178デフォルトの名無しさん2009/08/05(水) 20:02:29
LispでLisp処理系が書けるってのはCでCコンパイラが書けるってのとは
違う不思議さがある。ほら吹き男爵のブートストラップの話みたいな。
0179デフォルトの名無しさん2009/08/05(水) 20:17:33
Lispの便利機能(GCとかレキサとかデータ構造とか)の実装抜きで作れるからな
0180デフォルトの名無しさん2009/08/05(水) 20:22:00
マクロをうまく使って作ると面倒なことを一切せずに元のLispと同等の速度で動く
0181デフォルトの名無しさん2009/08/05(水) 20:25:56
>>178
http://www2.parc.com/csl/groups/sda/projects/reflection96/docs/malenfant/ref96/ref96.html
0182デフォルトの名無しさん2009/08/05(水) 22:15:32
>>181
>>178の言ってるのはGCとかの泥臭いところを除外してるって意味だと思われ
■ このスレッドは過去ログ倉庫に格納されています