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


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

Lisp Scheme Part17



1 名前:デフォルトの名無しさん [2007/04/20(金) 19:41:39 ]
Lisp全般のスレです

過去スレ
Part16: pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/

http://が多すぎるらしいので分割

686 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:34:22 ]
書き込んでから気づきましたが
歴史的には接頭字の方が先なんでしたね

687 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:32:31 ]
質問です。
アトムとリストと、
car,cdr,cons,atom,eq
これでどうやって足し算が出来たりするのでしょうか?

688 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:41:01 ]
>>687
チャーチ数 でググれ

689 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:42:49 ]
リストの長さで0以上の自然数を表すのがよく使われる手だね。
そうすると足し算はappendになる。他も自分で考えてみな。



690 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:54:04 ]
あ〜、足し算はappendなのか。
だいたいイメージつかめた。
有り難うございます。

691 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:35:22 ]
ん、やっぱりなんか引っかかります。
リストの長さで0以上の自然数を表すなら、
()=0
(())=1
((()))=2
は納得できるのですが、
これでどうやってリストを表すのでしょうか?
アトムしか表現できないんじゃないんですか?

692 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:49:44 ]
()
(())
(() ())
(() () ())

693 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:35:56 ]
>これでどうやってリストを表すのでしょうか?
言ってる意味が分かんないなぁ

694 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:56:23 ]
砂場の石ころでもできる
だから何ってやつ



695 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:13:45 ]
何段階かの問答を経て、ようやく「自分が何を訊ねたいのか」を掴む質問者っているけど、
この人もそれと同様、これから自分の疑問の内容がわかるんだと思う。

696 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:36:29 ]
ttp://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001094

リスパーなら演技くらいはできないとな。

697 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:42:57 ]
マジな話、Lisperと話しするときは教養がいるよ。
プログラム言語の話とかだけじゃ相手にしてもらえない。
科学好き、数学好きとかが多すぎる。

698 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:03:06 ]
個人的には数学は敬して遠ざけておきたい

そんな僕でも立派なLisperになれるでしょうか

699 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:09:47 ]
ところで河合さんの頭は本物なの?


700 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:13:10 ]
>>698
GNU GPLを暗唱できたらあるいみ立派なLisperになれるかも!

701 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:14:31 ]
687さんは純Lispが五つの基本関数「だけ」で
本当にチューリング完全かどうか
疑問に思ってるんじゃないですか?

ちょうど1ヶ月前の自分と同じで

マッカーシーの論文斜め読みしたら
関数は五つで良いけど
→表記も含まれるから
condかifスペシャルフォームも必要みたいに感じました

本当に五つの基本関数(と真偽値)「だけ」でチューリング完全なら
自分にも教えてください

702 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:15:18 ]
Lisp と GPL は全く関係無いな

703 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:25:57 ]
おいおい、Gの付く話はやめてくれよ

704 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:35:59 ]
>>701
再帰かループがないとどうにもならんよ




705 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:41:00 ]
大前提としてλ式が必要

706 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:41:26 ]
>>704
と、いうことはcondまたはifと
関数抽象のためのlambdaが必要ということになりますか
要素としては5関数2特別式でチューリング完全

707 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:44:52 ]
そうか、lambdaだけでチューリング完全ですね
でもそうすると5関数の立場が…

708 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:48:57 ]
Lispエバリュエータを書くのに最低限必要な関数だと思うが

709 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:51:55 ]
λ算法とLispのlambdaは等価ではないので

710 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:01:19 ]
そういやifはλで表現できたんだな…。

711 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:07:44 ]
>>709
どこらへんですか?
正格評価だからですか?

712 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 00:57:12 ]
>>708
チューリング完全である≠"apply" or "eval"が記述できる
lambdaがあればチューリング完全だけど
"Lisp"の機能を満たすために5つの基本関数が必要である

ってことですか?

713 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 10:57:50 ]
リストの n 番目「以外」の要素のリストを得るにはどうすれば良いでしょうか
例えば (0 1 2 3 4 5 6 7 8 9) から 3 を除いた (0 1 2 4 5 6 7 8 9) が欲しいです
それとも、もしかすると Gauche の添付ライブラリの中にありますか…?

一応自分でも書いてみたのですが
かなり長〜くなってしまって。

714 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 11:10:12 ]
(define (exclude-nth n l)
(cond
((null? l) l)
((= n 0) (cdr l))
(t (cons (car l) (exclude-nth (1- n) (cdr l))))))




715 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 11:25:50 ]
好みの分かれるところか?
(define (exclude-nth n l) (append (take l n) (drop l ( + n 1))))

(exclude-nth 3 '(0 1 2 3 4 5 6 7 8 9))
=>(0 1 2 4 5 6 7 8 9)


716 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:12:11 ]
>>715
takeは必ずリストつくるからappend!でセルを節約したくなる貧乏性な俺


717 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:56:33 ]
レス感謝です。

>714
勉強になります。

>715
takeとdrop、こんなのあったんですね。
こんなに短くなるとは…

718 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 12:58:18 ]
まさかこのオペレータを使う日が来るとは……。

(use gauche.sequence)

(define (exclude-nth n l)
(reverse!
(fold-with-index
(lambda (i e pr)
(if (= n i)
pr
(cons e pr)))
'()
l)))

;(exclude-nth 3 '(0 1 2 3 4 5 6 7 8 9))
;; =>(0 1 2 4 5 6 7 8 9)

719 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:03:35 ]
>718
このオペレータ…とはどれのことなのか
Schemeに不慣れな私には判りませんが
…えーと…
ちょっと勉強がてら気合い入れて読んでみます…

720 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:05:28 ]
fold-right-with-index(仮称)があればreverseしなくていいのにね。


721 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:29:05 ]
fold-rightはある意味reverse以上のコスト


722 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:41:43 ]
【問題】 >>713を不完全リスト(最後のcdr部がアトム)に対しても
適用できる様にexclude-nthを拡張せよ
ex.)
(exclude-nth 2 '(0 1 2 . 3)) => (0 1 . 3)
(exclude-nth 3 '(0 1 2 . 3)) =>(0 1 2)
(exclude-nth 4 '(0 1 2 . 3)) =>(0 1 2 . 3) ;; 同値

723 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 13:59:22 ]
やってみました。あってる?
(define (exclude-nth n ls)
(cond ((null? ls) '())
((= n 0) (if (not (pair? ls)) '()
(cdr ls)))
((not (pair? ls)) ls)
(else (cons (car ls)
(exclude-nth (- n 1) (cdr ls))))))

724 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:21:52 ]
つきあってくれてありがとう。
多分合ってる。
用意してた答えはコレ

(define (exclude-nth n l)
(let loop ((n n)(r '()) (l l))
(if (pair? l)
(loop (- n 1) (if (= n 0) r (cons (car l) r)) (cdr l))
(if (null? l)
(reverse r)
(if (= n 0)
(reverse r)
(apply list* (reverse (cons l r))))))))
我ながらapply list* reverseは美しくないよな・・



725 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:28:04 ]
それって破壊もlist*も使わずに末尾再帰で書ける?

726 名前:723 mailto:sage [2007/07/04(水) 14:30:40 ]
named-letでもやってみたんだけど、いまいち自信がないというか…。
(define (exclude-nth n ls)
(let loop ((ls ls) (n n) (acc '()))
(cond ((null? ls) (reverse! acc))
((= n 0) (if (not (pair? ls))
(reverse! acc)
(loop (cdr ls) (- n 1) acc)))
((not (pair? ls)) (append (reverse! acc) ls))
(else (loop (cdr ls) (- n 1) (cons (car ls) acc))))))


727 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 14:33:34 ]
list*相当を作っちまえば・・
(define (apply-list* l)
(define (loop l)
(if (and (pair? l) (pair? (cdr l)))
(cons (car l) (loop (cdr l)))
(car l)))
(loop l))
って、これは末尾再帰じゃないしな

>>726
appendすりゃよかったのね

728 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:17:00 ]
>>709
λとlambdaが等価じゃないところ1つ見つけた
λxyz.E = λx.λy.λz.E
(lambda (x y z) E) ≠ (lambda (x) (lambda (y) (lambda (z) E)))
他にどんな違いがあるかなぁ

729 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:50:27 ]
チューリング完全を実現するのに必要な
最低限のデータ構造って何だろう。
リストが使えないとダメなのかな?

730 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:59:27 ]
例えば配列があればリストは作れる。チューリング機械の定義により何かの記憶機構は必要。

731 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:13:14 ]
SKだけでチューリング完全なのに
純Lisp5関数でチューリング完全じゃない(?)のは不思議
eqやatomがTやNILを返すんじゃなくて
carとcdrを返すなら何とかなりそうな気もする
関数を返す関数くらいは必要な気がする

732 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:16:37 ]
>>713
CL loop マクロは見易いと思う。
(defun exclude-nth (n l)
(loop for x in l and idx from 0 if (/= idx n) collect x))
だけど >>722 の不完全リストだと書けないかな。

733 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:57:12 ]
>>729
整数が1つあれば十分だろ。コンピュータのメモリなんて見方によっては
ものすごく桁数が多い1つの2進数なんだし。


734 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 00:59:48 ]
でもそれって結局、無限長の配列を仮定してることにならないかだぜ?



735 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:04:59 ]
無限長の配列でも一つの整数でも同じことだろ。
どちらか片方あればもう片方が表現できる。

736 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:19:56 ]
lispマシンってメモリアドレスって有ったんだろうか?

737 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 01:41:20 ]
>>736
Symbolics社のはタグ付きアーキだったってC-FAQに書いてあった
だからポインターが数値でない

738 名前:デフォルトの名無しさん mailto:sage [2007/07/05(木) 02:14:33 ]
>>736
なくてどうする

739 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 20:47:56 ]
read-eval-printループのevalの部分を別のコンピュータで実行させるフレームワークみたいなのってない?
作ろうと思えば簡単に出来そうなんだが、誰かやってる人いないかなと思って。

740 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:21:17 ]
slime

741 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 21:22:26 ]
>>739
readしないでevalって言うのはできるん?
sexpを通信先のマシンでreplしてるところに食わせるのならslimeがそうじゃない


742 名前:739 mailto:sage [2007/07/07(土) 21:43:31 ]
>>740-741
サンクス

gauche使ってるんだが、gauche.listenerってのを見付けた。
ちょいいじってみる。

743 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 01:23:48 ]
Gaucheでselect使ってサーバー書こうと思ってたんだけど質問。
selectで書き込み可能でも、ソケットバッファを越えたサイズを書き込もうとするとブロックするよね。
unixのwrite(2)ならバッファを全部フラッシュしないからブロックしないように書けるんだけど。
生のwrite(2)をそのままGaucheから呼べないの?

744 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 05:40:22 ]
今はできないんじゃなかったっけな。0.9までになんとかするって話だったと思う。



745 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 06:42:30 ]
>743
サーバ書くモチベをちょっとだけGaucheのソース修正に割くんだ。
そしてうまく動いたらパッチ提供してあげたら喜ばれるんじゃないかな。
ライブラリ作成者側のオナニーテストよりは実アプリによる動作テスト
の方が意味あるだろうし。

746 名前:743 mailto:sage [2007/07/10(火) 09:30:08 ]
>>744-743
了解!

綺麗なソースコードだからちょっといじってみる。
cvs headに比べると、debian etchのやつはだいぶ古いんだな。

今のところはスレッド使う方向に逃げるってのが正解みたいだね。


747 名前:743 mailto:sage [2007/07/10(火) 10:02:44 ]
アンカミスった>>744-745だった

748 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 04:17:03 ]
卒論を書かなきゃ行けないんだけれど、何も思いつかない。
思いついたとしても既に実現されている。
計算機の歴史なんてまだ100年もたっていないのに、
その先行研究の凄さにはひれ伏すしか無い、という
今日この頃の学部生なんですが、何か面白いお題ないですかね?
スペックとしてはCommon Lispが出来るくらいなんですが。
「こんな事やったら面白いんじゃないの?」
とか
「コレが無いから困っている。でもつくるのメンドイ」
っていうの有りませんか?

749 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 09:34:11 ]
>>748
S式で書ける TeX とかどうよ

750 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 15:56:13 ]
>>749
え、無いの?
HTMLをS式で表現するものがあるのに?

751 名前:749 mailto:sage [2007/07/11(水) 20:20:40 ]
いや、あるかもしれんけど。
そんなに真剣に調べたことはないんで。

752 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:16:07 ]
ちょっと違うかもしれないけどmaxima があるからなー>tex

>>748
オープンソース版のAllegroCache(OODB)作るってのはどうよ?

753 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 22:51:01 ]
皆さんお返事有り難うございます。
そりゃ、自分もいろいろ考えたんですよ。
例えば色でプログラミングできたら面白いかな〜とかね。
正方形を9分割した物が有って、
白→nil
黒→t
が決定。
んで色がいくつ塗っているかでチャーチ数を表す。
緑→(())
緑と黄色→(()(()))
だから、緑と赤は等しい訳です。直感的ではないですけれど。1=1なんで。
んで、最低限の関数の色を決める。
car→オレンジ
とかね。
でも、これじゃ関数定義できないし、逆にややこしいし、
大きい数の計算は出来ないし、データ構造の定義は出来ないし、
何の役に立つのか説明しにくい。
んで、考えれば考えるほどどうすれば良いのか分からなくなって、
皆さん卒論でどんなことしていたか質問してみたんです。
すいませんでした。

754 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 00:16:04 ]
卒論とかだと学問ぽく見せる必要があるから、Lisp 族は人気ないだろ。
強い型付けのメリットとして、とても研究な感じになるという利点があるから
卒論は Haskell とか ML 系でなんかごにょごにょするほうがお手軽じゃないかな。




755 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 00:47:38 ]
> オープンソース版のAllegroCache(OODB)作るってのはどうよ?

それならむしろAllegroStore

756 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 01:46:49 ]
>>754
>強い型付けのメリットとして、とても研究な感じになるという利点があるから
>卒論は Haskell とか ML 系でなんかごにょごにょするほうがお手軽じゃないかな。
カリー・ハワード対応の事ですか?
それで、チューリングマシンの停止問題なんかを証明しても、
そりゃ学問的だけれども新規性がないんじゃ。
誰も証明してない命題が有るなら別なんでしょうけど。
>>755
AllegroStore?AllegroCache?
なんぞコレ?
clispしか使った事無いのでいまいち何に使うのかさっぱり?
総称関数を保存して共有できるようになる代物?
そもそもデータベースを触った事が無いからデーターベースからして
よくわかんないです。




757 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 01:47:44 ]
一言で言うなら 卒論書く前にもっと勉強しろよ

758 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 02:20:34 ]
まあ4年の7月なんてこんなもんだ。

759 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 02:23:19 ]
>753
世の中にはGPGPUというものがあってだな

760 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 03:05:22 ]
>>759
自分、面白そうな事思いついたです。
CUDA使って、Lispのインタプリタ作るのってどうでしょうかね?
そして、clispとどっちが計算が速いか検討するの。
これだと、今のところ誰もやってないだろうし、
リスト処理ってGPU向きの処理だと思いませんか?

761 名前:デフォルトの名無しさん [2007/07/12(木) 04:03:19 ]
わざとっぽいのは相手にしない方が

762 名前:754 mailto:sage [2007/07/12(木) 07:51:20 ]
>>756
どっからカリーハワードだの停止性判定だの証明だのがでてきたんだよ。
そーゆうんじゃなくて、なんか小物の研究でも Haskell や ML ならそれっぽく見えるだろって事。
つうかテーマは研究室の先輩や教官とよく相談したほうがいい…。
たとえば超並列分散 Lisp をつくるぜ!!と決めたとして、周囲の支援が得られず完全自力じゃ評価もまともにできんし、学費がもったいない。

763 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 10:50:20 ]
じゃあ Lisp の型推論がどこまでできるかとか

764 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 15:26:16 ]
>>762
>そーゆうんじゃなくて、なんか小物の研究でも
> Haskell や ML ならそれっぽく見えるだろって事。
>つうかテーマは研究室の先輩や教官とよく相談したほうがいい…。
>たとえば超並列分散 Lisp をつくるぜ!!と決めたとして、周囲の支援が
>得られず完全自力じゃ評価もまともにできんし、学費がもったいない。

いや、お恥ずかしい話なんですが自分の大学は大学院が無いんで
先輩なんていないんです。
それに指導教官は「何か作れば良いよ〜」という態度なんで
自由な反面、アイデアが必要なんです。
自分の友達は「大学のSNSをxoopsで作る」でOKと言われてました。
自分は「さすがにそれじゃアレかなぁ」と思って。
自分はCUDAでLisp処理系は面白い案だなと思います。
誰でも思いつきそうだけれど、今のところ誰もやってないし、
自分の処理系欲しかったんで。
それじゃ、パソコン買うところから始めなきゃならないんですが(Macなんで)
頑張ってみますね。
C言語は1年くらい触ってないし、マルチスレッドプログラミングは初めてなんで
不安ですが。
出来たらUpするんで、コードレビューしてください。
タライ回し関数が速く動くといいなぁ。



765 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 16:20:23 ]
逐次処理しなきゃだめな部分は早くならないんじゃないのかな。


766 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 16:34:47 ]
>>764
くそうらやましす

767 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 20:12:46 ]
一口で大学と言ってもピンキリなんだな

768 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 21:17:35 ]
型推論 1 (変数、戻り型が単一の型に定まる物)
(define (ack m n)
(cond ((zero? m) (+ n 1))
((zero? n) (ack (- m 1) 1))
(else (ack (- m 1) (ack m (- n 1))))))

(ack (m ?x) (n ?y)) : (result ?z) から ?x ?y ?zの型を求める

(zero? m) => (type_a) : bool
1 => int
(+ n 1) => (int int) : int から ?x = int
(zero? n) => (type_a) : bool
m, nがintなのでzero?の引数は intと仮定して良い
(- m 1) => (int int) : int から ?y = int
末尾コンテキストは+ とackのみなので?z = int
これでack内の +-zero?演算子はintという前提で最適化でける

・・という感じで良い?


769 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 21:36:38 ]
>(tail-map list '(a b c . d))
=>((a) (b) (c) d)

(define (tail-map proc x)
(let loop ((l x))
(if (pair? l)
(cons (proc (car l)) (loop (cdr l)))
(proc l)))) ;procをcdrにも適用する

(tail-map (proc ?x) (x ?y)) : (result ?z) から ?x ?y ?zの型を求める

(l ?v) = ?x
(pair? l) (type_a) : bool
この中ではl = pairと確定
(car l) => (pair) : type_b
(cdr l) => (pair) : type_c
(proc 〜) (type_a) : type_d
(loop 〜) (type_c) : type_e
(cons 〜) (type_b type_c) : pair
(proc not-pair) : type_f
以上からprocは1引数でtype_aまたはnot-pairを受け取りtype_d|type_fを返す、
xはpairかnot-pair
tail-map の戻り型は pair もしくはprocの戻り型に依存

・・・もうわかんね

770 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 22:08:54 ]
Schemeが(Haskellほどでないけど)関数的であるとされる根拠の1つに
識別子が一度ある場所に束縛されると
他の場所に束縛を変更される事がないっていうのがあるけど
それをいうならCだって同じですよね?
一度宣言した変数のアドレスはスコープ内で一定

むろん関数的であるという最大の根拠は関数が第一級の値であるというところにつきるんでしょうけど

でもR5RSでは関数のリテラル表記はない、でもそれぞれの実装でサポートしてもよいって扱いですけどね
lambdaは関数のリテラル表記だっていう解説もちらほら見ますが

771 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 22:12:32 ]
「識別子が一度ある場所に束縛されると他の場所に束縛を変更される事がない」ことが
「関数的である」とは思わないけど

772 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 22:22:29 ]
>>771
いや、参照透過性とは関係ないのに
識別子の束縛が変更されない事に言及する解説をよく見る気がしたので

773 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 22:25:43 ]
ヒント: 言論の自由

774 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 23:20:13 ]
>>768
なんかところどころよくわかんないような。

自分で目の子でやったらこんな感じになったけど、どうかな。
まず (zero? m) から m : number
次に (+ n 1) から n : number
だから ack : number * number -> ?z で
else 節の (ack (- m 1) (ack ...)) の第二引数を見ると ?z = number
∴ ?x = ?y = ?z = number



775 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 23:43:17 ]
zero?って渡される引数がnumberのみと限定していいのかな。
リストとか入ってきたらエラーでいいんだっけ?
まあそういう判定が減るから全体で3倍ぐらい速くなるかな。

それはそれとして、ackみたいな単純なケースは結構作ってるうちに
適当なのができそうだからどうでもいいと思う。
問題は型が定まらない場合。
上、named-let余計だった。
(define (tail-map proc l)
(if (pair? l)
(cons (proc (car l)) (tail-map proc (cdr l)))
(proc l)))
まあ普通のmap1でもいいけど。
(define (map1 proc l)
(if (pair? l)
(cons (proc (car l)) (map1 proc (cdr l))) '()))

この場合procが確定するまで保留にすべきなのかな?
procは1引数取って何か返す、ぐらいの情報しかないよね。

776 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 23:50:20 ]
>>775
> zero?って渡される引数がnumberのみと限定していいのかな。
R5RS みると (zero? z) と書いてあって、 z は複素数を表すメタ変数ということだから
そこは問題ないと思う。

で、今気付いたけど = にしてしまうとまずいね。例えば三行目で
(zero? n) が (<= n) だったりすると number ではダメで、
real に推論されなきゃいけない。

777 名前:デフォルトの名無しさん mailto:sage [2007/07/12(木) 23:59:38 ]
いや、この際大雑把に「数字かどうか」ぐらいの区別でよくないですか?
アドホックにでも最適化に結び付けて、お手軽に型推論による効果
を体感したいというか。
>>775のmapにしてもフローチェックすればpair?の判定で
car/cdrのpair判定が省略できるとか、そんなレベルから徐々に
大掛かりな仕掛けを考えていければいいかなと。

778 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 00:01:00 ]
>>777
うん、その方が健全な気がしてきた

779 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 08:55:16 ]
え、そのほうが soundnessがいえるんですか?

と、あえて誤読をしてみる。


780 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 13:14:34 ]
誤読というより誤爆?

781 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 06:51:44 ]
俺、凄い事思いついた!
GHC立ち上げると、
Prelude>
ってでるじゃん。
なんでプレリュード?とずっと思ってたんだけれど、
これってもしかして、
Franz Lisztの前奏曲から来てるんじゃないの?
リストつながりで。

782 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 12:17:40 ]
Franz Lisp

783 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 13:50:04 ]
>>781
prelude って一般名詞じゃないの?

784 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 16:01:21 ]
俺も Prelude は一般名詞だと思う。



785 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 16:54:13 ]
ネタにマジレスなんとやら

786 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 16:58:10 ]
ネタにマジレスを重ねるというネタだったのにマジレスされた…






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

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

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