Lisp Scheme Part22at TECH
Lisp Scheme Part22 - 暇つぶし2ch200:デフォルトの名無しさん
08/05/29 23:23:34
call/ccに渡された継続って
なぜ末尾コンテクストじゃなくても
末尾呼び出しされるんだろう。
普通の関数と同じ扱いにすれば
参照透明性も損なわれないような気がする。
深く考えてないけど。

201:デフォルトの名無しさん
08/05/30 00:05:48
>>199
symbol-table → binding

202:デフォルトの名無しさん
08/05/30 00:06:59
>>200
帰ってくるのかよ!

203:デフォルトの名無しさん
08/05/30 00:11:35
>>200
帰還方法を(継続として)渡すような双方向継続フレームワークを作るのが良かろう

204:デフォルトの名無しさん
08/05/30 00:20:42
>201
「束縛関係(binding)を記録している所」なら「環境(environment)」なんじゃね?

205:デフォルトの名無しさん
08/05/30 00:26:38
>>204
環境というとフラットな印象だなあ。(グローバルみたいな)
スタック状に積み重なってるイメージは束縛のほうかな。

206:デフォルトの名無しさん
08/05/30 00:32:47
>>204-205
「環境(environment)」=「クロージャ」

207:デフォルトの名無しさん
08/05/30 00:50:22
>>206
おいおい、大事なものが抜けてないか~
それじゃ仕事になんないよ(w

208:デフォルトの名無しさん
08/05/30 06:46:31
>>205
それは「環境」に対して持ってるイメージが狭すぎるよ。
SECDのEはenvironmentのEだぜ。

209:183
08/05/30 10:41:05
昨日から考えていますが,まだ理解が不充分です.お教えください.
語弊があるかもしれませんが,変数の束縛関係が登録されている場所のことを「symbol-table」ということにします.
symbol-table が何枚も重なって,scope 全体の階層構造を表現しているとします.
昨日お教えいただいた「continuation は,自分が生成されたときの symbol-table への『参照』を持っている」という理解だと,
今度は >>196 の挙動が理解できません.
(>>183 の「symbol-tableの『deep-copy』を持っている」という私の最初の理解だと,>>197 の挙動が理解できませんでした.)
ここで生成される continuation が参照しているのは,let がつくる「top-level よりも 1 レベル深い symbol-table」だと思います.
>>196 の場合,末尾再帰の際に (+ counter 1) が評価されて,その結果の 2 が新たな counter の束縛値としてこの symbol-table
に書き込まれ,その後に let の本体が評価されますよね?
そうすると,loop の引数として (+ counter 1) を渡す >>196 も,set! で直接 symbol-table に束縛関係を書き込む >>197 も,
どちらも同じ >>197 のような結果を示すはずだと思うのです.なぜ >>196 が counter の最初の束縛値 1 を覚えているのでしょうか.
>>196>>197 の違いはどこにあるのでしょう?まさにそれがこの 2 つのコードを書いてみた動機だったのですが…
(多分 >>196 の評価過程をどこか間違えて理解しているのだと思います)

210:デフォルトの名無しさん
08/05/30 11:54:43
関数呼び出しは、新しい「symbol-table」を作るだけで、元の symbol-table を書き換えたりしない。
この例だと、 (loop (+ counter 1)) を評価するたびに、 counter の値が違う symbol-table が作られる。
だから、継続に戻ると、元の symbol-table がそのまま残ってる。

211:183
08/05/30 12:18:01
>>210
実はそれも考えましたが,この場合そうあるべきではないと思うのです.
loop を呼び出すたびに新たな symbol-table を作るとなると,末尾再帰呼び出しの回数が
大きくなるにつれて symbol-table の枚数が増え続けることになり,それを表現する stack
がどんどん伸びてしまいませんか?
これは「末尾再帰処理」の「余計なメモリ消費を行わずに繰り返しを表現する」という掟に
反するように思うのですが…
これが末尾再帰でなく通常の関数呼び出しなら >>210 さんのおっしゃる挙動で理解できます.

212:デフォルトの名無しさん
08/05/30 12:33:04
>>211
もしかしたら「末尾呼び出しはジャンプに最適化される」とあちこちに書いてあるから、loopの呼び出しがジャンプになるならcounterが上書きされると思ったのかもしれないけど・・・
schemeレベルからはそう見えることはないです。
ではどうやって末尾再帰呼び出しの保証をしているのかなのですが・・・時間が無いのでだれか書かない?

213:デフォルトの名無しさん
08/05/30 12:59:06
末尾再帰呼び出しだからといって(リソースの食いっぷり以外の)挙動が変わるわけではない。
普通に再帰呼び出ししてると考えたほうが判りやすいのではないかな。

214:デフォルトの名無しさん
08/05/30 13:08:16
末尾コンテキストでの呼び出しは、実際にはスタックフレームに
積まれた引数を移動させるコストが発生する。
コンパイラがフロー解析していたり、単純な呼び出しならば
直接不要になった変数を破壊する書き換えが行われる場合がある。

それと、コンパイルされれば局所変数は相対位置で参照されるので
通常は名前なんかはスタック上に保持していない。
つまりsymbol-tableという言い方はおかしい。

215:デフォルトの名無しさん
08/05/30 15:20:37
スタックという言い方もおかしいかもしれないな。
スタックというと「ひとつしかない」「配列」を思い浮かべるかもしれないが、
概念的にはヒープ上のリストと同じように扱えるものと考えたほうがいい。

216:デフォルトの名無しさん
08/05/30 16:05:16
>>214
>>215
がいいこと言った!
というわけで、誘導しようと思ったらリンクが無かったわ^^;

Three Implementation Models for Scheme
URLリンク(www.cs.indiana.edu)

久しぶりにラムダの門磨いときますね(w

217:デフォルトの名無しさん
08/05/30 21:19:30
識別子が式に束縛される(得る)OcamlやHaskellと違って
Schemeの識別子はC言語などと一緒で
式ではなく記憶領域の場所に束縛される。

末尾再帰の最適化に関しては
スタックフレームの参照で考えると

A→B→C ;;普通の関数呼び出しのスタックフレームの参照連鎖

A→ →C ;;末尾呼び出しの場合はAとCを直接つないじゃえ、どうせCから値を直接返そうがBが値を返そうがプログラマから見れば同じだし
  B

A→C ;;Bはどのスタックフレームからも参照されてないのでGCに回収されました

ってな感じで定数空間で末尾再帰されてると考えてもいいかも。
実際の処理系はもっと効率よくやってるはずだけど。

218:デフォルトの名無しさん
08/05/30 23:15:06
>>211
> それを表現する stack がどんどん伸びてしまいませんか?

末尾再帰の場合はそうせずに済むってことだよ。

219:デフォルトの名無しさん
08/05/30 23:17:44
>>217
良い説明だと思う。
こういう風にきちんと考えないと、継続が絡んだときの挙動を説明できないんじゃないかな。

220:183
08/05/30 23:27:08
みなさまありがとうございます.
末尾再帰呼び出しについて >>217 さんのご説明が私のイメージにいちばん近くわかりやすいです.
この例で,C の呼び出しは実際には A を呼び出しているわけで,>>214 さんのいわれるような
「末尾コンテキストでの呼び出し(C)は、実際には(Cの)スタックフレームに積まれた引数を(Aに)移動させる」
処理が起きるわけですよね.
問題は,この中に continuation が混在していることなのですが,この図に continuation の
スタックフレームへの参照を追加するとどのような図になるのでしょうか.
再帰呼び出しの中で,どのようにすれば continuation が「正しい」scope を持ち続けることが
できるのかということなのですが…

221:デフォルトの名無しさん
08/05/31 00:11:22
λ式中の束縛識別子はそのλ式がapplyされた時に動的に生成されるCで言えばauto変数。
だから再帰などで同じ手続きが呼ばれてもそれぞれの変数の束縛(アドレス)はユニーク。
λ式中の自由識別子はそのλ式がevalされ(て手続きが生成され)た時に可視な束縛(ポインタ)が参照される。
だから再帰などで同じ手続きがよばれても同一の場所(アドレス)を参照する。

call/ccが引数の手続きに渡す継続は
case-Aの場合は(lambda (x) (write counter) (newline) (loop (+ counter 1)))
case-Bの場合は(lambda (x) (write counter) (newline) (set! counter (+ counter 1)) (loop counter))
この中に現れている自由識別子(というか束縛識別子は参照されてないけど)は何度呼ばれても同一の場所を参照する。
case-Bの場合はset!でcounterが束縛されているメモリの値を書き換えてるから
書き換えられた値を参照している。
ここで(loop (+ counter 1))は手続き呼び出しだから(loop 3)等の値に評価されてから手続きに渡されている事に留意。
そして1回目のloopのcounterと2回目のloopのcounterは同一でない場所を参照してる。(スタックフレームの再利用などの最適化されていなければ)

222:デフォルトの名無しさん
08/05/31 00:15:27
継続といっても呼び出され方が特別なだけで(末尾文脈でなくても末尾呼び出しされる)
手続きと実体は一緒だから同じように考えればOK

223:デフォルトの名無しさん
08/05/31 00:16:19
つ metacirclar interpreter

224:204
08/05/31 00:35:20
>183
末尾再帰や継続を勉強する前にせめてschemeの評価モデルの勉強をすべきだと思うんだ
まず「環境フレームモデル」について勉強することをお勧めするよ

225:デフォルトの名無しさん
08/05/31 00:50:58
>>224
そういう意味じゃ>>183にとってGauche本は良書じゃなかろうか?

226:デフォルトの名無しさん
08/05/31 01:37:50
>>183
説明してみます。

C1はcounterが1の束縛、C2はcounterが2の束縛だとすると、
最初にnamed letに入ったときはスタックは

C1

ここでcontinuationをセーブしている。
loopを呼び出すと

C1->C2

の状態になる。
で、ifからfinishで抜けている。スタックは空。

"空"

(continuation #t)を評価すると、スタックは先にセーブした

C1

の状態になって(call/cc ...)の次の式から評価が開始される。

続く

227:デフォルトの名無しさん
08/05/31 01:38:23

そこからloopが再び呼び出されると

C1->C2'

の状態となる。ここで先のC2とC2'になる。
さてC1がどこに記録されているかだけど、これはcontinuationにぶら下がる形でヒープに保管するのが簡単な実装方法。

ところでloopは末尾再帰呼び出しなので、C1->C2やC1->C2'になるところでC1を潰してC2やC2'で上書きしてしまいそうなのだが、
これは実装がC1が破壊できないことを知っているので行われない。
これはC1がヒープに保管されているかどうかで判定するのが簡単な実装方法になる。

(continuation #t)の#tはどこにいくのか?
C1->C2'の途中に#tを持った束縛ができないか心配になるけど、この#tは(call/cc ...)の帰り値となって、スタックから取り去られることになる。

う~ん、どうだろうか?

228:デフォルトの名無しさん
08/05/31 01:42:53
typo御免
「の状態となる。ここで先のC2とC2'になる。」

「の状態となる。ここで先のC2とこのC2'は違う束縛になる。」
のつもり。m(_ _)m


229:183
08/05/31 01:52:17
みなさまありがとうございます.
>>221 さんのご説明が具体的で核心をついた答そのものだと思います.
さらに >>226 - >> 228 さんのご説明は >>217 さんの例に則していて
わかりやすそうです.
少し時間がかかると思いますが処理をなぞって考えさせていただきます.

230:デフォルトの名無しさん
08/05/31 11:55:56
3パターンの継続を誰か説明してあげたら?

(1) upward onlyの継続 (例外はこれで可能)
(2) 一回使ったらおしまいの継続 (コルーチンはこれで可能)
(3) 汎用的な継続

231:デフォルトの名無しさん
08/05/31 11:57:34
URLリンク(practical-scheme.net)

232:デフォルトの名無しさん
08/05/31 12:15:11
>>230
(1) ひとつしかないスタックを破壊的に変更しながら使う
(2) いくつかのスタックを破壊的に変更しながら使う
(3-a) スタックを退避したりリストアしたり
(3-b) immutableパターン

233:183
08/05/31 12:52:01
ご心配いただいて申し訳ありませんので現在の状況を報告いたします.
基本的な規則は
・closure が呼び出されれば(たとえそれが末尾再帰呼び出しであっても),
 新たな束縛環境が作られ,その環境に視点が切り替えられていく.
・continuation には,自分が生成されたときの束縛環境への参照が保持されている.
・通常処理を続けている間は,末尾再帰呼び出しに伴い次々と生成されて
 切り替えられる束縛環境をもとに評価が進められるのだが,
 ひとたび continuation が呼び出されると,その continuation 上に保持されていた
 束縛環境に視点が切り替えられる.
であり,これらに従って評価を繰り返していけば case-A と case-B の挙動の違いを
説明できるように思います.
みなさんのご説明以上の内容ではありませんが,最初のルールを充分にわかっていなかった
(つまり,末尾再帰呼び出しの場合,同じ束縛環境のまま束縛関係を上書きしてしまうと考えていた)
ことが混乱の原因であったように思います.
まだ理解が不充分だと思いますが,少しだけわかりかけてきた気がします.

234:デフォルトの名無しさん
08/05/31 14:41:09
名古屋名物 名古屋コールチン

235:デフォルトの名無しさん
08/05/31 14:51:28
>>234
本気で面白いと思って書き込んだのでないなら少し反省してもらおうか。


236:デフォルトの名無しさん
08/05/31 15:45:47
俺はちょっと笑ったぞ

237:デフォルトの名無しさん
08/05/31 15:49:47
鳥皮はコルーチンたっぷり

238:デフォルトの名無しさん
08/05/31 18:10:23
>>234-237
もうしばらく静かにしておいてやれYO!

239:デフォルトの名無しさん
08/05/31 21:55:26
(define member?
(lambda (a lat)
(cond
((null? lat) #f)
((eq? a (car lat)) #t)
(else (member? a (cdr lat))))))

(member? 'sardines '(Italian sardines spaghetti parsley))

240:デフォルトの名無しさん
08/05/31 21:56:04
(define intersect
(lambda (set1 set2)
(letrec
((I (lambda (set)
(cond
((null? set) '())
((member? (car set) set2)
(cons (car set)
(I (cdr set))))
(else (I (cdr set)))))))
(I set1))))

(intersect '(tomatoes and macaroni) '(macaroni and cheese))

241:デフォルトの名無しさん
08/05/31 21:57:19
; >>230
; (1) upward onlyの継続 (例外はこれで可能)

(define intersectall
(lambda (lset)
(let/cc hop
(letrec
((A (lambda (lset)
(cond
((null? (car lset))
(hop '()))
((null? (cdr lset))
(car lset))
(else
(intersect (car lset)
(A (cdr lset))))))))
(cond
((null? lset) `())
(else (A lset)))))))

(intersectall '((tomatoes and macaroni) (macaroni and cheese) (tomatoes and cheese)))

242:デフォルトの名無しさん
08/05/31 22:52:40
(define rember-upto-last
(lambda (a lat)
(let/cc skip
(letrec
((R (lambda (lat)
(cond
((null? lat) '())
((eq? (car lat) a)
(skip (R (cdr lat))))
(else (cons (car lat) (R (cdr lat))))))))
(R lat)))))

(rember-upto-last
'cookies
'(cookies chocolate mints caramel delight ginger snaps sesserts chocolate mousse
vanilla ice cream German chocolate cake more cookies gingerbreadman chocolate chip brownies))

243:デフォルトの名無しさん
08/06/01 00:18:03
>>196-197で call-with-current-continuation と書いてたのを
>>241-242ではlet/ccと書いてある。(Seasoned Schemerからの例)

244:デフォルトの名無しさん
08/06/01 00:22:49
>>239-242
「う~ん、それならこれで十分なんじゃな~い」ってきっと言われる・・・

(define rember-upto-last
 (lambda (a lat)
  (let loop ((ans lat) (lst lat))
   (cond ((null? lst) ans)
      ((eq? (car lst) a) (loop (cdr lst) (cdr lst)))
      (else (loop ans (cdr lst)))))))

(define intersectall
 (lambda (lset)
  (fold intersect (car lset) (cdr lset))))

なんか簡潔で説得力のある一級継続の使用例は無いものだろうか・・・

245:デフォルトの名無しさん
08/06/01 00:55:50
継続無しでいくことが主目的ならそれでいいんジャマイカ?>>244
継続の動作の仕組みを調べる材料に使うなら>>239-242は十分な例だと思う。
継続を理解することよりも何かに例えることに力点があるうちは理解できないだろう。

246:デフォルトの名無しさん
08/06/01 01:28:21
((call/cc
 (lambda (goto)
  (letrec ((start
        (lambda ()
         (print "start")
         (goto next)))
       (froz
        (lambda ()
         (print "froz")
         (goto last)))
       (next
        (lambda ()
         (print "next")
         (goto froz)))
       (last
        (lambda ()
         (print "last")
         (+ 3 4))))
   start))))

247:デフォルトの名無しさん
08/06/01 01:29:02
動作を理解しても「こんなのいらね」で終わることもあるからな。良い例が欲しいな。

248:デフォルトの名無しさん
08/06/01 01:29:09
(let* ((yin ((lambda (foo) (newline) foo)
       (call/cc (lambda (bar) bar))))
    (yang ((lambda (foo) (write-char #\*) foo)
       (call/cc (lambda (bar) bar)))))
 (yin yang))

249:デフォルトの名無しさん
08/06/01 01:29:33
((call/cc call/cc) (call/cc call/cc))

250:デフォルトの名無しさん
08/06/01 01:30:21
>>247
そのレベルでやってるやつには不要。


251:デフォルトの名無しさん
08/06/01 01:33:52
>>247
クレクレうるせーんだよ。氏ね。

252:デフォルトの名無しさん
08/06/01 01:50:09
乞食が自分で書けば良いんジャマイカ?

253:デフォルトの名無しさん
08/06/01 01:51:23
>>250
「そのレベル」でいいんジャマイカ、と

254:デフォルトの名無しさん
08/06/01 01:54:47
荒れてきたねw
foldで書き直せますって言う暇があったら好例を出すべきだったと思うね。

255:デフォルトの名無しさん
08/06/01 01:57:29
>>253
おまえも馬鹿らしいなw

256:デフォルトの名無しさん
08/06/01 02:04:31
もですね、わかります

257:デフォルトの名無しさん
08/06/01 02:11:52
       ,;r''"~ ̄^'ヽ,
      ./       ;ヽ  新憲法で表現の自由規制、裁判官の国民審査権破棄
      l  _,,,,,,,,_,;;;;i  
      l l''|~___;;、_y__ lミ;l      ネット規制法で検閲、人権擁護法案で報道規制、
      ゙l;| | `'",;_,i`'"|;i |    
     ,r''i ヽ, '~rーj`c=/        ダウンロード違法、単純所持禁止、..etcetc
   ,/  ヽ  ヽ`ー"/:: `ヽ      
  /     ゙ヽ   ̄、:::::  ゙l, 情報源を潰して日本を中国化だ!フゥハハハーハァー
 |;/"⌒ヽ,  \  ヽ:   _l_        ri                   ri
 l l    ヽr‐─ヽ_|_⊂////;`ゞ--―─-r| |                   / |
 ゙l゙l,     l,|`゙゙゙''―ll___l,,l,|,iノ二二二二│`""""""""""""|二;;二二;;二二二i≡二三三l
 | ヽ     ヽ   _|_  _       "l ̄ ̄ ̄ ̄ ̄ ̄ |二;;二二;;二=''''''''''' ̄ノ
 /"ヽ     'j_/ヽヽ, ̄ ,,,/"''''''''''''⊃r‐l'二二二T ̄ ̄ ̄  [i゙''''''''''''''''"゙゙゙ ̄`"
/  ヽ    ー─''''''""(;;)   `゙,j"  |  | |
  _,,,,,,,,,ヽ、        ,,,,,r-'''''ーー'''|   |  | |
''"    ヽ,,___,,,r‐''''''二__    |__|  | |
          \'''"   /     ノ    | |


258:デフォルトの名無しさん
08/06/01 02:13:43
>>256
ああいえばこういう。まじ視ね。

259:デフォルトの名無しさん
08/06/01 02:14:33
なんか蛆虫がいっぱいw

260:デフォルトの名無しさん
08/06/01 02:41:53
>>247良い例マダァ?

261:デフォルトの名無しさん
08/06/01 02:47:45
荒れる方向へ誘導するなよ

262:デフォルトの名無しさん
08/06/01 02:51:16
もうおまいら全部まとめて >>7 独習 Scheme 三週間 (Schemeの教科書 ) でも読んで寝ろよ。
定番のコルーチンとバックトラックがちゃんとのってるぞ。

263:デフォルトの名無しさん
08/06/01 03:53:30
>>262
動作を理解しても「こんなのいらね」で終わることもあるからな。良い例が欲しいな。

264:デフォルトの名無しさん
08/06/01 04:16:01
グダグダうるせーんだよ。乞食は氏ね。

265:デフォルトの名無しさん
08/06/01 07:28:43
ambは再帰で書くと分かりにくいが、これならどうだ

(define-syntax amb
 (syntax-rules ()
  ((_ x ...)
   (let/cc yield
    (let/cc fallthrough
     (push! stack fallthrough)
     (yield x))
    ...
    ((pop! stack))))))

266:デフォルトの名無しさん
08/06/01 09:39:35
>>265
そんな動きもしない中途半端な例より過去スレ嫁。
不思議の国のアリスをやってた連中がambを使ってたハズ。

267:デフォルトの名無しさん
08/06/01 10:51:03
Gauche使ってる奴は独自機能を使って煙に巻きたがるんだよなw
push!とpop!の説明しないのかよ?

268:デフォルトの名無しさん
08/06/01 10:53:39
(define-syntax amb
(syntax-rules ()
((_) (fail))
((_ a) a)
((_ a b ...)
(let ((fail0 fail))
(call/cc
(lambda (cc)
(set! fail
(lambda ()
(set! fail fail0)
(cc (amb b ...))))
(cc a)))))))

(define call/cc call-with-current-continuation)

(define fail #f)

(define (require pred)
(or pred (amb)))

(call/cc
(lambda (cc)
(set! fail
(lambda ()
(cc 'no-choise)))))

269:デフォルトの名無しさん
08/06/01 11:22:04
このスレも人増えてなにより

270:デフォルトの名無しさん
08/06/01 11:49:40
(define call/cc call-with-current-continuation)

(define fail #f)

(call/cc
(lambda (cc)
(set! fail
(lambda ()
(cc 'no-choise)))))

(fail) ; => no-choise

271:デフォルトの名無しさん
08/06/01 12:02:19
>>196-197と比較するとambがやってることがわかると思う。

(amb 1 2 3 4 5) ; => 1
(fail) ; => 2
(fail) ; => 3
(fail) ; => 4
(fail) ; => 5
(fail) ; => no-choise

272:デフォルトの名無しさん
08/06/01 12:07:54
>>246
うほっ、これいいね!
出典があるなら教えて~

273:デフォルトの名無しさん
08/06/01 12:17:57
>>272
それ前スレにも出てた。有名なのかも。

274:デフォルトの名無しさん
08/06/01 12:41:12
>>272
おそらく出典はGuy Steele御大です。
URLリンク(lib.store.yahoo.net)


275:272
08/06/01 12:41:45
ありがと^^

276:デフォルトの名無しさん
08/06/01 12:54:41
#define d define
#d a include
#a <stdio.h>
#a <string.h>
#a <ctype.h>
#d p char*
#d P ,(p)
#d T(E) !strcmp(E,"()")
#d U return
#d W while
#d X sbrk(199)
#d z atof
#d e isspace
#d D A(_)
#d E S(C(_))
#d B(y) p y(_)p _;{
#d G(y,V) B(y)p i;U sprintf(i=X,"%lf",z(E)V z(S(C(D)))),i;}p sbrk(),*S(),*j(),*O,*H;K,Y,M=14;double z();Q(_)p _;{int V=0;W(e(*_))_++;H=_;W(V|!(e
(*H)|*H==')'||(*H=='('&&H-_)))V+=(*H=='(')-(*H== ')'),H++;U H-_;}B(C)U _++,Y=Q(_),_=strncpy(X,_,Y),_[Y]=0,_;}B(A)_++,_+=Q(_);W(e(*_))_++;U O=X,*O='(',strcpy(
O+1,_),O;}B(Z)U _;}B(c)U C(E);}B(q)U A(E);}B(t)p i=E;U H=S(C (D)),sprintf(O=X,T(H)?"(%s)":"(%s %s",i,H+1),O;}B(F)U S(C(A(T(E)?D:_)));}L(i,s)p
i,*s;{U isdigit(*i)?z(i)!=z(s):strcmp(i,s);}B(b)U L(E,S(C(D)))?"()":"t";}B(R)U E;}B(o)U z(E)<z(S(C(D)))?"t":"()";}G(f,+)G(g,-)G(h,*)p r[4][2]={"function" P R,
"quote"P C,"lambda"P Z,"defun"P j};B(j)U r[M][1]=D,*r[M++]=C(_);}p not[99][2]={"if"P F,"equal"P b,"<"P o,"+"P f,"-"P g,"*"P h,"car"P c,"cdr"P q,
"cons"P t,"t","t"};B(S)int Li,s;p u;if(isdigit(*_)|T(_))U _;for(Y=M;Y--;)if(!strcmp(_,*r[Y]))U r[Y][1];u=E,_=D;if(*u-'(')U(*((p(*)())u))(_);s=Li=M;W(!T(_))r[M][1]=E,*r[M++]
="",_=D;O=C(u);W(!T(O))*r[Li++]=C(O),O=A(O);U O=S(C(A(u))),M=s,O;}main(){H=O=X,Y=0;W(Y|!e(K=getchar()))K==EOF?exit(0):0,Y+=(K=='(')-(K==')'),*H++=K;*H=0,puts(S(O))
,main();{printf("XLISP 4.0\n");}}

277:デフォルトの名無しさん
08/06/01 13:04:34
call/ccが名前つきブロックにもなるletrecを内側に持つとgotoできるのか。
letrecをループに使うのは良くみかけるけどね。
(define (count-chars)
(letrec ((loop (lambda (ch count)
(if (eof-object? ch)
count
(loop (read-char) (+ count 1))))))
(loop (read-char) 0)))

278:デフォルトの名無しさん
08/06/02 20:30:36
好みの問題ですけど
相互再帰じゃない場合はnamed letの方が見やすいですね。

279:デフォルトの名無しさん
08/06/02 21:02:33
>>278
こんなとこで言ってないで国際会議の場でGuy Steeleに意見しろよ。

280:デフォルトの名無しさん
08/06/02 22:18:39
先月caltechのカンファで直接言ったんだけど、Fortressの後始末でそれどころじゃないみたい。

281:デフォルトの名無しさん
08/06/02 22:29:13
この間スペックが出たばかりなのに後始末って何するの?

282:デフォルトの名無しさん
08/06/02 23:06:44
スペックが出ちゃえばあとは後始末だけだな

283:デフォルトの名無しさん
08/06/02 23:22:31
Fortressの教科書書いてくれないのかな。

284:デフォルトの名無しさん
08/06/03 00:23:36
>>280はオトコだが、>>279は根性無しの引きもりと言うことですね。


285:デフォルトの名無しさん
08/06/03 00:57:55
>>284
顔真っ赤にして見苦しいよw

286:デフォルトの名無しさん
08/06/03 01:03:13
>>283
Steele って教科書書いた事あるの?

287:デフォルトの名無しさん
08/06/03 01:19:35
>>286
Cの本、Common Lispの本は?Javaのもあるし、もう1冊The High Performance Fortran Handbookもあるけど。
あと、本じゃないけどジャーゴンファイル。
PDFで結構いろいろなマニュアルも見つかる。
このスレでは "The History of Scheme" が有名かな。

絶対に外せないのがコレかな
URLリンク(dspace.mit.edu)

288:デフォルトの名無しさん
08/06/03 01:35:16
サンクス。もっと入門的な書き物の事だと思ってた。
理論的なペーパーならここにあるのじゃダメかな。

URLリンク(research.sun.com)

289:デフォルトの名無しさん
08/06/03 01:50:15
>>288
㌧。だめってことはないよ。こちらの勝手な希望なのでw
URLリンク(research.sun.com)
こんな感じで200~400ページぐらいの分量があると全貌が見えるからいいかなと。
Guy Steeleはマニュアル書くと面白い例を出してくれるから期待したいな。
Cの本なんてすごく良かったのに和訳が絶版になって残念だなぁと思う。

290:デフォルトの名無しさん
08/06/03 02:55:58
>>285が痛すぎる件について。

まぁ不問にしてやろうw


291:デフォルトの名無しさん
08/06/03 05:11:11
くだらないやりとり引っ張る奴が一番見苦しい

292:デフォルトの名無しさん
08/06/03 09:08:32
本当に「この話題を引っ張って欲しくない」人は、見苦しいとか煽って余計終わりにくくしたりしません。

ま、勢いで書き残しちゃった自分の痛いレスに触れて欲しくない>>285が、正論のフリして終結を促したものの、
自意識が邪魔してつい余計な「反撃」をしちゃって、終わらせることにも第三者のフリにも失敗、というとこでしょうかw

293:デフォルトの名無しさん
08/06/03 10:23:26
>>286
ない。

294:デフォルトの名無しさん
08/06/03 10:24:15
AI MEMO は Lambda the Ultimate シリーズもだな

295:デフォルトの名無しさん
08/06/03 18:30:30
URLリンク(library.readscheme.org)

296:デフォルトの名無しさん
08/06/03 20:31:19
parser generator を探してみた。さすがは実験言語。ぞろぞろ出てきますw

URLリンク(www.iro.umontreal.ca)
URLリンク(www.informatik.uni-freiburg.de)
URLリンク(www.cs.cmu.edu)

297:デフォルトの名無しさん
08/06/03 20:35:32
>>292
おまえ等クダスレ逝って喧嘩しろ。邪魔。

298:デフォルトの名無しさん
08/06/03 20:40:48
>>296こんなのあるYO!
URLリンク(www.cs.indiana.edu)

299:デフォルトの名無しさん
08/06/03 20:50:11
>>296
エッセンスが好き。

300:デフォルトの名無しさん
08/06/03 21:03:09
遺伝的プログラミング
URLリンク(codepad.org)

301:デフォルトの名無しさん
08/06/03 21:07:21
essenceってLL(1)のSLLGENと比べて敷居が高そうw
そんなこと無さ気に書いてあるけどさw

302:デフォルトの名無しさん
08/06/03 21:09:05
>>298
激しく㌧。凄いね。

303:デフォルトの名無しさん
08/06/03 21:41:37
>>301
使うの簡単だよ。
開発は大変だったろうけど。
汎用のパーザの部分計算でパーザを生成するから。

304:デフォルトの名無しさん
08/06/03 21:41:58
>>300
なんじゃそりゃ!
(define (equ x) (* 2 (^ x 4)))
という式の微分を求めてるらしいけど。普通の記号処理と違うのに
(* 8 (^ x 3))
と同じ式がちゃんと求まってるw

305:デフォルトの名無しさん
08/06/03 22:14:37
>>300,>>304
URLリンク(www.genetic-programming.org)

306:デフォルトの名無しさん
08/06/03 22:17:13
遺伝的プログラミングで最適化したコードを吐くパーザとかw

307:デフォルトの名無しさん
08/06/03 22:32:33
essenceはScheme48用のpggというProgram Generator Generatorを使うのね。
作られたessenceはProgram Generatorなんだから、できたスキームはプログラムなわけ。
でもスキーム用のpggというProgram Generator Generatorを使うと・・・

308:デフォルトの名無しさん
08/06/03 22:55:01
>>297
本当にそう思ってる人は、
(ごく一部の、目的の為に衝動を抑えるという人類なら大抵できることができないクズを除いて)
そういう喧嘩腰の追っ払い方を試みません。バレバレですw

309:デフォルトの名無しさん
08/06/03 22:56:11
>>307
その再帰の不動点プログラムはいったいなんなんだ。

310:デフォルトの名無しさん
08/06/03 23:05:10
遺伝的プログラミングで関数が収束しているのは一様収束?

311:デフォルトの名無しさん
08/06/03 23:10:05
>>309
Schemeなんじゃないかな。

312:デフォルトの名無しさん
08/06/03 23:26:01
初めてYコンビネータとかambとかGPを見たとき魔法を使ってるみたいだって思った。

313:デフォルトの名無しさん
08/06/04 00:08:36
>>308
本当にそう思っている人も居るからそろそろ察してね。

314:デフォルトの名無しさん
08/06/04 17:58:16
>>309
不動点として処理系を求めることなんてできるのかな?

>>310
世代を増やしてやれば一様収束に近いかな?
世代数より、使える要素の数に対する候補数や木構造の複雑さの許容範囲の方が
解に対して大きく影響を与えるようだよ。
その辺のパラメータを上手に与えないとGPが正しい解を返してくれない。
理論的なことはよくわからないんだけど。

315:デフォルトの名無しさん
08/06/04 20:28:22
>>312
GPは未だに魔法みたいに見える
Yコンビネータとambは解説読むと目から鱗だった(ガッテンボタンいっぱい押す感じ)



316:デフォルトの名無しさん
08/06/04 20:56:57

∩ヘ~

317:デフォルトの名無しさん
08/06/04 21:07:13
best score of generationが0.001以下なら安心できる解が得られてるというのを目安に使ってる。
理屈抜きにw

318:デフォルトの名無しさん
08/06/04 21:32:08
URLリンク(codepad.org)
この例だと3番目で0.001以下なので正しいと考える。
伊庭研HPにもそう書いてあるw

319:デフォルトの名無しさん
08/06/04 21:42:20
試しにcos x の微分を解かせてみた。一発回答だった。スゲーw
URLリンク(codepad.org)

320:デフォルトの名無しさん
08/06/05 02:17:01
GPってなんすか?

321:320
08/06/05 02:18:48
>>319を見て解決しました
> ; Genetic Programming with Scheme

322:デフォルトの名無しさん
08/06/05 08:19:19
>>314
表示的意味論では、表示関数は不動点。

323:デフォルトの名無しさん
08/06/05 09:58:56
GP=Graham,Paul

324:デフォルトの名無しさん
08/06/05 15:47:07
Little Schemerって何が言いたいのかよくわからないところが多々あるのですが、
ものまね鳥やSICPやいろいろ読んだらありがたみがわかるようになるの?

325:デフォルトの名無しさん
08/06/05 16:51:54
hogehoge schemerシリーズを買おうと思ったら
近くの本屋だとsicpとsimply schemeしか置いてねぇ・・・

326:デフォルトの名無しさん
08/06/05 16:54:50
>>325
それだけ置いてありゃ立派なもんだよ

327:デフォルトの名無しさん
08/06/05 18:06:39
>>325
都会はええのう。うちの近所じゃエクセル本しかないw

328:デフォルトの名無しさん
08/06/05 18:23:27
>>324
シリーズ3冊読んで初めて意味がわかる。
微積とかの数学を知らない人向けのSICPだったのかと。
だから数学が得意な大学生は最初からSICPでいいと思う。
CSを専攻しようか迷ってるならシリーズ3冊を読んだ後ものまね鳥を読んでみると自分の適性が判断できるよ。

ありがたみっていう意味をどう使ってるかによるけど、CSとはどういうものかを知るという意味ではいい本。
何が言いたいのかわかるというのは、CSとはどんなことがらに興味の対象をもっている分野かを理解すること。
それがわからなくてもプログラムは作れる。
けど、バグが入りこまないような理論的裏づけとか、論理プログラミングが欲しいときがそのうちクルと思う。
そのときが来る前の先行投資と思えば安いもんだと思うよ。
悩んで考える時間は若いときにしか持ち得ないからガンガレ。


329:デフォルトの名無しさん
08/06/05 20:12:01
javascriptしかいじったことのないゆとりがSICP読んでるんですけど、
schemeは無名関数内で再帰呼び出しって出来ないんですか?

lambdaの中でそのlambdaを呼び出すみたいな。

javascriptだと
(function(x){return (x)?x+arguments.callee(x-1):0; })(10);
とかやって使うやつなんですけど…

高階演算のとこで使いたいんですが、調べてもうまく見つからなかったです。



330:デフォルトの名無しさん
08/06/05 20:22:55
>>329

(((lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))))
(lambda (func-arg)
(lambda (n)
(if (zero? n)
1
(* n (func-arg (- n 1)))))))
5)

Yコンビネータの雛形が内蔵されている階乗関数になってます。

331:デフォルトの名無しさん
08/06/05 20:23:00
↑みたいなFAQネタ誰かまとめろ

332:デフォルトの名無しさん
08/06/05 20:29:38
(((lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))))
(lambda (func-arg)
(lambda (l)
(if (null? l)
'no-list
(if (null? (cdr l))
(car l)
(max (car l) (func-arg (cdr l))))))))
'(4 5 6 3 4 8 6 2))

333:329
08/06/05 20:29:43
>>330
どうも、ありがとうございます。
なにやら複雑ですね。

>>331
既出でしたか。失礼しましたー


334:デフォルトの名無しさん
08/06/05 20:34:32
(define Y
(lambda (X)
((lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg))))
(lambda (procedure)
(X (lambda (arg) ((procedure procedure) arg)))))))

335:デフォルトの名無しさん
08/06/05 20:35:29
>>330はこう書いてもよい。

(define F*
(lambda (func-arg)
(lambda (n)
(if (zero? n)
1
(* n (func-arg (- n 1)))))))

((Y F*) 5)

336:デフォルトの名無しさん
08/06/05 20:36:15
>>332はこう書いてもよい。

(define M*
(lambda (func-arg)
(lambda (l)
(if (null? l)
'no-list
(if (null? (cdr l))
(car l)
(max (car l) (func-arg (cdr l))))))))

((Y M*) '(4 5 6 3 4 8 6 2))

337:329
08/06/05 20:42:03
>>332
>>334
>>335
>>336

皆さんありがとうございます。なんかすみません。
どれも微妙に難しいコードですが、がんばって理解します。


338:デフォルトの名無しさん
08/06/06 02:15:18
>>328
丁寧なレスありがとうございます。
multirember&coとかアッカーマン関数とか、totalとpartialがどうしたとか、
これらを導出する事で何を言いたかったのかが今ひとつピンときませんでした。
まあ、でも一応Seasonedまでは読もうかと思っています。

339:デフォルトの名無しさん
08/06/06 06:25:04
>>328
> 微積とかの数学を知らない人向けのSICPだったのかと。
> だから数学が得意な大学生は最初からSICPでいいと思う。

これは嘘。目的が全然違う。

340:デフォルトの名無しさん
08/06/06 18:21:20
>>339
どんな本ですか?

341:デフォルトの名無しさん
08/06/06 20:34:58
SQL> SELECT COUNT(*) FROM SICPが好きな人;
----
  1

(,,゚∇゚) !!

342:デフォルトの名無しさん
08/06/06 21:23:17
(define-syntax swap
(syntax-rules ()
((swap a b) (let ((tmp b))
(set! b a)
(set! a tmp)))))

(define-syntax display-line
(syntax-rules ()
((display-line x)
(begin
(display x)
(newline)))))


(define tmp 5)
(define other 6)

(swap tmp other)

(display-line tmp)
(display-line other)

343:デフォルトの名無しさん
08/06/06 21:35:26
(define-syntax rotate
(syntax-rules ()
((rotate a) (void))
((rotate a b c ...) (begin
(swap a b)
(rotate b c ...)))))

(define x 1)
(define y 2)
(define z 3)
(define w 4)

(rotate x y z w)

(display-line x)
(display-line y)
(display-line z)
(display-line w)

344:デフォルトの名無しさん
08/06/06 21:37:26
(define-syntax rotate2
(syntax-rules ()
((rotate2 a c ...)
(shift-to (c ... a) (a c ...)))))

(define-syntax shift-to
(syntax-rules ()
((shift-to (from0 from ...) (to0 to ...))
(let ((tmp from0))
(set! to from) ...
(set! to0 tmp)) )))


(rotate2 x y z w)

345:デフォルトの名無しさん
08/06/06 23:00:40
(require (lib "time.ss" "srfi/19"))

(date->string (current-date) "~Y/~m/~d(~a) ~H:~M:~S")

346:デフォルトの名無しさん
08/06/07 02:08:30
インデント付きで見る用のアンカー

>>342-345

347:デフォルトの名無しさん
08/06/07 12:50:40
誰か教えてくれ

学校の課題で困った

点(x,y) が 傾き a 、y切片が b である 直線 の 上部にあるか、 下部にあるかを 判断する updown? 定義せよ。

ただし、

上部にあるとき #t
下部にあるとき #f

を値として返すように せよ


348:デフォルトの名無しさん
08/06/07 12:56:50
中学校からやり直せ

349:347
08/06/07 13:03:03
>>348
それは一理ありますね

1次関数の勉強をしなおしてもみましたが、ダメでした

350:デフォルトの名無しさん
08/06/07 13:05:58
>>347
ほらよ。そのまま提出しろよ
(define (updown? a b)
"直線上にあったら何を返せばいいんだよこんなクソ問題だすやつは死ね \
もちろん単位なんていらん")


351:347
08/06/07 13:12:11
>>350
ストレートな回答ありがとうございます

私の説明不足です

直線上は考慮するなとのことでした



352:デフォルトの名無しさん
08/06/07 13:18:15
こんな世界に生まれたことを呪いながら人生をリセットすべし

353:デフォルトの名無しさん
08/06/07 13:25:09
>>351
直線上を考慮しないなんてありえない。一次関数の場合、端点が
常に極値になるのだから、直線上かどうかを調べるのは最も重要なことだ。
そんな教師はそちらから願い下げなさい。

354:デフォルトの名無しさん
08/06/07 13:44:58
まずは「上部」と「下部」のテイギからはじめないとな。

355:デフォルトの名無しさん
08/06/07 14:21:14
プログラムを組めないってんならまだしも、一次関数の定義がわからんてどういうことだ?
既知のxを使って算出できる一次関数の値と対象yの値を比べれば良いってアホでもわかりそうなものだが。


356:デフォルトの名無しさん
08/06/07 14:23:56
傾きとか切片とかの意味が判ってないんじゃね?

357:デフォルトの名無しさん
08/06/07 14:25:29
Schemeの課題ってことは大学生以上だと思うけど、一次関数がわからなくても
最近は大学に入れるんだなあ。日本って本当に滅亡にむかってるのだなあ・・しみじみ。

358:デフォルトの名無しさん
08/06/07 14:31:06
大学の定員って志願者より多いらしいから誰でも入れるんじゃね?w

359:デフォルトの名無しさん
08/06/07 14:35:05
>>354
それは、地図の上と下のテイギを決めるようなもんだw

360:デフォルトの名無しさん
08/06/07 14:37:27
上下(じょうげ、うえした)とは、六方位(六方)の名称の一つで、高さ・深さを指す方位の総称。
一定方向に重力のある環境で、重力場の向かう方向、即ち物体が落ちる方向を下(した)、
その対蹠で物体が登る方向を上(うえ)という。
出典: フリー百科事典『ウィキペディア(Wikipedia)』

361:デフォルトの名無しさん
08/06/07 14:40:43
>>357
中学校の総合の時間だったりしてw

>>351
直線の式にxの値を代入してyの値を比較すればわかるだろ

362:デフォルトの名無しさん
08/06/07 14:41:47
地図の上下なら等高線で見て高いほうが上、低いほうが下ってことだな

363:デフォルトの名無しさん
08/06/07 14:44:27
>>347
 class Point
  attr :x, :y
  def initialize(x, y)
  @x, @y = x, y
  end
 
  def updown?(a, b)
  (@y > a * @x + b) ? "#t" : "#f"
  end
 end
 
 a, b = 1, 5
 p = Point.new(1, 5)
 puts p.updown?(a, b)

364:デフォルトの名無しさん
08/06/07 14:47:30
↑変な言語きたー!w

365:デフォルトの名無しさん
08/06/07 14:52:26
>>363
ちょっと見ないうちにLISPも変わったな

366:デフォルトの名無しさん
08/06/07 14:52:44
見た感じRuby?

367:デフォルトの名無しさん
08/06/07 14:59:39
(define updown? (lambda (a . b) (lambda (x . y) (cond ((> y (let ((k x)) (+ b (* a k)))) a (define t #t) t) (else (not #t))))))
(display "こうですかわかりません")

368:デフォルトの名無しさん
08/06/07 16:30:01
ルビーか。@ とか無けりゃ見やすそうなのになあ。惜しい言語だ。

369:デフォルトの名無しさん
08/06/07 17:53:13
ぐはw
釣りだよ。久々にRuby厨降臨か。

370:347
08/06/07 18:18:41
>>363
Ruby…うちの学校じゃやらないと思います

371:デフォルトの名無しさん
08/06/07 18:43:09
予想以上に'end'がキモすぎる

372:デフォルトの名無しさん
08/06/07 18:45:04
MatzLispがどうかしたか?

373:デフォルトの名無しさん
08/06/07 18:59:28
>>14

374:デフォルトの名無しさん
08/06/07 20:01:04
Ruby叩かれまくっててワロタ。
でも、Schemeで答え書いちゃったら>370の勉強にならんからな。つまらんし。

>>368
最近は継承の問題もあって、@使う人少ないよself.xとするのが主流
>>371
endぐらいなんだよ。お前なあ、fortran9xなんかend do/end if/end program
なんだぜ。それに比べりゃたかが三文字だし、
明示的にブロックの終わりを指定できてうれしいじゃん。

375:デフォルトの名無しさん
08/06/07 20:02:53
>>374
>明示的にブロックの終わりを指定できてうれしいじゃん
GuidoLispに対する挑発行為ですねわかります

376:デフォルトの名無しさん
08/06/07 20:07:11
>>374
あの syntax ならむしろ end class とかのほうが良かった。
なんかアンバランスな感じなんだよ。

377:デフォルトの名無しさん
08/06/07 20:09:09
> 明示的にブロックの終わりを指定できてうれしいじゃん。
君は数式読み上げるときに「カッコ閉じる」って言って快感を得る人かな?

378:デフォルトの名無しさん
08/06/07 20:10:32
endの対としてbeginがないのは確かに気持ち悪い
なくてもわかるけどさw

379:デフォルトの名無しさん
08/06/07 20:11:55
class

ssalc
とか

それはそうとSchemeのbeginはなんとかしてほしい

380:デフォルトの名無しさん
08/06/07 20:16:22
Ruby厨の弁解ウゼー

381:デフォルトの名無しさん
08/06/07 20:19:01
>>378
Wirthキター

ってModula-*もないとこはないよな。> BEGIN

382:デフォルトの名無しさん
08/06/07 20:20:20
Lispもcondの次の((いらねえんじゃね?

383:デフォルトの名無しさん
08/06/07 20:25:36
>>382
Paul Graham乙


384:デフォルトの名無しさん
08/06/07 20:29:09
>>377
>君は数式読み上げるときに「カッコ閉じる」って言って快感を得る人かな?
ハァ? 普通言うだろ。閉じカッコの位置が違ったら意味が変わっちゃうこと
もあるし。演算子優先順位の存在しないLisperはこれだから無頓着で困る。

385:デフォルトの名無しさん
08/06/07 20:30:27
ちなみに、Emacsのruby-modeならendはC-cC-eで自動補完してくれるので
書き手が気にする必要はない・・・・ってなんかどっかで似たような話を
聞いたことがあるようなないような。

386:デフォルトの名無しさん
08/06/07 20:31:43
「カッコ閉じる」は言うな。国家国家言う奴もいたけど。w

387:デフォルトの名無しさん
08/06/07 20:33:24
インデントで優先順位を決めるSchemeの変種を考えるやつが居そう

388:デフォルトの名無しさん
08/06/07 20:35:24
そろそろRuby厨KY

389:デフォルトの名無しさん
08/06/07 20:51:26
>>384
> 演算子優先順位の存在しないLisperはこれだから無頓着で困る。

かなりハズしたねw
)ないと困るのはLispでも一緒

390:デフォルトの名無しさん
08/06/07 21:17:07
演算子優先順位なんてまるで関係ないよなw

391:デフォルトの名無しさん
08/06/07 21:19:23
どうやらrubyさんの思考もendのようですね

392:デフォルトの名無しさん
08/06/07 21:23:13
そこでcommon lispのprognですよ

393:デフォルトの名無しさん
08/06/07 21:31:23
progn = beginなら
prog0 = begi0?

394:デフォルトの名無しさん
08/06/07 22:16:36
ANSI Common Ruby

395:デフォルトの名無しさん
08/06/07 22:43:44
漏れの出た学科では「こっか」と読んだ。)。

396:デフォルトの名無しさん
08/06/07 22:51:06
一呼吸置くだけで無問題。いちいちカッコトジルとか言わんでも分かるやろ。まさにKY

397:デフォルトの名無しさん
08/06/07 22:52:14
オッカッ

398:デフォルトの名無しさん
08/06/07 22:52:14
かっこ閉じるがデフォだったが
学校に1人はこっかと読ませる先生がいてだな

399:デフォルトの名無しさん
08/06/07 22:57:33
こっか? シェルスクリプトみたいだよ
if ....

fi

case ....

esac

400:デフォルトの名無しさん
08/06/07 23:17:51
こういうのはどうだろう?

( : かっ
) : っこ

( + 1 2 )
かっ プラ いち に っこ

401:デフォルトの名無しさん
08/06/07 23:30:58
>>396
Haskellの$みたいなのならそれでもいいけど
全部一気に閉じない場合は?

402:デフォルトの名無しさん
08/06/08 00:39:25
>>398
書籍にもあるから結構メジャーなんだと思ってるが。

403:デフォルトの名無しさん
08/06/08 04:32:00
>>400
Dirac先生まで来た!

404:デフォルトの名無しさん
08/06/08 05:23:10
竹内郁雄先生が「こっか」派だった気がする

405:デフォルトの名無しさん
08/06/08 11:41:42
「ぱー」と「れん」だってJargonか何かにあったような

406:デフォルトの名無しさん
08/06/08 13:04:47
Ex. This is Yet Another CPS. Explain it!

(define M
(lambda (f)
(lambda (ls)
(cond
((null? ls) '())
(else (cons (f (car ls)) ((M f) (cdr ls))))))))

(define (add1x) (+ 1 x))

((M add1) '(1 2 3)) ;=> '(2 3 4)

407:デフォルトの名無しさん
08/06/08 13:16:12
本物のCPSならループの途中で脱出できるはずだ

408:デフォルトの名無しさん
08/06/08 13:19:46
>>405
さすがに海外にはnerapと呼ぶ猛者はいないか。アーカードとかレッドラムみたいな。

409:デフォルトの名無しさん
08/06/08 14:07:48
>>407
人生の敗北者

410:デフォルトの名無しさん
08/06/08 15:26:30
何故そう思う?

411:デフォルトの名無しさん
08/06/08 17:32:49
ErlangでConcurrent Scheme作った人挙手ノシ

412:デフォルトの名無しさん
08/06/08 17:35:11
upyr

413:デフォルトの名無しさん
08/06/09 01:02:50
>>406
あ、出典わかって納得w

414:デフォルトの名無しさん
08/06/09 03:00:01
Gauche民もこのスレに集まるの?

415:デフォルトの名無しさん
08/06/09 07:00:06
難民呼ばわりかよ

416:デフォルトの名無しさん
08/06/09 22:34:40
最近Schemeの勉強はじめたんすけど、再帰が全く理解できない・・・orz
誰か助けてー\(*_*)/

417:デフォルトの名無しさん
08/06/09 22:41:56
再帰の何が理解できないんだてめえコラァ!

418:デフォルトの名無しさん
08/06/09 22:57:53
hogehoge lisperシリーズの出番だな

419:デフォルトの名無しさん
08/06/09 23:09:27
>>416
再帰ではなく、単なる手続き呼び出しだ、と思えば良い。
たまたま自分自身を呼んでいるだけ。

420:デフォルトの名無しさん
08/06/09 23:12:26
構造帰納法を思い出せばいい

421:デフォルトの名無しさん
08/06/09 23:12:46
>>416
他言語で再帰を使った経験は?

422:デフォルトの名無しさん
08/06/09 23:47:57
>>416
(ローカル)変数の寿命とスコープって聞いてスッと頭に入ってくる?
いや、COBOLer とかの、ローカル変数って概念がない人がいたりするので。


423:デフォルトの名無しさん
08/06/09 23:52:45
みんな親切で驚きました
もうちょっとがんばってみようと思います


424:デフォルトの名無しさん
08/06/10 07:07:26
416の人気に嫉妬

425:デフォルトの名無しさん
08/06/10 19:59:03
Gaucheのウィンドウズ版のバイナリって日本語使えない上に、
lambdaもちゃんと動作しないという認識であってますか?

426:デフォルトの名無しさん
08/06/10 20:01:32
んなあほな

427:デフォルトの名無しさん
08/06/10 20:06:56
いやマジっすマジっす
こんな感じで計算してくれない

gosh>(define test (lambda (a b) (*a b)))
gosh>test 1 5
1
5

428:デフォルトの名無しさん
08/06/10 20:20:12
>>427
(test 1 5)


429:デフォルトの名無しさん
08/06/10 20:24:49
これは流石にネタだろw

430:デフォルトの名無しさん
08/06/10 20:35:32
僕もネタに一票w

431:デフォルトの名無しさん
08/06/10 20:35:44
びっくりした

432:デフォルトの名無しさん
08/06/10 21:27:09
(define test (lambda (a b) (*a b)))
test 1 5
=>
#<procedure:test>
1
5

433:デフォルトの名無しさん
08/06/10 21:27:49
次は *a で引っかかるだろうな

434:デフォルトの名無しさん
08/06/10 21:36:34
>>428さんの言うとおりやると

(define test (lambda (a b) (*a b)))
(test 1 5)
=>
reference to undefined identifier: *a

となってしまうでしょう。2段構えの手の込んだネタw

435:427
08/06/10 23:05:55
あwwwwwwwwwwwwwwwww

436:デフォルトの名無しさん
08/06/10 23:17:47
>>435
天然キャラ乙。

437:デフォルトの名無しさん
08/06/10 23:45:38
日本語の方のネタもご披露を

438:427
08/06/10 23:50:19
gosh> (print "hello")
#<undef>
gosh> (print "こんにちは")
*** READ-ERROR: Read error at "(stdin)":line 2: EOF encountered in a string lite
ral: "ツつアツ・
Stack Trace:
_______________________________________
gosh> *** ERROR: unbound variable: ツソツ
Stack Trace:
_______________________________________
gosh> *** READ-ERROR: Read error at "(stdin)":line 2: extra close parenthesis
Stack Trace:
_______________________________________
gosh>

439:デフォルトの名無しさん
08/06/10 23:52:37
>>438
> gosh> (print "hello")
> #<undef>
> gosh>

ちょっと待て

440:デフォルトの名無しさん
08/06/11 00:07:52
ごめん
1~3行目はこうだったw

gosh> (print "hello")
hello
#<undef>


441:デフォルトの名無しさん
08/06/11 00:42:26
Gaucheのネイティブコードと入力したエンコードを言ってみろ。

442:デフォルトの名無しさん
08/06/11 00:50:31
そんなことが判るくらいなら悩まんだろw

443:デフォルトの名無しさん
08/06/11 00:56:14
C:\>gosh -V
Gauche scheme interpreter, version 0.8.13 [utf-8]

入力したエンコードとは!?
コマンドプロンプトにもエンコードとか指定できるんですか
ちなみにテキストファイルにコード書いてShift_JISで保存・実行しても文字化けしました

444:デフォルトの名無しさん
08/06/11 01:25:28
>C:\>gosh -V
>Gauche scheme interpreter, version 0.8.13 [utf-8]

>ちなみにテキストファイルにコード書いてShift_JISで保存・実行しても文字化けしました

>>[utf-8]

445:デフォルトの名無しさん
08/06/11 01:55:19
>>444
UTF-8で保存してみたけどやっぱりダメでした

D:\>gosh test.scm
縺薙s縺ォ縺。縺ッ


あとコマンドプロンプトでそのままコード書いてもやっぱり文字化けですから
これは不具合というか実験中ということで未対応なんでしょうね

446:デフォルトの名無しさん
08/06/11 01:57:39
ちがいます

447:デフォルトの名無しさん
08/06/11 02:07:37
そうですか

448:デフォルトの名無しさん
08/06/11 02:27:03
>>445
どのWindowsを使ってるかは知らないが、コマンドプロンプトで、
UTF-8でエンコードされた日本語が、正常に表示されると思った根拠は?

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

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

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

450:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/06/11 03:33:43
そこまで判ってて、なぜ「わけわからない」になるのか、わけわからないw

452:デフォルトの名無しさん
08/06/11 03:56:00
>>450
理解したみたいなので、詳しくは書かないけど、
言語自体というか、処理系が内部で使う文字コードのこと。
Gaucheの場合、EUC-JPやUTF-8、ShiftJISなどから選べる。
それで、お前さんの使ってるGaucheはUTF-8でコンパイルされてる。

確かに、Windowsのコマンドプロンプトから使うには不便だろうな。
configureに--enable-multibyte=sjisを指定してコンパイルし直すか、
Emacs経由で使った方がいいと思うぞ。

URLリンク(practical-scheme.net)

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

454:デフォルトの名無しさん
08/06/11 08:44:57
>>451
毒を出しすぎ。

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

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

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

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

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

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

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

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

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

459:デフォルトの名無しさん
08/06/11 12:50:18
>>458
自分の読解力のなさを棚にあげるのはやめようぜ

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


461:デフォルトの名無しさん
08/06/11 13:03:57
というか、国際的にもLisp/Schemeは日本では大人気。

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

463:デフォルトの名無しさん
08/06/11 13:04:37
ごめん459だった。

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


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

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

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


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

469:デフォルトの名無しさん
08/06/11 14:23:47
コンプレクッスですか

470:デフォルトの名無しさん
08/06/11 14:24:44
>>455が理解できない一人でーす。

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

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

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

473:デフォルトの名無しさん
08/06/11 15:34:47
>>465
このへんに問題点が書かれている。
URLリンク(practical-scheme.net)
これはVC++の話だけどMinGWも同様と思われる。


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

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

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

477:デフォルトの名無しさん
08/06/11 16:08:45
455、人気者だなw

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

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

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

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

480:デフォルトの名無しさん
08/06/11 17:05:39
マルチかよ

481:デフォルトの名無しさん
08/06/11 17:08:28
これは酷い

482:デフォルトの名無しさん
08/06/11 17:29:13
>>455-479の人気に嫉妬


483:デフォルトの名無しさん
08/06/11 17:30:39
【入門】Common Lisp その4【質問よろず】
スレリンク(tech板:860番)

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

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

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

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

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



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

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


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

487:デフォルトの名無しさん
08/06/11 18:04:32
>>479
これはひどいww

488:デフォルトの名無しさん
08/06/11 18:41:12
>>485
必死すぎw

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

490:デフォルトの名無しさん
08/06/11 19:32:58
URLリンク(www.inf.hs-zigr.de)

#!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:デフォルトの名無しさん
08/06/11 20:55:25
(define λlambda)

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

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

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

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



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

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

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

496:デフォルトの名無しさん
08/06/12 02:19:25
極めて教育的な良い教科書だな

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

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

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

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

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



501:デフォルトの名無しさん
08/06/12 02:55:49
>>494
昔pascalとくれば東大の学生だったんだな。

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

503:デフォルトの名無しさん
08/06/12 03:48:30
再起で解け、ループで解けない問題はない。

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

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

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

507:デフォルトの名無しさん
08/06/12 09:49:54
例:「再帰を使用せよ」って指定された問題

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

509:デフォルトの名無しさん
08/06/12 10:26:12
ackermann関数を再帰なしで

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

511:デフォルトの名無しさん
08/06/12 10:44:03
gogo ackermann!!

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

513:デフォルトの名無しさん
08/06/12 11:35:21
>>510 たらい回し関数ってループに展開可能かい?


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

515:デフォルトの名無しさん
08/06/12 12:01:43
Ackもtaraiも可能です。
>>510
無限記憶領域でも等価です。

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

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

517:デフォルトの名無しさん
08/06/12 13:17:52
>>503
あたりまえじゃないか。もちろん逆も真。

518:デフォルトの名無しさん
08/06/12 13:30:10
有名な再帰画像

Drosteココア
URLリンク(en.wikipedia.org)
メリーミルク
URLリンク(mognavi.jp)

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


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

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

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

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

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

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

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

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

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

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

522:デフォルトの名無しさん
08/06/12 14:00:20
>>520
なるほど、そういう風に悩むのか。

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

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

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

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

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

525:デフォルトの名無しさん
08/06/12 14:20:38
数学的直観って言葉があるくらいだからね。

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

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


526:デフォルトの名無しさん
08/06/12 14:43:07
>>521
名文をありがとう。

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

>>525
うらやましい。

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

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

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

529:デフォルトの名無しさん
08/06/12 16:28:49
>>528
簡単に作れるからでは?

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

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

532:デフォルトの名無しさん
08/06/12 16:40:44
処理系毎の拡張で用意されてるでしょ

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

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

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

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

537:デフォルトの名無しさん
08/06/12 18:20:59
>>535
CL?Scheme?

538:デフォルトの名無しさん
08/06/12 18:27:26
俺パターンマッチ入りの俺Lisp言語だろw

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

540:デフォルトの名無しさん
08/06/12 20:22:11
まあ関数型言語だとおなじみ

541:デフォルトの名無しさん
08/06/12 20:25:28
頑張れば CLtL3 に入れてもらえるかもw

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

543:デフォルトの名無しさん
08/06/12 21:05:06
consp
pair?

544:デフォルトの名無しさん
08/06/12 21:41:28
来月「Practical Common Lisp」の訳書が出るっぽい
URLリンク(www.bk1.jp)

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

546:デフォルトの名無しさん
08/06/12 21:54:10
>>543
「List」だけどnilじゃない

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

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

548:デフォルトの名無しさん
08/06/12 22:57:14
CLOSがパターンマッチみたいなものだと思うのですが

549:デフォルトの名無しさん
08/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系ならパターンマッチはライブラリで自然に実装できる範囲だから、
あえて入れなかったのでは。

550:デフォルトの名無しさん
08/06/12 23:39:31
>>546
nilは「List」だけど。
おまいのListの定義がおかしいだけ。

素人増えましたな。

551:デフォルトの名無しさん
08/06/12 23:46:00
Listだけどnilじゃないのを一発で判別する関数
(define (non-nil-list? x)
 (and (not (null? x))
    (list? x)))
が組み込みであるか?てことでしょ。
これはSchemeのコードだけど。
コンスとリストを混同してるのでは?

552:デフォルトの名無しさん
08/06/12 23:55:31
(and (consp x) (listp x))を一発で判別したい

conspだけでいいのでは

よくない

?←今このへん

553:デフォルトの名無しさん
08/06/12 23:56:48
自分で述語用意すればいいじゃん・・。


554:デフォルトの名無しさん
08/06/13 00:04:15
点対神経症だろw

555:デフォルトの名無しさん
08/06/13 00:07:37
CLの listp (点対でも真)とSchemeの list? (点対だと偽)の差が混乱を招いているのでは?

556:デフォルトの名無しさん
08/06/13 00:25:34
>>535みたいなどこかの俺言語で育っちゃった人は
一度まじめにどっちかで矯正した方がいいよ。


557:デフォルトの名無しさん
08/06/13 00:34:25
狼に拾われたがパンダに育てられて観賞用に


558:デフォルトの名無しさん
08/06/13 02:00:34
どっかってどこ?
MITとかUCBあたり??

559:デフォルトの名無しさん
08/06/13 02:02:26
このスレとかでいいんじゃね?w

560:デフォルトの名無しさん
08/06/13 02:07:30
535の脳内のどこか

561:デフォルトの名無しさん
08/06/13 02:30:21
>>556
これから独学でLisp習おうと思ってる。
今までプログラミング言語を真っ当に習ったことはなくUNIXのBシェルスクリプトが
ちょっと使えるくらい。

こんな自分が、あとから矯正の必要がないように正しく学ぶためにはどうすればいいですか?


562:デフォルトの名無しさん
08/06/13 02:35:00
>>561
訳書は見てないけど >>544 なんて良いんじゃないかな。
実用的な例題で勉強できるから飽きないと思うよ。

563:デフォルトの名無しさん
08/06/13 02:37:43
>>561
わたしゃ独学でCLを学んでたけど、
定番の本だけはきっちり抑えておくとそこから、書き方を学ぶことができるよ。
もちろん、本に載ってなくって、知っておいたほうがよい方法やスキルというのも
あるけど、それは実際に勉強会などを通じて人とのコミュニケーションをとっていく
事からだと思うな。

別に俺様言語でもいいけどさ。矯正は必要な場合はあるけど、実際に回りにschemer
がいるかといえば別の問題があるからね。その点は指摘してる>>556というのは
恵まれた環境を持っているといえるね。最近はハブサイトもできつつあるから、
独学者にとってもよい時代がくると思うよ。shiroさんのサイトみたいに人が集まってるとこ
ろは自分から積極的に恵まれた環境を作るきっかけにはなるよ。



564:デフォルトの名無しさん
08/06/13 02:40:26
定番ってのは、ANSI Common LispやPractical Common Lisp, PAIPあたりだけど。
オンラインのみで流れているスタイルに対してのよいドキュメントは
先日g000001さんたちがやっていたNorvig and Pitman 1993 (和訳あり)をよんで
みればいい。

565:デフォルトの名無しさん
08/06/13 02:48:07
URLリンク(www010.upp.so-net.ne.jp)

これね。これはcommon lispの師匠に進められた文章でもあります。テンプレに含めて
もいいと思う。

566:デフォルトの名無しさん
08/06/13 02:51:18
>>544
ktkr

567:デフォルトの名無しさん
08/06/13 07:33:49
>>562-565
thx!

568:デフォルトの名無しさん
08/06/13 07:37:36
>>565
その文章はとてもいいよね。
でもおれdeftype使ったプログラムあんまり見たことないんだけど気のせい?

569:デフォルトの名無しさん
08/06/13 09:50:06
>>568
> でもおれdeftype使ったプログラムあんまり見たことないんだけど気のせい?

たしかにみたことがない。 あまりないのはしかたがないかも。
typecaseで場合分けすることや型宣言前提だろうし。


570:デフォルトの名無しさん
08/06/13 13:55:21
俺は情報隠蔽はpackage, CLOSの仕事と割り切ってる。
だから使ったことない。> deftype


571:デフォルトの名無しさん
08/06/13 14:24:51
>>570
微妙にわかるような、わからないような…。
でも、棲み分けだよね。

572:デフォルトの名無しさん
08/06/13 17:00:48
>>565
この文章は俺もよく参考にさせてもらいました。ちなみに原文(英語)はこちら。
URLリンク(www.cs.umd.edu)

573:546=551
08/06/13 23:36:37
>>555
なるほど。私が不勉強でした。
>>550
失礼しました。

574:デフォルトの名無しさん
08/06/13 23:57:48
で、結局Cuspは使えるのか?!


575:デフォルトの名無しさん
08/06/14 01:09:21
こういうこと?

(list? '(1 . 2)) ;=> #f
(list? '()) ;=> #t

(define (listp x)
 (and (not (null? x))
    (pair? x)))

(listp '(1 . 2)) ;=> #t
(listp '()) ;=> #f

576:デフォルトの名無しさん
08/06/14 01:14:50
(list? '(1 2)) ;=> #t


(listp '(1 2)) ;=> #t

577:デフォルトの名無しさん
08/06/14 05:38:16
まだ理解できてないじゃん
最初からおさらいしたら?

578:デフォルトの名無しさん
08/06/14 11:07:37
(list? '(1 . 2)) ;=> #f
(list? '()) ;=> #t
(list? '(1 2)) ;=> #t

(define (listp x)
 (and (not (null? x))
    (pair? x)))

(listp '(1 . 2)) ;=> #t
(listp '()) ;=> #f
(listp '(1 2)) ;=> #t

(define (non-nil-list? x)
 (and (not (null? x))
    (list? x)))

(non-nil-list? '(1 . 2)) ;=> #f
(non-nil-list? '()) ;=> #f
(non-nil-list? '(1 2)) ;=> #t

579:デフォルトの名無しさん
08/06/14 11:20:00
(define (nil-list? x)
 (not (non-nil-list? x)))

(nil-list? '(1 . 2)) ;=> #f
(nil-list? '()) ;=> #f
(nil-list? '(1 2)) ;=> #t

580:デフォルトの名無しさん
08/06/14 11:21:54
間違えた>>579

(nil-list? '(1 . 2)) ;=> #t
(nil-list? '()) ;=> #t t
(nil-list? '(1 2)) ;=> #f

581:デフォルトの名無しさん
08/06/14 12:11:14
DrScheme ver.4.0キタワ

582:デフォルトの名無しさん
08/06/14 12:24:12
URLリンク(plt-scheme.org)

583:デフォルトの名無しさん
08/06/14 12:58:53
>>578-580
いちいち無意味なもん貼るな。
自由帳はこちら。>>8



584:デフォルトの名無しさん
08/06/14 13:06:37
>>583
初心者に向かって「いちいち」とか書き込んでるオマエの方が「いちいち」ウザイw

585:デフォルトの名無しさん
08/06/14 13:07:38
初心者は放って置けば消えていくJK。

586:デフォルトの名無しさん
08/06/14 13:21:11
「On Lisp」の「第16章 マクロを定義するマクロ」スゲー

587:デフォルトの名無しさん
08/06/14 14:49:14
>>586
その気になれば作れるようになるよ。:-)

588:デフォルトの名無しさん
08/06/14 16:10:43
>>265のambをlet-syntaxするマクロを書いたら、`...' が衝突した
URLリンク(codepad.org)

こうですか?わかりません!
URLリンク(codepad.org)

589:デフォルトの名無しさん
08/06/14 16:53:50
>>588
URLリンク(codepad.org)

590:デフォルトの名無しさん
08/06/14 19:20:05
>>589
おお
PLTの拡張かと思ったがR6RSに書いてあった。thx

591:デフォルトの名無しさん
08/06/14 19:33:58
【産学連携】京大と日本IBM、大規模交通社会シミュレーションシステムを開発[08/06/11]
スレリンク(bizplus板)
URLリンク(pc.watch.impress.co.jp)

このシステムで使われてるシナリオ記述言語Qの説明を見ると、Dr.Scheme版が有る。
URLリンク(www.ai.soc.i.kyoto-u.ac.jp)


592:デフォルトの名無しさん
08/06/14 21:34:24
Dr.Scheme ver.4.0ってset-cdr!が使えないの?

593:デフォルトの名無しさん
08/06/14 23:12:54
>>592
ver372までset-cdr!が使える。
pre399ぐらいでは使えなくなってた。ver4.0は400に相当してるはずで使えないと思う。
正直、不便になった。

594:デフォルトの名無しさん
08/06/14 23:29:46
ということは、実装によってはlist?を定数時間で計算できるな

595:デフォルトの名無しさん
08/06/15 02:10:36
処理系依存の話題で恐縮ですが、Gaucheのオブジェクトシステムについてお聞きしたいです。
スレ違い、または既出だったら申し訳ないです。

用件を言うと、Gaucheのオブジェクトシステムで
スロットに対するアクセス制御は困難でしょうか?
(アクセス制御: C++, Java等にある private / public 的な機構)

現在、「プログラミングGauche」17章のオブジェクトシステムのあたりを読んでます。
自分は、Java->Ruby->(Haskell)->Scheme
とやってきたので、どうもJava的なOOの発想があるようです。
せっかくオブジェクトシステムがあるのだから、
活用しようと思っているのですが、スロットのアクセス制御が無いと不安に思います。
method内だけ参照や変更を許すようなclassを定義したいなぁと思ったのが事の発端です。

「Gauche:スロットアクセス」で検索して出てくるページが参考になったのですが、
マクロとメタオブジェクトプロトコルを駆使してました。

やはり総称関数という機構を取り入れている以上、
単純にスロットをカプセル化はできないですかね?
長文すみませんでした。


596:デフォルトの名無しさん
08/06/15 02:13:54
いわゆるメソッドと違って、総称関数は特定のクラスの所有物じゃないからねえ。
とりあえず、その辺を管理する(指定する)仕掛けがいるわなあ。

597:デフォルトの名無しさん
08/06/15 02:14:38
真面目な長文かけるならこんなゴミ溜めじゃなくてWilikiにでもかきなよ


598:デフォルトの名無しさん
08/06/15 02:18:57
>>595
アクセスコントロールはないです。

599:デフォルトの名無しさん
08/06/15 03:10:07
整備兵 『80%?冗談じゃありません!現状でジオングの性能は100%出せます!!』
シャア  『脚は着いていない』
整備兵 『あんなの飾りです。偉い人にはそれが分からんのですよ!』


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch