Lisp Scheme Part19
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/01/14(月) 00:14:56Part18: 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://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html
0002デフォルトの名無しさん
2008/01/14(月) 00:16:31日本Lispユーザ会(日本語) http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。 削るとAllegro Common Lispのページへ
プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。
Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。
Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。
慶応の授業のページ・記号処理プログラミング 2001
ttp://buri.sfc.keio.ac.jp/lisp/menu.html
Practical Scheme(日本語)
ttp://practical-scheme.net/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)
0003デフォルトの名無しさん
2008/01/14(月) 00:17:08CLtL2: Common Lisp the Language 2nd edition
ttp://www-2.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
CLHS: Common Lisp Hyper Spec
ttp://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/FrontMatter/Chapter-Index.html
R5RS: Revised(5) Scheme(ja)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html
□SICP関係□
SICP(英語)
ttp://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。 全てオンラインで読めます。
計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
ttp://www.ipl.t.u-tokyo.ac.jp/sicp/
SICPの回答集
ttp://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
ttp://pluto.aurorasd.co.jp/~mkama/sicp/
ttp://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
ttp://www.sampou.org/scheme/sicp/answer/
0004デフォルトの名無しさん
2008/01/14(月) 00:17:58http://ja.wikipedia.org/wiki/LISP
http://ja.wikipedia.org/wiki/Common_Lisp
http://ja.wikipedia.org/wiki/Scheme
□継続□
なんでも継続
ttp://practical-scheme.net/docs/cont-j.html
Schemeへの道:継続
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
継続の使い方
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#continuation
継続の使用法
ttp://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/block.html
CPS(継続渡しスタイル)の説明
ttp://www.csl.sony.co.jp/person/masui/Forum/data/20011215023622/
Kahua: 継続ベースのアプリケーションサーバー
ttp://www.kahua.org/
0005デフォルトの名無しさん
2008/01/14(月) 00:18:23John McCarthy's Home Page
ttp://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。
Association of Lisp Users 米国のLispユーザ会
ttp://www.alu.org/alu/home
CMUのLisp Repository 新旧様々なプログラムが置いてある
ftp://ftp.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/0.html
The Common Lisp Cookbook: いわゆる Cookbook
ttp://cl-cookbook.sourceforge.net/
Bibliography of Scheme-related Research Scheme関連の論文リンク集
ttp://library.readscheme.org/
Scheme Hash(英語) S式でXMLを使える様にするSXMLなど
ttp://okmij.org/ftp/Scheme/index.html
幻の「入門Scheme」 オンラインで読める
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/
encyCMUCLopedia (cmucl以外でも有益なはず )
ttp://www.isr.ist.utl.pt/library/docs/encycmuclopedia/doc/
0006デフォルトの名無しさん
2008/01/14(月) 00:23:24Bit (mini-schemeよりも小さい(?)bytecode変換系 )
ttp://www.iro.umontreal.ca/~dube/
Lisp 言語処理系: CAMPUS LIsP, Lemon version (Cでわずか1000行)
ttp://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Schemix (Linuxのkernelへのパッチで/dev/として扱えるTinyScheme )
ttp://www.abstractnonsense.com/schemix/
awkで書かれたわずか500行のLispインタプリタ
ttp://www.accesscom.com/~darius/
Schemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html
Tiny CLOS Tutorial
ttp://home.adelphi.edu/~sbloch/class/272/tclos/tutorial.shtml
Hotdog Scheme MS が金出してたみたい
ttp://rover.cs.nwu.edu/~scheme/
Bigloo CLR 用のコードを吐けるようになったらしい
ttp://www-sop.inria.fr/mimosa/fp/Bigloo/
SECDR-Scheme: SECD machine model に基づく実装
ttp://lily.fan.gr.jp/~kmd/adhoc/view.rhtml?n=SECDR-Scheme_woyomu
Minischeme: 1 ファイルに凝縮された Scheme 処理系
ttp://tinyscheme.sourceforge.net/minischeme.tar.gz
TinyScheme: Minischeme を色々弄ったもの
ttp://tinyscheme.sourceforge.net/
KI-Scheme, AM-Scheme, etc...
ttp://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
ttp://www.lispme.de/lispme/
0007デフォルトの名無しさん
2008/01/14(月) 00:24:21Scheme48: R5RS準拠のSchemeのバイトコードインタプリタ
ttp://www.s48.org/
Guile: GNUの拡張プログラミング言語
ttp://www.gnu.org/software/guile/
Gambit-C: R5RS準拠のScheme処理系
ttp://www.iro.umontreal.ca/~gambit/wiki/index.php/Main_Page
Gauche: R5RS準拠のScheme処理系。Shiro Kawaiさん作。近々書籍が出版されます。
ttp://practical-scheme.net/gauche/index-j.html
0008デフォルトの名無しさん
2008/01/14(月) 00:26:44LISP Scheme Part9 (html化) って、なんでこれだけ
ttp://ruku.qp.tc/dat2ch/0403/01/1069594582.html
独習 Scheme 三週間 (Schemeの教科書 )
ttp://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-1.html
Cliki (CLコードがたくさん紹介されている。)
ttp://www.cliki.net/index
よろずや (lispの実用的な情報が色々。 )
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/
Common-Lisp.net: 多くのプロジェクトがホスティングされてる
ttp://common-lisp.net/
Bill Clementson's Blog: Lisp関連の話題が中心のBlog
ttp://home.comcast.net/~bc19191/blog/
Practical Common Lisp: S式の羅列で現実的な問題をどう解くのかそのギャップに悩まされてる人に
ttp://www.gigamonkeys.com/book/
□イベント□
GaucheNight(2007-05-09)
http://practical-scheme.net/wiliki/wiliki.cgi?GaucheNight
川合史朗、黒田寿男、まつもとゆきひろ(Skype中継)、小飼弾、
伊東勝利、久井亨、小黒直樹、ほか
黒田氏関係 (黒板の人)
ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/901-909
http://cl-www.msi.co.jp/solutions/knowledge/lisp-world/articles/scheme
Scheme:マクロ:CommonLispとの比較
ttp://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%e3%83%9e%e3%82%af%e3%83%ad%3aCommonLisp%e3%81%a8%e3%81%ae%e6%af%94%e8%bc%83
Script Languages
ttp://cl-www.msi.co.jp/solutions/knowledge/lisp-world/articles/script-lang
0009デフォルトの名無しさん
2008/01/14(月) 00:27:27プログラミングGauche
・著者:川合史朗 監修
Kahuaプロジェクト 著
・定価:3360円(本体3200円+税)
・B5変 464頁
・ISBN 978-4-87311-348-7
・発売日:2008/02
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?&ISBN=978-4-87311-348-7
0010デフォルトの名無しさん
2008/01/14(月) 00:31:17【入門】Common Lisp その3【質問よろず】
ttp://pc11.2ch.net/test/read.cgi/tech/1181479267/
【CGI】実用比較Lisp vs C/C++【GUI】
ttp://pc11.2ch.net/test/read.cgi/tech/1150501484/
【魔法】リリカル☆Lisp【言語】
ttp://pc11.2ch.net/test/read.cgi/tech/1183396621/
Lisp@UNIX版
ttp://pc11.2ch.net/test/read.cgi/unix/1019926525/
Emacs Lisp 3
ttp://pc11.2ch.net/test/read.cgi/tech/1191875993/
【ヤパーリ】XMLをS式に置換えていくスレ【LISP最強】
ttp://pc11.2ch.net/test/read.cgi/tech/1140006937/
0011デフォルトの名無しさん
2008/01/14(月) 00:32:05【SICP】計算機プログラムの構造と解釈【Scheme】
ttp://pc11.2ch.net/test/read.cgi/tech/1107345738/
0012デフォルトの名無しさん
2008/01/14(月) 00:35:09プログラミング言語Scheme(日本語)
ttp://www.sci.u-toyama.ac.jp/~iwao/Scheme/scheme.html
SBCL Buildbot
ttp://sbcl.static.net/
LispUser.net (よろずや?)
ttp://lispuser.net/
R6RS
ttp://www.r6rs.org/
0013デフォルトの名無しさん
2008/01/14(月) 00:37:50こんなもんでよかったでしょうか
0014デフォルトの名無しさん
2008/01/14(月) 00:41:41SLIB
ttp://www-swiss.ai.mit.edu/~jaffer/SLIB.html
SRFI
ttp://srfi.schemers.org/
0015デフォルトの名無しさん
2008/01/14(月) 00:48:06プログラミング言語Scheme(日本語)
ttp://www.sci.u-toyama.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。
0016デフォルトの名無しさん
2008/01/14(月) 00:55:12ttp://www.bookshelf.jp/2ch/index.html
dat落ちした過去スレの一部が見られます。
0017デフォルトの名無しさん
2008/01/14(月) 01:20:41ttp://www-swiss.ai.mit.edu/~jaffer/r5rs_toc.html
0018デフォルトの名無しさん
2008/01/14(月) 02:00:120019デフォルトの名無しさん
2008/01/14(月) 02:59:310020デフォルトの名無しさん
2008/01/14(月) 07:05:390021デフォルトの名無しさん
2008/01/14(月) 07:12:370022デフォルトの名無しさん
2008/01/14(月) 07:17:32まあ連休中だから仕方が無いか…
0023デフォルトの名無しさん
2008/01/14(月) 07:25:250024デフォルトの名無しさん
2008/01/14(月) 07:41:260025デフォルトの名無しさん
2008/01/14(月) 07:47:31無意味なレスばっかだからもうやめとく。
生意気言ってすみませんでした。
0026デフォルトの名無しさん
2008/01/14(月) 13:30:14lat?というものが出てきて、(lat? '(a b c))
を試したのですが、latが解釈されないようです。
これは何を意味するもので、何か定義しなければ
いけないんでしょうか? 真偽値を返すのはわかり
ますが何をask forしてるのかわかりません。
0027デフォルトの名無しさん
2008/01/14(月) 13:31:29意味はわかりませんが。
0028デフォルトの名無しさん
2008/01/14(月) 14:32:200029デフォルトの名無しさん
2008/01/14(月) 17:27:19あのゾウさんの表紙がいいね。あの表紙の再帰はどこまで続くのだろう。
0030デフォルトの名無しさん
2008/01/14(月) 22:42:30∞のハズだと思ったがよく考えてみると、ゲーデルによって再帰的なラムダ計算の無矛盾性はその論理の範疇では証明できないことが示されている(不完全性定理)ので、
結論としては判らないということになるw
0031デフォルトの名無しさん
2008/01/14(月) 22:46:110032デフォルトの名無しさん
2008/01/14(月) 22:50:22それ、Little SchemerのChapter 9で出てくるYコンビネータのネタだね。
カリー・ハワード同型対応やYコンビネータによる再帰定義で喜んでると、不意にゲーデルにがっかりさせられるというオチが待っているw
0033デフォルトの名無しさん
2008/01/14(月) 23:05:54アプローチなんですか?結構気に入ったので買おうか迷ってます。
0034デフォルトの名無しさん
2008/01/14(月) 23:17:01おなじアプローチ。買ってOK。
Seasoned Schemerは続編で第2巻に相当。遅延評価とかの説明。
Reasoned SchemerはScheme上にProlog処理系のような論理型を導入する方法について。第3巻に相当。
3つ読めばSICPに近い知識は得られる。それからSICP読めばすらすら読める。
0035デフォルトの名無しさん
2008/01/14(月) 23:19:04チャーチ・ロッサーの定理も忘れずにw
0036デフォルトの名無しさん
2008/01/14(月) 23:31:19Little Schemerの巻末に文献紹介があるよね?
Smullyan "To Mock a Mockingbird"という本も激推奨!
SKIコンビネータ理論について判りやすく説明してくれる。あらゆる演算を鳥に例えていて、実は26の鳥から作れるという話。
しかもこの26種も実はSコンビネータとYコンビネータから作ることができ、さらによく考えるとこの2つもXコンビネータから作れて、大団円。
このSKIコンビネータ理論というのがSchemeの理論的基礎のλ算法というもので、Schemeで使うlambdaもこれに由来するんだよ。
読むと凄く理解が深くなるのでお勧め。
0037デフォルトの名無しさん
2008/01/14(月) 23:32:21なるほど。チェックしときます。とりあえずLittle Schemerで
苦手な再帰の概念の基礎固めをしたいと思います。Schemeは
C++のBoost MPLにも活かせそうですね。
0038デフォルトの名無しさん
2008/01/14(月) 23:32:30○ しかもこの26種も実はSコンビネータとKコンビネータから作ることができ、
0039デフォルトの名無しさん
2008/01/14(月) 23:37:22難しそうですが、Schemerシリーズを終えたらチェックしてみます。
先が楽しみです。
0040デフォルトの名無しさん
2008/01/14(月) 23:40:49最近新古本を手に入れた
高かった
ちょこっと読んだけど難しい
鳥のたとえ話が
0041デフォルトの名無しさん
2008/01/14(月) 23:54:08C++のBoost MPLに活かせることもあるけど適材適所で使い分けた方がいい。
オブジェクト指向と関数型では基本的なアルゴリズムも全く違う。
0042デフォルトの名無しさん
2008/01/14(月) 23:55:55日本語だから例えになっていない。英語ならそのままコンビネータの名前だし、説明もコンビネータの働きに対応している。
原書推奨。
0043デフォルトの名無しさん
2008/01/15(火) 00:06:47ttp://www.angelfire.com/tx4/cus/combinator/birds.html
SKIコンビネータのSKIはそれぞれ:
Starling
Kestrel
Identity Bird (aka Idiot)=SKK
に対応している。
0044デフォルトの名無しさん
2008/01/15(火) 01:00:42都内の人、Schemerシリーズどこで買ったのかいくらだったのか教えろください。
0045デフォルトの名無しさん
2008/01/15(火) 01:08:35K (チョウゲンボウ:Kestrel)
I (???:Identity bird)=SKK
B (???:Blue bird)=S(KS)K
C (コウカンチョウ:Cardinal)=S(BBS)(KK)
M (ものまね鳥:Mocking bird)=SII
L (ヒバリ:Lark)=CBM
T (???:Thrush)=CI
R (コマドリ:Robin)=BBT
W (ムシクイ:Warbler)=C(BMR)
Y (賢人鳥:Why bird)=SLL
0046デフォルトの名無しさん
2008/01/15(火) 01:14:46アマゾソ.jpで\3500ぐらいでゲト。
0047デフォルトの名無しさん
2008/01/15(火) 01:18:44英題は"To kill a mocking bird(アラバマ物語)"をもじっているけど「ものまね鳥をまねる」だと意味がないw
0048デフォルトの名無しさん
2008/01/15(火) 01:41:370049デフォルトの名無しさん
2008/01/15(火) 07:41:10そんなもの自分で決められないんだから、そんな事話してる暇有ったら
Lispでアプリケーションの一つでも書いたらどうなの?
プログラミング言語なんで、ただの道具でしょ。
C言語に例えたら、延々ポインタの表記法の是非について語ってるみたいで
キモイんだけれど。
0050デフォルトの名無しさん
2008/01/15(火) 07:45:080051デフォルトの名無しさん
2008/01/15(火) 07:52:04>キモければ来なければいい。
そんな排他的な事言ってるからいつまでたっても
広がらないんじゃないの?
お前達は象牙の塔の住人なのか?
このスレの中に一人でも「Lispを使ってこんな事が出来るんだ!」
と人を驚かすようなアプリケーション書いた奴いるの?
グダグダ言語の事はなしてるより、アプリケーション書いた方が
万倍、計算機科学の発展に役立つと思うのだけれど。
グダグダ話してる内容も、外国の本の読み合いなんだしさ、意味ないよ。
0052デフォルトの名無しさん
2008/01/15(火) 07:54:13たぶん>>49は、「自分にとってキモイ」ということが、自分以外の人間にとっても通用する
普遍的で価値のあることで、だから詳細もすっ飛ばすし上から目線にもなってるんだろうけど、
それは自意識過剰ってもんでしょう。
「>>49にとってキモイ」という事実は、悪いけどゴミみたいな価値しかないことだから、
意味が無いし、もっとちゃんと話さないと通じないです。
0053デフォルトの名無しさん
2008/01/15(火) 07:56:36じゃあまぁ、頑張ってアプリケーション書いてくれ。
他人に要求することや、他人をジャッジする内容を、まず自分に適用して生き続けるのが
厨と卒業する上で大事なことだから。
0054デフォルトの名無しさん
2008/01/15(火) 07:58:040055デフォルトの名無しさん
2008/01/15(火) 08:04:33プログラマって人種はクリエイティブって言うし、
Lisp使う人は最高のプログラマって称号もあるけれどさ。
実際このスレ覗くと、延々使い古された古典の読み合いと紹介。
新規性の欠片もなくて、どこがクリエイティブなんだか。
0056デフォルトの名無しさん
2008/01/15(火) 08:05:140057デフォルトの名無しさん
2008/01/15(火) 08:07:34で、君どうしたいの?
そろそろ学校行ったら。
0058デフォルトの名無しさん
2008/01/15(火) 08:10:18なんか君の言ってることの内容が、相手の対応によってどんどん変わってきてるな。
君の最初の疑問「なぜ延々言語の事話してるのか」の答は、ここが言語のことを話すスレであって、
ここで何かアプリケーションを作るスレではないからだよ。
あと、「そんな事話してる暇有ったらLispでアプリケーションの一つでも書いたらどうなの?」ってのは、
2chに書き込む行為を一切やめて、その時間をすべてプログラミングにあてろ、
そういう生活をしないならお前らはキモイ、という意味?
0059デフォルトの名無しさん
2008/01/15(火) 08:13:41なんか、切れ切れに言葉をしってるだけの二十歳くらいの坊やに思えてきた。
0060デフォルトの名無しさん
2008/01/15(火) 08:23:56>2chに書き込む行為を一切やめて、その時間をすべてプログラミングにあてろ、
>そういう生活をしないならお前らはキモイ、という意味?
違うよ。
>このスレの中に一人でも「Lispを使ってこんな事が出来るんだ!」
>と人を驚かすようなアプリケーション書いた奴いるの?
って事だよ。
Lispで今まで解けると思われていなかった問題を解けるようなアプリケーションを書けって事だよ。
それなのにお前らは、延々古典の読み合いばかり。
ガッカリだ。
とても新しい発想が生まれるとは思えない。
悔しかったら、「コレスゲー」ってもの出してみろ。
0061デフォルトの名無しさん
2008/01/15(火) 08:47:38言ってることが間抜け過ぎて、誰も悔しくないだろうから・・・。
0062デフォルトの名無しさん
2008/01/15(火) 09:31:110063デフォルトの名無しさん
2008/01/15(火) 10:58:300064デフォルトの名無しさん
2008/01/15(火) 10:59:58>
0065デフォルトの名無しさん
2008/01/15(火) 11:19:18.NETは言語じゃないけどな
言語じゃないというのが新しいよな
つまり.NETでLispを使えということだな
0066デフォルトの名無しさん
2008/01/15(火) 11:27:25ここはそういうところだから。
残念ながらLisp系でプロダクトコード書ける環境にいる人間は希少種だし。
というか他の言語スレも似たようなもんだが
Lisper/Schemerにはなんか期待しちゃうところがあるんかな?
0067デフォルトの名無しさん
2008/01/15(火) 11:31:36ネタにされるだけだし
0068デフォルトの名無しさん
2008/01/15(火) 12:22:03自分が書いてるものの話なんかこんなところでできるかよ。
特定されたら面倒でかなわん。
0069デフォルトの名無しさん
2008/01/15(火) 16:22:200070デフォルトの名無しさん
2008/01/15(火) 17:13:01竹内郁雄先生ですか?
0071竹内郁雄
2008/01/15(火) 17:37:12良くわかったね。
実はtao/elisのソースを公開したいんだが、
電電公社が持っててね。
学術振興になると思うんだけれど、残念だ。
0072デフォルトの名無しさん
2008/01/15(火) 17:48:36↓
0073デフォルトの名無しさん
2008/01/15(火) 18:01:42(delay (force ...))をforceすると末尾再帰でないforceの呼出しになって
メモリを食いつぶすのを防ぐために使うのはわかったんだけど
末尾呼出しでない関数にlazyをつけると逆にメモリを食いつぶすようになる
末尾呼出しされるストリームを返す関数に使えばいいのかな
0074デフォルトの名無しさん
2008/01/15(火) 18:07:27ニ-‐'' // ヾソ 、 !ヽ `ヽ ヽ
_/,.イ / /ミ;j〃゙〉 }�U } ハ ヽ、}
..ノ /ハ 〔 ∠ノ乂 {ヽ ヾ丶ヽ ヽ >>60
ノノ .>、_\ { j∠=, }、 l \ヽヽ ', _ノ
ー-=ニ二ニ=一`'´__,.イ<::ヽリ j `、 ) \ そもそも『悔しかったら、「コレスゲー」ってもの出してみろ』とは何なのか
{¨丶、___,. イ |{. |::::ヽ( { 〈 ( 〉
'| | 小, |:::::::|:::l\i ', l く 君の意見を聞こうッ!
_| | `ヾ:フ |::::::::|:::| } } | )
、| | ∠ニニ} |:::::::::|/ / / / /-‐-、
トl、 l {⌒ヽr{ |:::::::::|,/// \/⌒\/⌒丶/´ ̄`
::\丶、 ヾ二ソ |:::::::/∠-''´
/\\.丶、 `''''''′!:::::::レ〈
〉:: ̄::`'ァ--‐''゙:::::::/::::ヽ
\;/:::::::::::::/::/:::::::::::://:::::〉
::`ヽ:::ー-〇'´::::::::::::::::/-ニ::::(
/ \
0075デフォルトの名無しさん
2008/01/15(火) 18:24:580076デフォルトの名無しさん
2008/01/15(火) 18:29:040077デフォルトの名無しさん
2008/01/15(火) 18:31:27Emacsで2ch開くとAA以外は英語に翻訳され、
レスは自動で日本語になって書き込まれる。
ポールグレアムほどのスパーハカーなら1秒以内にそのくらいは考えつくはず。
0078デフォルトの名無しさん
2008/01/15(火) 18:43:39アラバマ物語もじってたのか。原題知らなかったw 「ものまね鳥を殺すには」が直訳かな。
ものまね鳥って「危害を加えない人」をたとえてるから、スマリヤンのタイトルでは「副作用のない演算」ぐらいの意味だろうか?
てことは「副作用のない演算に似たものを作るには」ぐらいの意味のタイトルみたいだ。「ものまね鳥をまねる」じゃ意味が伝わらないよなぁ。
役者も意味が取れていなかったのがいまさらながらわかった希ガス。
0079デフォルトの名無しさん
2008/01/15(火) 18:47:24具体的にどういうコード?
0080デフォルトの名無しさん
2008/01/15(火) 18:50:30スマリヤンの本が>>60への答えになってるなw
「ものまね鳥をまねる」 = 「コレスゲーってプログラムを作るには」
0081デフォルトの名無しさん
2008/01/15(火) 19:03:21スマリヤン:「コレスゲーってプログラムを作るには?」
グレアム :「Yコンビネータ・On・Lisp」
0082デフォルトの名無しさん
2008/01/15(火) 19:07:550083デフォルトの名無しさん
2008/01/15(火) 19:13:35"On Lisp"の内容、マクロが中心だたから、「コンビネータ使って副作用のないマクロを書け。そうすれば『コレスゲープログラム』が作れるぞ!」って意味なのねん?
0084デフォルトの名無しさん
2008/01/15(火) 19:17:28どうだろう。彼が要求しているのは
「今まで解けると思われていなかった問題を解けるような"アプリケーション"」
だからなぁ。
それってつまり、チューリング等価を越えろっていう要求ではないかと思うんだ。
彼は言語のパワーというものが、あるものを「どう」実現できるかという"how"の領分の話だということが
まるで理解できていないんでは?
「Lispが凄いのなら、Lispで書いたプログラムにしか為し得ない動作があるのだろう」
という発想でモノを言ってるように窺える。てかそもそも「アプリケーション」って言い方が猛烈に素人臭いしw
0085デフォルトの名無しさん
2008/01/15(火) 19:21:43;(define (stream-cdr stream)
; (srfi-45:lazy (cdr (srfi-45:force stream))))
これはプロミスを受け取ってプロミスを返す関数だからlazyをつけたいとこだけど
;(define (stream-tail stream k)
; (srfi-45:lazy
; (if (zero? k)
; stream
; (stream-tail (stream-cdr stream) (- k 1)))))
とかで末尾呼出しされない場合メモリを食いつぶす
0086デフォルトの名無しさん
2008/01/15(火) 19:27:11プログラミング言語なんて所詮は「λ算法=チューリングマシン」の糖衣構文に過ぎないからねぇ。
スマリヤンの本の趣旨は「コレスゲーってプログラムをつくるには(ゲーデルのいうように限界があるのだよ)」ということだからねぇ。
0087デフォルトの名無しさん
2008/01/15(火) 19:39:14call/ccでdelayを包めばいいじゃん
とか思ったりもしたけど
遅延される計算量がエラいことになって使い物にならないことに
実行するまで気づかなかった('A`)
というか実行しても暫く気づかなかったorz
0088デフォルトの名無しさん
2008/01/15(火) 19:40:05forceはどこいった?
0089デフォルトの名無しさん
2008/01/15(火) 19:41:51http://www.asahi-net.or.jp/%7Eki4s-nkmr/lisp20061121/lisp.html
0090デフォルトの名無しさん
2008/01/15(火) 19:41:59stream-tailがプロミスを返すので
(srfi-45:force (stream-tail s 10))とかするつもり
0091デフォルトの名無しさん
2008/01/15(火) 19:52:19srfi-45のルール通りにやれ
0092デフォルトの名無しさん
2008/01/15(火) 20:03:54どこらへんがルールと違う?
* wrap all constructors (e.g., '(), cons) with delay,
* apply force to arguments of deconstructors (e.g., car, cdr and null?),
* wrap procedure bodies with (lazy ...).
は守ってるつもりだけど
0093デフォルトの名無しさん
2008/01/15(火) 20:06:30朝日ネットのURLは
/~KI4S-NKMR/
こう書くほうが好みだな
0094デフォルトの名無しさん
2008/01/15(火) 20:33:04ループまたは再帰のあるチューリング完全なプログラミング言語は等価であるということですか。やっとわかりました。(汗
等価であるなら個別の問題に対して実装しやすい言語を使えば良いということですよね。
でLisp/Schemeの場合、マクロで拡張してその問題に特化したDSLを作成して実装したらいいというのがグレアムのスタンス。
>>54が言ってた言語の拡張性がこの言語のユーザーの強みといえるかな。SLLGENとかもソレ系ですし。
0095デフォルトの名無しさん
2008/01/15(火) 20:58:31そういう流れのLisp本、チャイティン著「知の限界」「数学の限界」という本がありますよ。
Lisp使ってゲーデルの不完全性定理やチューリングの停止問題を説明してます。
0096デフォルトの名無しさん
2008/01/15(火) 21:09:220097デフォルトの名無しさん
2008/01/15(火) 21:16:06うるさいことを言うと、URLの中の ~ はエスケープしなければいけないという「規格」になっておる。
0098デフォルトの名無しさん
2008/01/15(火) 21:17:44忘れてくださいorz
0099デフォルトの名無しさん
2008/01/15(火) 21:27:290100デフォルトの名無しさん
2008/01/15(火) 21:50:27ホフスタッターの本にそんなのあったね。
あった!「メタ、マジックゲーム」p445
「ゲーデルはリスプ(Lisp)を思いついておくべきだった。
もし彼がリスプを思いついていたならば...」
0101デフォルトの名無しさん
2008/01/15(火) 22:12:48> >>93
> うるさいことを言うと、URLの中の ~ はエスケープしなければいけないという「規格」になっておる。
RFC 1738 ではそうですね。
URI (RFC 2396) ではおkです。
0102デフォルトの名無しさん
2008/01/15(火) 22:14:200103デフォルトの名無しさん
2008/01/15(火) 22:47:420104デフォルトの名無しさん
2008/01/15(火) 23:01:11「知の限界」読み直してみようと思う。p71のLISPによるゲーデルの証明、
これSchemeで書きなおせるかやってみる。
チャイティンの書いたLispインタープリタってネットで公開されていたような...
0105デフォルトの名無しさん
2008/01/15(火) 23:02:24しかもPrologとかAIを組み合わせればちょっと他の処理系では作りにくいものも作れてしまうのか。ガンダムの教育型OSってこんなイメージかなw
がんばってLittle Schemerシリーズ読んでみようかな。Ocaml/Haskellはかじったけどこっちの方が面白杉。
0106デフォルトの名無しさん
2008/01/15(火) 23:05:54あれ、emacsやxyzzyでも動くのかな?Scheme版出来たらうpキボンヌ
0107デフォルトの名無しさん
2008/01/15(火) 23:10:140108デフォルトの名無しさん
2008/01/15(火) 23:13:16そんなオマエにガクガクブルブルw
0109デフォルトの名無しさん
2008/01/15(火) 23:18:14前者は箱入りなのに後者は箱がなくて悲しいぜ。
0110デフォルトの名無しさん
2008/01/15(火) 23:19:24[1] Little Schemer
[2] Seasoned Schemer
[3] Reasoned Schemer
[4] To Mock a Mockingbird(ものまね鳥をまねる)
[5] To kill a mocking bird(アラバマ物語)
[6] On Lisp
[7] 知の限界
[8] 数学の限界
[9] メタ、マジックゲーム
[10] SICP
0111デフォルトの名無しさん
2008/01/15(火) 23:20:260112デフォルトの名無しさん
2008/01/15(火) 23:27:42[12] 「プログラミングGauche」 川合史朗 監修 Kahuaプロジェクト 著
0113デフォルトの名無しさん
2008/01/15(火) 23:40:25Yコンビネータまで8羽理解すればいいのか。今、気がついたw
S (ムクドリ:Starling)
K (チョウゲンボウ:Kestrel)
I (???:Identity bird)=SKK
B (???:Blue bird)=S(KS)K
C (コウカンチョウ:Cardinal)=S(BBS)(KK)
M (ものまね鳥:Mocking bird)=SII
L (ヒバリ:Lark)=CBM
Y (賢人鳥:Why bird)=SLL
0114デフォルトの名無しさん
2008/01/15(火) 23:50:00ホレ。
(define S (lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))))
(define K (lambda (x) (lambda (y) x)))
(define I (lambda (x) x))
(define-macro (define-combinator name body)
`(define ,name
(lambda (arg)
(,body arg))))
(define define-combinator define)
(define-combinator B ((S (K S)) K))
(define-combinator C ((S((S(K((S(K S))K)))S))(K K)))
(define-combinator M ((S I) I))
(define-combinator L ((C B) M))
(define Y
(lambda (F)
((lambda (my-make-f)
(F (lambda (x) ((my-make-f my-make-f) x))))
(lambda (my-make-f)
(F (lambda (x) ((my-make-f my-make-f) x)))))))
0115デフォルトの名無しさん
2008/01/15(火) 23:52:45(lambda (n)
(if (= n 0)
1
(* n (my-fact (- n 1))))))
(define fact (Y Fact))
(fact 10)
3628800
0116デフォルトの名無しさん
2008/01/15(火) 23:53:43(lambda (n)
(if (<= n 1)
1
(+ (my-fib (- n 1))
(my-fib (- n 2))))))
(define fib (Y Fib))
(fib 10)
89
0117デフォルトの名無しさん
2008/01/15(火) 23:55:09(define-combinator Y ((S L) L))
0118デフォルトの名無しさん
2008/01/16(水) 00:00:31> [9] メタ、マジックゲーム
超なつかしい
高校の夏休みにY.M.O.ベストと一緒に図書館で借りて読んだのをおぼえてる。
いま思うと充実してたなあの頃は。
0119デフォルトの名無しさん
2008/01/16(水) 00:02:22(.___,,,... -ァァフ| あ…ありのまま 今 起こった事を話すぜ!
|i i| }! }} //|
|l、{ j} /,,ィ//| 『おれは階乗計算のために無名関数をいじっていたと
i|:!ヾ、_ノ/ u {:}//ヘ 思ったらいつのまにかいじる前の状態に戻っていた』
|リ u' } ,ノ _,!V,ハ |
/´fト、_{ル{,ィ'eラ , タ人 な… 何を言ってるのか わからねーと思うが
/' ヾ|宀| {´,)⌒`/ |<ヽトiゝ おれも何をされたのかわからなかった…
,゙ / )ヽ iLレ u' | | ヾlトハ〉
|/_/ ハ !ニ⊇ '/:} V:::::ヽ 頭がどうにかなりそうだった…
// 二二二7'T'' /u' __ /:::::::/`ヽ
/'´r ー---ァ‐゙T´ '"´ /::::/-‐ \ グラハムだとかチャイティンだとか
/ // 广¨´ /' /:::::/´ ̄`ヽ ⌒ヽ そんな大層なもんじゃあ 断じてねえ
ノ ' / ノ:::::`ー-、___/:::::// ヽ }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::... イ もっと恐ろしい「普通の再帰」と「Yコンビネータ」の違いを味わったぜ…
0120デフォルトの名無しさん
2008/01/16(水) 02:29:410121デフォルトの名無しさん
2008/01/16(水) 06:00:52「計算論」(高橋正子著)を読み始めていたので参考になった。
ありがとう。
0122デフォルトの名無しさん
2008/01/16(水) 11:45:06俺はバカだから、理由もなく難しいことを考えるのは非合理的だと思うけど
君らにとっては難しくなくて、難しくないことを考えるのに理由は要らない
なんというかバカの壁を実感したよ
0123デフォルトの名無しさん
2008/01/16(水) 12:26:410124デフォルトの名無しさん
2008/01/16(水) 14:35:15ところで、新宿ジュンク堂にならLittle schemerあるかもと思ったけど無かった。
MITの本はいくつかあったけど。
注文したらアマゾンの方が早いかな。
0125デフォルトの名無しさん
2008/01/16(水) 18:06:49チラ見だけど、SKKとかSIIとかSLLとかがやたら目に付いた。なんか深遠なパターンがあるんだろうな。
0126デフォルトの名無しさん
2008/01/16(水) 18:14:00その「コレスゲープログラム」はunlambdaのことジャマイカ?
難読化してもちゃんと動くぜってノリだった希ガス。
0127デフォルトの名無しさん
2008/01/16(水) 19:39:360128デフォルトの名無しさん
2008/01/16(水) 19:53:02チャウチャウ。このスレの流れで言ってるコレスゲープログラムは定理証明機としての意味。だから>>95,>>104の話が出てきた。
>>100の紹介した本が言ってるのは「ゲーデルがもっと便利な定理証明機(Lisp)を思いついていれば」という意味だ。
つまりスマリヤンが言ってるコレスゲープログラムとはスゲー定理ということ。
0129デフォルトの名無しさん
2008/01/16(水) 19:54:520130デフォルトの名無しさん
2008/01/16(水) 19:59:590131デフォルトの名無しさん
2008/01/16(水) 20:19:260132デフォルトの名無しさん
2008/01/16(水) 20:55:13このスレ勉強になるな。
0133デフォルトの名無しさん
2008/01/16(水) 21:05:52UnlambdaやBrainf*ckの意味ではなく、CoqやIsabella等の定理証明機が正解かな常考。
0134デフォルトの名無しさん
2008/01/16(水) 21:13:32まちがいない。
0135デフォルトの名無しさん
2008/01/16(水) 21:27:010136デフォルトの名無しさん
2008/01/16(水) 21:34:080137デフォルトの名無しさん
2008/01/16(水) 23:00:18チューリングマシーンがハードウェア型の定理証明機とするならラムダ算法とか結合子論理はソフトウェア型の定理証明機になってるよね。
でも>>100にあるようにもしもゲーデルがLispのようなプログラミング言語を知っていれば、ゲーデルの証明はもっと理解しやすかったのにということだよ。
つまり、たとえ等価でももっと分かり易くできるプログラミング言語があるならそれを使うべきだというのが結論じゃないかな。
教養として難しいことも知っておくのも意義はあるけどね。UnlambdaやBrainf*ckもそういう意味でしかないと思う。
0138デフォルトの名無しさん
2008/01/16(水) 23:13:01ttp://www.unfindable.net/~yabuki/article/unknowable/godel.html
;;不動点
(define (f x) `(',x ',x))
> (f 'x)
((quote x) (quote x))
> (f f)
((quote #<procedure:f>) (quote #<procedure:f>))
> (equal? (f f) (eval (f f)))
#t
> (equal? (f f) (eval (eval (eval (eval (eval (f f)))))))
#t
>
続く
0139デフォルトの名無しさん
2008/01/16(水) 23:14:00;;(valid-proof? x) の定義があると仮定する。xが妥当な証明なら'()
;;xが妥当な証明なら実証された定理を返す。
;;s式yが証明できない⇔すべてのs式xについて (valid-proof? x)が
;;yと等価とは限らない。
;;これを肯定する述語が (is-unprovable y)
(define (g x) `(is-unprovable (value-of (',x ',x))))
> (g 'x)
(is-unprovable (value-of ((quote x) (quote x))))
> (g g)
(is-unprovable (value-of ((quote #<procedure:g>) (quote #<procedure:g>))))
> (equal? (g g) (eval (cadr (cadr (g g)))))
#t
>
証明できないということは証明できない = (証明できないということは証明できない)ということは証明できない。
こういう意味なのだろうか?頭が痛くなりそうだ。
0140デフォルトの名無しさん
2008/01/16(水) 23:32:34誤 ;;(valid-proof? x) の定義があると仮定する。xが妥当な証明なら'()
正 ;;(valid-proof? x) の定義があると仮定する。xが妥当な証明でないなら'()
0141デフォルトの名無しさん
2008/01/16(水) 23:37:03その入れ子になっている計算が無限に続いた入れ子と仮定して、その計算はいつか止まるのかという意味になっている。
それがチューリングの停止性問題だ。1931年にゲーデルがやったことを1937年にチューリングがチューリングマシンで説明した問題。
それをチャイティンはLispで書いてみたってこと。チューリングの停止性問題でググレばわかりやすい説明が見つかるだろう。
(チャイティンにケチをつけるわけじゃないが、無限のメモリがないと同じことにはならない)
0142デフォルトの名無しさん
2008/01/16(水) 23:50:09Little Schemerの9章に出てくるYコンビネータも無限に続いた入れ子(=再帰関数)を作るためだよね。
>>114-119のYコンビネータがそれに相当するかな。
0144デフォルトの名無しさん
2008/01/17(木) 00:06:450145デフォルトの名無しさん
2008/01/17(木) 00:08:35おぉ、理解早いね。
0146デフォルトの名無しさん
2008/01/17(木) 00:20:21ゲーデルとチューリングって無限ループは止まらないってことを言ってるのか。なんか意外だなぁ。
0147デフォルトの名無しさん
2008/01/17(木) 00:23:36・矛盾する
・従ってすべての無限ループは止まらない
・証明終わり
0148デフォルトの名無しさん
2008/01/17(木) 00:25:33無限という概念は数学的には不可解なのです。
0149デフォルトの名無しさん
2008/01/17(木) 00:33:04↓
無限のループや再帰は止まらないことがある。
↓
判定不能な問題が存在する。
↓
チューリング完全なプログラミング言語は万能ではない!
↓
プログラマーに出来ることには限界がある。
↓
バカの壁(Q.E.D.)
0150デフォルトの名無しさん
2008/01/17(木) 00:38:480151デフォルトの名無しさん
2008/01/17(木) 00:42:360152デフォルトの名無しさん
2008/01/17(木) 01:10:590153デフォルトの名無しさん
2008/01/17(木) 01:34:230154デフォルトの名無しさん
2008/01/17(木) 01:38:180155デフォルトの名無しさん
2008/01/17(木) 09:54:11な人間ですが、Lisperから見たとき、Haskellってどんな印象なんでしょうか。
0156デフォルトの名無しさん
2008/01/17(木) 10:16:02止まらないかもしれないと止まらないかもしれないと止まらないかもしれないと....
という「半アルゴリズム」なんだな
0157デフォルトの名無しさん
2008/01/17(木) 13:14:48「なんて純粋な関数型!しかも遅延!」
0158デフォルトの名無しさん
2008/01/17(木) 13:35:51「遅延」っていう響きがいやらしく感じるんだ。
0159デフォルトの名無しさん
2008/01/17(木) 14:00:35Lisper一般ではなく、あくまで俺の印象だが、
「純粋すぎてちょっとめんどい」って感じ。
たぶん誤解なんだろうけど。
0160155
2008/01/17(木) 14:16:28色々煩すぎるよ、ということでしょうか。
0161デフォルトの名無しさん
2008/01/17(木) 14:16:43数学や哲学の匂いに比べて、肝心の(という言い方はトゲがあるかな)工学の匂いが薄い、
という風に感じる。
でもこれは、2chのスレや、関数型言語関連の検索で引っかかったページからの印象で、
実際にHaskellに触ったことは無いんで、>>159と同じく、色々誤解もあるんだろうなと想像。
0162デフォルトの名無しさん
2008/01/17(木) 14:36:20ちょっと違うかな。
LispでもSchemeでも、関数型風に書くこともできれば、手続き風に書くこともできるよね。
純粋関数型言語ってのはそういう融通が効かなさそうで、用途によっては面倒じゃね?って
イメージ。たぶんいろんな逃げ道があって、そうでもないんだろうけど。
0163155
2008/01/17(木) 14:45:03そうですね。言語の入門ってよく"Hello World"をコンソールとかに出力するのとか
から始まりますが。Haskellの場合それは典型的な副作用関数なので、モナドが
必要とか、そんな話になってしまいます。
0164デフォルトの名無しさん
2008/01/17(木) 18:06:23Haskellみて思うのはUKの純粋関数型言語というイメージかな?
ML系やLisp系にはUKの言語みたいなこだわりは感じないかなぁ。
良いとか悪いとかいう感想は持ったことない。職人的なこだわりが感じられる。
0165デフォルトの名無しさん
2008/01/17(木) 18:23:28BSDが西海岸文化で。
0166デフォルトの名無しさん
2008/01/17(木) 18:57:240167デフォルトの名無しさん
2008/01/17(木) 21:21:03もっと絞るとボストン周辺文化
0168デフォルトの名無しさん
2008/01/17(木) 21:33:55俺と全く同じ状況でワロタ。
lispの構文はシンプルで美しいと、心から思ったよ。
0169デフォルトの名無しさん
2008/01/18(金) 01:12:10赤多過ぎ。
表紙が「Gaucheプログラミング」って表紙からして間違ってない?
ダイジョブカ?
0170デフォルトの名無しさん
2008/01/18(金) 01:38:34逆に考えるんだ。それだけ改善される、と。
0171デフォルトの名無しさん
2008/01/18(金) 01:58:300172デフォルトの名無しさん
2008/01/18(金) 02:26:18そりゃ偏見w
インディアナあたりもガンガってる。
0173デフォルトの名無しさん
2008/01/18(金) 03:43:26「モナドが必要」って,一体何をそんなに仰々しく構えているのか.
何も考えずに putStrLn すればいいんですよ.
(write "Hello world!") (newline) と書くとき,Schemeの意味論を思い浮かべる?
;; そもそも意味論はRnRSの一部しか記述してないけど
0174デフォルトの名無しさん
2008/01/18(金) 12:25:47あるいは社会人だけど趣味やスキルアップのためにSchemeを
やっているのですか?
仕事でScheme使ってる人はいるのでしょうか?
0175デフォルトの名無しさん
2008/01/18(金) 12:49:330176デフォルトの名無しさん
2008/01/18(金) 12:58:20「大丈夫俺に任せろ」で仕事にできちゃうんだろなぁ
0177デフォルトの名無しさん
2008/01/18(金) 13:15:20再帰が必要な処理だけは手続き型言語で書こうとすると悩むから
一旦Schemeで下書きしてから手続き型に直す
0178デフォルトの名無しさん
2008/01/18(金) 13:17:57むしろ、writeが再定義されてたらどうしよう、とか思い浮かべたほうがいい
0179デフォルトの名無しさん
2008/01/18(金) 13:19:28いろんな人がいると思うよ。画一的に考えるな。
俺は仕事で使ってるよ。Common Lispだけど。
0180デフォルトの名無しさん
2008/01/18(金) 22:00:49本職はハードの設計だが, できあいのツールで機能が足りないときは
Lisp で書いてるな. C とか C++ で数値計算する気にならん.
0181デフォルトの名無しさん
2008/01/18(金) 22:12:590182デフォルトの名無しさん
2008/01/18(金) 22:40:510183デフォルトの名無しさん
2008/01/18(金) 22:55:040184デフォルトの名無しさん
2008/01/19(土) 22:46:09回路設計者(しかも、アナログ)だけど、趣味でschemeやってますよ。
0185デフォルトの名無しさん
2008/01/19(土) 23:58:15考えたことがあるよ。
0187デフォルトの名無しさん
2008/01/20(日) 01:07:34そこで質問なんだが、Lispだとnil==()なのにschemeだと#f != ()な理由ってあるの?
0188デフォルトの名無しさん
2008/01/20(日) 01:11:05おそらく宗教的な理由
0189デフォルトの名無しさん
2008/01/20(日) 01:11:190190デフォルトの名無しさん
2008/01/20(日) 01:24:49俺が多すぎ
0191デフォルトの名無しさん
2008/01/20(日) 01:33:020192デフォルトの名無しさん
2008/01/20(日) 01:45:17Little Schemer ⇒ ゾウさんの絵 ⇒ 繰り返しはどこまで続くのか? ⇒ Yコンビネータ ⇒ To Mock A Mockingbird ⇒ ゲーデルの定理
読み返してみたらホントにそう書いてあった。すげー。
0193デフォルトの名無しさん
2008/01/20(日) 08:01:34どんな所がいいですか?
0194デフォルトの名無しさん
2008/01/20(日) 08:28:450195デフォルトの名無しさん
2008/01/20(日) 09:12:55schemeを知ってやべぇ美しすぎる!とか思った。
でも今は仕事でCommonLisp(ACL)を少し使ってる。バカでかい仕様も、
今では信頼の元。CLは愛してるというより尊敬の対象。
0196デフォルトの名無しさん
2008/01/20(日) 13:39:49配列と構造体とハッシュを使い分けるのも馬鹿らしいと思うことはないかい
0197デフォルトの名無しさん
2008/01/20(日) 13:42:24使い分けるのが馬鹿らしかったら使い分けなきゃいいんじゃないか?w
0198デフォルトの名無しさん
2008/01/20(日) 13:47:21> おまえらループと再帰を使い分けるのは馬鹿らしいと思ってるだろ
うん!
> 配列と構造体とハッシュを使い分けるのも馬鹿らしいと思うことはないかい
あんまおもわねぇなぁ
assoc と hash …
0199デフォルトの名無しさん
2008/01/20(日) 14:08:27前スレでassocの書き方を色々とやってたな。4つぐらいあった希ガス。
でも使い分けるという感じではなかった。
0200デフォルトの名無しさん
2008/01/20(日) 15:09:18JavaScriptなんかはそこらへんルーズなんで楽ちんではある
0201デフォルトの名無しさん
2008/01/20(日) 15:15:18問題はキーを比較するときに多態性がないと不便ってことかな
0202デフォルトの名無しさん
2008/01/20(日) 16:06:12Arcってそゆんじゃなかったっけ? alistとhashを抽象化したdbって。
>>200
久しぶりに書くと配列をiterateするのにfor(var in ary)で書いてしまって??となる
0203187
2008/01/20(日) 17:38:21まずschemeで((if #t + -) 1 2)がでできることに感動
まだほとんど触ってないけどgaucheは
・速い(と聞いている)
・バインディングが書きやすい(ように見える)
・スレッドが使える
・dotimes, whileとかあるし、ライブラリが使いやすそう
defunとかmapcarなくて戸惑ってるけど、これから勉強します
0204デフォルトの名無しさん
2008/01/20(日) 18:44:45define
map
0205デフォルトの名無しさん
2008/01/20(日) 19:07:12用途に合わせて使い分けるもんじゃないの?
0206デフォルトの名無しさん
2008/01/20(日) 19:18:13再帰は苦手だけど、この本の再帰の妥当性チェックの仕方の
説明が良かった。コツを掴めそう。
0207デフォルトの名無しさん
2008/01/20(日) 19:27:45> 用途に合わせて使い分けるもんじゃないの?
どの辺で切り分けるかでいつも迷う.
0208デフォルトの名無しさん
2008/01/20(日) 19:32:14後で追加したものを優先したくて、一発である時点へ戻したいという場合は連想リスト。
どちらでもなければ、どちらでもいい。w
0209デフォルトの名無しさん
2008/01/20(日) 19:33:08The Scheme Programming Language, 3rd Edition
米国では評価高いみたいですが読んだ人どうですか?
0210デフォルトの名無しさん
2008/01/20(日) 19:54:09> どちらでもなければ、どちらでもいい。w
ここだろ? >>207 が頭抱え込んでるのは…
0211デフォルトの名無しさん
2008/01/20(日) 19:57:080212デフォルトの名無しさん
2008/01/20(日) 20:04:36おれはscheme一筋って人いますか?
0213デフォルトの名無しさん
2008/01/20(日) 20:16:13さすがに高級アセンブラであるところの C を知らねぇって奴はいないんじゃねぇの?
C++ とはあまりお近づきになりたくないのは確だけど。W
0214デフォルトの名無しさん
2008/01/20(日) 20:27:520215デフォルトの名無しさん
2008/01/20(日) 20:51:28巻末の仕様書。
0216デフォルトの名無しさん
2008/01/20(日) 21:20:230217デフォルトの名無しさん
2008/01/20(日) 21:32:41(if (not (cdr var-list))
(proc-list (car val-list))
(progn
(proc-list (car val-list))
(my-foreach proc-list (cdr val-list)))))
(setq list-a '(1 2 3 4))
(1 2 3 4)
(my-foreach '(lambda (x) (print x)) 'list-a)
foreachのような関数をlispで作ろうと考えたのですが、どうもうまくいきません。
上記のようにするとlist-aがvoidだと怒られてしまいます。
0218デフォルトの名無しさん
2008/01/20(日) 22:00:18ツウジテナイw
0219デフォルトの名無しさん
2008/01/20(日) 23:03:138008の頃からマイクロプロセッサさわってると衝動的にその罠に落ちる。
#でもarm7とかだと今でも有効なキガス
0220デフォルトの名無しさん
2008/01/20(日) 23:21:24>>213 は (equal? C 高級アセンブラ) => #t
>>216 のは (equal? C アセンブラ) の評価結果はどうなるんだ?
0221デフォルトの名無しさん
2008/01/20(日) 23:28:24amb!
amb!
0222デフォルトの名無しさん
2008/01/20(日) 23:45:42そうだと思う。>>216,>>219は妙だw
0223デフォルトの名無しさん
2008/01/21(月) 00:30:54どこから突っ込めばいいのか……
とりあえず val-list の引用符いらない
0224デフォルトの名無しさん
2008/01/21(月) 00:31:31(defun my-foreach (proc-list val-list)
(if (not (cdr val-list))
(funcall proc-list (car val-list))
(progn
(funcall proc-list (car val-list))
(my-foreach proc-list (cdr val-list)))))
(setq list-a '(1 2 3 4))
(1 2 3 4)
(my-foreach #'(lambda (x) (print x)) 'list-a)
schemeと違ってlispはfuncallしないと関数は呼び出せないよ。
0225デフォルトの名無しさん
2008/01/21(月) 00:49:15(my-foreach #'(lambda (x) (print x)) list-a)
0226デフォルトの名無しさん
2008/01/21(月) 01:54:50なるほど、勉強になりました。どうもです。
0227デフォルトの名無しさん
2008/01/21(月) 02:57:56全文公開されてるから読め。
0228デフォルトの名無しさん
2008/01/21(月) 12:51:48自分的にはドラえもんの「人生やり直し機」みたいなイメージをもっているんだが。
0229デフォルトの名無しさん
2008/01/21(月) 13:33:400230デフォルトの名無しさん
2008/01/21(月) 14:16:46的確なイメージですね
0231デフォルトの名無しさん
2008/01/21(月) 15:16:380232デフォルトの名無しさん
2008/01/21(月) 17:03:49ファーストクラスの人生は、やり直す必要がない。
0233デフォルトの名無しさん
2008/01/21(月) 22:11:06で、ファーストクラス未満の人生は、やり直しが効かないと…
0234デフォルトの名無しさん
2008/01/21(月) 22:44:04出直しならできるんじゃない。本人は変われないが環境を変えることはできる。
Schemeだと昔の環境を保存しておいて復元した環境に飛び込んでいくんでないの。
0235デフォルトの名無しさん
2008/01/21(月) 23:38:56人生に関しては逆だよ、変わるのは環境じゃなく自分。
乱暴に言えば自分しか変われる要素は無い。
0236デフォルトの名無しさん
2008/01/21(月) 23:40:270237デフォルトの名無しさん
2008/01/22(火) 01:22:280238デフォルトの名無しさん
2008/01/22(火) 11:29:020239デフォルトの名無しさん
2008/01/22(火) 21:09:160240デフォルトの名無しさん
2008/01/22(火) 21:26:310241デフォルトの名無しさん
2008/01/22(火) 21:41:120242デフォルトの名無しさん
2008/01/22(火) 21:50:38「静かな湖畔の...」と対になる曲が必要だな。
0243デフォルトの名無しさん
2008/01/23(水) 08:33:14>黒田さんとかshiroさんレベルになれれば、
shiroさんはコードとか読んでも本当に凄いと思うんだけど、
黒田さんって凄いの? どっかで氏が書いたコード読めますか?
どんだけ凄いのか是非読んでみたい。
話だけ聞いてると名物*ANSI* CL厨親父にしか思えない人が多い気がする。
0244デフォルトの名無しさん
2008/01/23(水) 08:34:53これは gauche の仕様っていう認識で OK?
0245デフォルトの名無しさん
2008/01/23(水) 08:40:360246デフォルトの名無しさん
2008/01/23(水) 09:49:23そもそもないのね。
SICP に書いてあったから、あるのかと思った。
0247デフォルトの名無しさん
2008/01/23(水) 12:01:030248デフォルトの名無しさん
2008/01/23(水) 14:03:19というか何故クオートつけるのか分からない…
0249デフォルトの名無しさん
2008/01/23(水) 15:10:53Schemeの場合は()は自己評価的でないからクォートしなければならないとR5RSに明記されている
空リストはアトムだから自己評価的だという考え方もできるけど
リストだからクォートしなければならないとも考えられる。
個人的には自己評価的のほうが自然だと思えるけど。
CLなら自己評価的だからクォートしなくてもいい。
後者については
CLの場合はクォートしない(lambda ...)はlambdaマクロとして評価されて
#'(lambda ...)に展開される。(らしい。CLはよく知らない)
#(...)もCLだと自己評価的、Schemeだとクォートしなければならないけど
自己評価的でいいのに。
0250デフォルトの名無しさん
2008/01/23(水) 16:39:52色々弄ってたら酷い例を見つけてしまった
(flet ((function (x) x)) #'(lambda (x) x))
0251デフォルトの名無しさん
2008/01/23(水) 16:43:34をいをい。#(...) は配列だぞ。#' でひとかたまり。
0252デフォルトの名無しさん
2008/01/23(水) 18:57:53違う話だからパラグラフを分けたのに><
0253デフォルトの名無しさん
2008/01/23(水) 20:07:520254デフォルトの名無しさん
2008/01/23(水) 20:25:280255デフォルトの名無しさん
2008/01/23(水) 20:40:140256デフォルトの名無しさん
2008/01/23(水) 21:40:53シンボルの例があるから妙な主張でしたね
Schemeの場合#'が(syntax ...)に展開される処理系もあるってことも最初書いてたんだけど
さすがにこの話ではないと思って削って
ついでに#(...)の段落を足したんでした
どこかでCLにおける#()は(vector ...)に展開される入力マクロだからクォートしないって見たような気がするけど
違いますよね?
0257デフォルトの名無しさん
2008/01/23(水) 21:46:40自体が自己評価的。つまり、何度 eval しても変わらない。
0258デフォルトの名無しさん
2008/01/24(木) 00:44:50トークショーでの黒田さんのツッコミ能力はすごいぞ。その点期待はずれなのが小飼弾だ。
0259デフォルトの名無しさん
2008/01/24(木) 00:46:520260デフォルトの名無しさん
2008/01/24(木) 00:57:37まぁ WiLiKi の Scheme:マクロ:CommonLispとの比較:意味論 で Shiro さんが「黒田さんに指摘されてはたと膝を打った次第です。」と書くくらいだからね。
「名物*ANSI* CL厨親父」ってのは初耳な単語だが、まずもうちょっと謙虚に相手の言う事を考える事も必要だと思うよ。
0261デフォルトの名無しさん
2008/01/24(木) 01:05:380262デフォルトの名無しさん
2008/01/24(木) 01:33:28<expression>が<datum>であるべきだと仮定すると、
()がreadされた時点で自己評価的なオブジェクトになってるわけだから
やっぱり(quote ())というのは冗長だよなぁ
0263デフォルトの名無しさん
2008/01/24(木) 01:40:22授業ページ(記号処理プログラミング)のリンク切れてるね。
とりあえず2007年度のもの。
http://web.sfc.keio.ac.jp/~t03596hh/lisp/wiki.cgi
0264デフォルトの名無しさん
2008/01/24(木) 16:55:36この本、いいなぁ。8章からラムダ計算のこと、Lispによって具体的に説明している。
高橋正子先生の教えを受けたんだ。茨城に住んでいたらぜひとも聴講に行きたいところだ。
0265デフォルトの名無しさん
2008/01/24(木) 17:11:47そいつのブログ見てみろよ。ひどいぜ。
愚痴ばっかだし、自分の研究室の学生をバカにするようなことまでブログに書くんだぜ。
とても大学の教員とは思えない幼稚な記事ばかり。
0266デフォルトの名無しさん
2008/01/24(木) 17:27:528章は良いですね。
http://book.mycom.co.jp/book/4-8399-2081-8/4-8399-2081-8.shtml
わかっていて買う人は良いですけど。
タイトル買いをしてCommon Lispの入門に使えないのは残念だと思います。
プログラムをCommon Lispで動くかどうかも試してないみたいですし。
0268264
2008/01/24(木) 22:03:16黄金比の固有値、固有ベクトルなんかにも触れていたり。
数学へのモチベーションも上がるし高校生なんかにはいいんじゃないかね。
0269デフォルトの名無しさん
2008/01/24(木) 22:20:400270デフォルトの名無しさん
2008/01/24(木) 23:28:11> 黄金比の固有値、固有ベクトルなんかにも触れていたり。
で, どのあたりが
> 数学へのモチベーション
につながるのかな?
0271デフォルトの名無しさん
2008/01/25(金) 01:15:13自分はλ計算についてこの本で知った
そしてすぐに高橋正子の計算論、グレアムのAnsi Common Lisp、ディヴィグのプログラミング言語Schemeを買ってどっぷりはまったクチ
でも「代入文は使わない」のところで(Cの)初期化と代入を混同してるような文章がある等
あちこち気になる点があるのも事実
それに高校生の「数学への」モチベーションにはならないと思う
だけどLispやλ計算を知るきっかけになってくれたことには感謝してる
(λ記法は知ってたけどλ算法は知らなかった)
0272デフォルトの名無しさん
2008/01/25(金) 01:16:53ぱっと見わからないなw
ごめんなさい
0273デフォルトの名無しさん
2008/01/25(金) 01:28:58あの入門本から計算論ていけるもんですか?
0274デフォルトの名無しさん
2008/01/25(金) 01:33:240275デフォルトの名無しさん
2008/01/25(金) 01:45:570276デフォルトの名無しさん
2008/01/25(金) 01:55:490277271-272
2008/01/25(金) 02:02:46自分は素地というよりλ計算の美しさに魅せられたからだと思ってる
0278271-272
2008/01/25(金) 02:09:56自分の素地といえば
・車輪の再発明が大好き
・Smalltalkに惚れた
・MIPSのアーキテクチャに惚れた
・Windows、32bitのx86を毛嫌いしている
・今はSchemeに夢中
・でも一番美しいのはλ式だと思ってる
「美しいものを嫌いな人がいるのかしら?」ってとこかなw
0279デフォルトの名無しさん
2008/01/25(金) 02:10:000280デフォルトの名無しさん
2008/01/25(金) 02:15:280281271-272
2008/01/25(金) 02:25:15λ式よりもコンビネータ理論のほうが美しいと言う人もいますしね
0282デフォルトの名無しさん
2008/01/25(金) 03:05:230283デフォルトの名無しさん
2008/01/25(金) 04:07:480284デフォルトの名無しさん
2008/01/25(金) 05:13:37大学1年で線形代数をみっちりやるじゃない。
後期で固有値、固有ベクトルをやったんだけどその応用のひとつ。
フィボナッチ数列が行列の積として表せて固有値を計算すると黄金比
がでてくるなんてすごいじゃんと思った。
萩谷先生の「関数プログラミング」にもそういう題材があったと思う。
本はどこに片付けたかわからなくて確かめられないけど、たしか
あったと思う。
高校でやる行列やベクトルが実はとても面白い分野と将来結びついてくる
ということを知ればもっともっと数学が楽しくなると思う。
0285275
2008/01/25(金) 08:35:200286デフォルトの名無しさん
2008/01/25(金) 13:25:080287デフォルトの名無しさん
2008/01/25(金) 15:50:30優秀な人は高校の時に固有値、固有ベクトルに慣れ親しんでるらしいね。
萩谷先生の本だったかエッセーだったかに「高校時代に慣れ親しんだ...」みたいな
話があったと思う。
0288286
2008/01/25(金) 19:31:03だって優秀じゃないし(^_^;)
0289デフォルトの名無しさん
2008/01/25(金) 19:42:590290デフォルトの名無しさん
2008/01/25(金) 20:05:520291デフォルトの名無しさん
2008/01/25(金) 20:46:100292デフォルトの名無しさん
2008/01/25(金) 22:44:59Lisp系だと「原理主義」にどう対応するかで派閥があるからなぁ。
0293デフォルトの名無しさん
2008/01/25(金) 23:50:56単なる茶々だけど
> ・MIPSのアーキテクチャに惚れた
NIPS 32bit: シンプルでかわぇぇ!!!
MIPS 64bit: バッチィ… 特にアドレス空間周りがorz
消防とか厨房とかの頃, 好きだった女の子に同窓会でであったら… … …
てな, 心境だったな > MIPS 64bit
0294デフォルトの名無しさん
2008/01/25(金) 23:52:33> ディヴィグ本買いそびれてオジサン涙目 orz
げええっ、絶版かよ!俺もまだ買ってないのに!
http://www.amazon.co.jp/dp/4894712261
> 現在在庫切れです。この商品の再入荷予定は立っておりません。
0295デフォルトの名無しさん
2008/01/26(土) 00:24:54激しく同意です
R3000はイカスけどR4000はイケてない
遅延スロット使ってストールなしに分岐できるのがクールなのに
といいつつ一番弄ったMIPSはEmotionEngine(^^;)
>>294
某大手書店の最後の一冊買っちゃった
日本語版の初版第2刷
オライリーさん、>>209の日本語版よろしくです
0296デフォルトの名無しさん
2008/01/26(土) 00:46:07これって名著なの?
俺買ったけど面白くなかったからSICP買って今それ読んでる。
SICP読み終わってからこれ読んだらわかるようになってるかな?
0297デフォルトの名無しさん
2008/01/26(土) 00:49:36グレアムのAnsi Common Lisp/On Lispの方がずっといい
けどSchemeは本が少ないから
自分が持ってるのはディヴィグ本の日本語版、SICPの日本語版、Schemeによる記号処理入門
0298デフォルトの名無しさん
2008/01/26(土) 00:53:240299sage
2008/01/26(土) 07:53:15LISP は LISP で アトム を定義することができない
そんな、気がするんだが気のせいか?
0300デフォルトの名無しさん
2008/01/26(土) 09:12:44atom は pure lisp の5関数(CAR、CDR、CONS、ATOM、EQ)に含まれているんだからそらそうでしょ
0301デフォルトの名無しさん
2008/01/26(土) 10:29:100302デフォルトの名無しさん
2008/01/26(土) 12:35:10>プログラムをCommon Lispで動くかどうかも試してないみたいですし。
本のサポートページにソースがあったのでちょっとだけ試してみた。
ttp://book.mycom.co.jp/support/e2/lisp/
8章のコードはGCLならOKだったよ。SBCLだとひっかったのがあったけど。
CLだとfuncallとか1+をquoteしなきゃならないとか気持ち悪いので
Schemeで書き直そうかと思っている。
0303デフォルトの名無しさん
2008/01/26(土) 13:07:21Lisp、Schemeは都度実際に計算していくので
λとは違うみたいだね。
Lispでλ式をλ計算どおりに簡約化していくものを作ったら面白いかも。
0304303
2008/01/26(土) 13:12:05ttp://hagi.is.s.u-tokyo.ac.jp/boomborg/boomborg-red-j.html
0305デフォルトの名無しさん
2008/01/26(土) 15:50:38いかにしてα変換をサボるかが重要なわけだが
((lambda (x) (lambda (y) x)) y) => (lambda (foo) y)
0306デフォルトの名無しさん
2008/01/26(土) 16:15:30OpenBSDザウルスでGaucheが動かせるようになったー!
pdaXromやtitchyやPocketWorkstationに浮気する必要がなくなったー!
0307デフォルトの名無しさん
2008/01/26(土) 18:05:38その辺りは昔、関数型言語の遅延評価の実装で良く議論されました。
古いけど全文公開されている↓の「第二部 グラフ簡約」など。
http://research.microsoft.com/~simonpj/papers/slpj-book-1987/slpj-book-1987.pdf
0308デフォルトの名無しさん
2008/01/26(土) 20:45:52>>307
面白くなってきたので今晩、Schemeでλ計算インタープリタを書いてみるよ。
0309デフォルトの名無しさん
2008/01/26(土) 22:34:06(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))
(define (lambda? f)
(and (list? f) (eq? (car f) 'lambda)))
(define (atom? f)
(and (not (pair? f))))
(define (beta-redix? f)
(and (lambda? (car f))
(not (null? (cdr f)))))
0310デフォルトの名無しさん
2008/01/26(土) 22:34:45(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))
;; (((lambda (x) ...) M)) -> ((lambda (x) ...) M)
(define (deep-lambda? f)
(cond ((lambda? f) #f)
((atom? (car f)) #f)
((and (list? (caar f)) (eq? (caaar f) 'lambda)) #t)
(else #f)))
(define (reduction form)
(cond ((deep-lambda? form) (reduction (car form)))
((not (beta-redix? form)) form)
(else (begin (display form)(newline)
(reduction (beta-conversion (car form) (cadr form)))))))
(define foo '((lambda (x) x) (lambda (a) a)))
(define bar '((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a)))
0311デフォルトの名無しさん
2008/01/26(土) 22:37:43((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a))
((lambda (a) a) ((lambda (z) x z) (lambda (z) z)))
((lambda (z) x z) (lambda (z) z))
(x (lambda (z) z))
新納先生のp157をやってみて同じ結果になったつもりなんだけど...
こんなんでいいのだろうか?
β変換しか考えていない。α変換は無視している。
0312デフォルトの名無しさん
2008/01/26(土) 22:44:47まあ副作用無視なら単純だよ。
0313デフォルトの名無しさん
2008/01/26(土) 23:29:18正直、まだよく理解できていない。こういうことをやることがλ計算と
言われるものなのだろうか???
0314デフォルトの名無しさん
2008/01/26(土) 23:40:32((lambda (x) x) y)
(y)
これは(null? (cdr f))とかすればいいとして
> (reduction '(x ((lambda (x) x) y)))
(x ((lambda (x) x) y))
こっちが面倒だな
0315デフォルトの名無しさん
2008/01/27(日) 07:27:52あ、そっか。なるほど〜。
考えてみる。λ計算ってのはなかなか面白いね。
かんばってチャーチ、ロッサーの定理にも挑戦してみたい。
0316デフォルトの名無しさん
2008/01/27(日) 08:35:22(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))
(define (lambda? f)
(and (list? f) (eq? (car f) 'lambda)))
(define (atom? f)
(and (not (pair? f))))
(define (beta-redix? f)
(cond ((atom? f) #f)
((and (atom? (car f)) (null? (cdr f))) #f)
((and (lambda? (car f))(not (null? (cdr f)))) #t)
((lambda? (caadr f)) #t)
(else #f)))
0317デフォルトの名無しさん
2008/01/27(日) 08:36:45(and (lambda? (car f))(not (null? (cdr f)))))
(define (right-lambda? f)
(lambda? (caadr f)))
(define (beta-conversion l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))
(define (deep-lambda? f)
(cond ((lambda? f) #f)
((atom? (car f)) #f)
((and (list? (caar f)) (eq? (caaar f) 'lambda)) #t)
(else #f)))
(define (var? f)
(and (atom? (car f)) (null? (cdr f))))
(define (deep-lambda2? f)
(and (lambda? (car f)) (null? (cdr f))))
0318デフォルトの名無しさん
2008/01/27(日) 08:37:34;; (x) -> x
;; ((lambda (a) a)) -> (lambda (a) a)
(define (simpl f)
(cond ((atom? f) f)
((deep-lambda? f) (car f))
((deep-lambda2? f) (car f))
((var? f) (car f))
(else f)))
(define (reduction form)
(cond ((not (beta-redix? form)) form)
((left-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (car form) (cadr form))))))
((right-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (caadr form) (cadr (cadr form)))))))))
(define foo '((lambda (x) x) (lambda (a) a)))
(define bar '((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a)))
(define baz '(x ((lambda (x) x) y)))
(define boo '((lambda (x) x) y))
0319デフォルトの名無しさん
2008/01/27(日) 08:39:33((lambda (x) x) (lambda (a) a))
(lambda (a) a)
> (reduction bar)
((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a))
((lambda (a) a) ((lambda (z) x z) (lambda (z) z)))
((lambda (z) x z) (lambda (z) z))
(x (lambda (z) z))
> (reduction baz)
(x ((lambda (x) x) y))
y
> (reduction boo)
((lambda (x) x) y)
y
>
こんどはいいかな?
0320デフォルトの名無しさん
2008/01/27(日) 09:02:39> (reduction uoo)
((lambda (x) (lambda (y) x)) y)
(lambda (y) y)
>
これがダメなんだけどα変換がよくわからない。
高橋正子先生の本にもα変換がないみたい。
0321デフォルトの名無しさん
2008/01/27(日) 09:42:50(define (beta-redix? f)
(cond ((atom? f) #f)
((and (atom? (car f)) (atom? (cadr f))) #f)
((and (atom? (car f)) (null? (cdr f))) #f)
((and (lambda? (car f))(not (null? (cdr f)))) #t)
((lambda? (caadr f)) #t)
(else #f)))
(define (reduction form)
(cond ((not (beta-redix? form)) form)
((left-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (car form) (cadr form))))))
((right-lambda? form)
(begin (display form)(newline)
(reduction (list (car form)
(simpl (beta-conversion (caadr form) (cadr (cadr form))))))))))
> (reduction baz)
(x ((lambda (x) x) y))
(x y)
0322デフォルトの名無しさん
2008/01/27(日) 18:13:47つ旦
0323デフォルトの名無しさん
2008/01/27(日) 19:17:30ども
だけどGC周りがまだ怪しいから手をくわえなきゃいけない
0324デフォルトの名無しさん
2008/01/27(日) 21:14:25gauche.night前売りktkr。今年は黒田さん出ないの?
0325デフォルトの名無しさん
2008/01/27(日) 23:02:15黒黒田でないんじゃつまらんなぁ
0326デフォルトの名無しさん
2008/01/27(日) 23:14:26λ式をリストで表現してると、名前の衝突回避は難しいような
0327デフォルトの名無しさん
2008/01/27(日) 23:35:04> uoo2
((lambda (x) (lambda (z) x)) y)
> (reduce uoo2)
((lambda (x) (lambda (z) x)) y)
(lambda (z) y)
>
束縛変数の付け替えをすればうまくいくはずで、そのことを
α変換というのだと思う。で、このα変換をどのようにアルゴリズム
として表現できるのかと考えている。
新納先生のp156のβ変換の説明の最初にあるアンダーラインの部分が
α変換のことだと思う。
コンパイラ設計者には必須の知識らしいんだけどさっぱりわからない。
0328デフォルトの名無しさん
2008/01/27(日) 23:38:22> two
((lambda (x) (lambda (s) (s (s x)))) 0)
> (reduce two)
((lambda (x) (lambda (s) (s (s x)))) 0)
(lambda (s) (s (s 0)))
> ((lambda (s) (s (s 0))) 1+)
2
>
SICPの1章にもあったような気もするけど忘却の彼方。
0329デフォルトの名無しさん
2008/01/27(日) 23:47:460330326
2008/01/27(日) 23:58:13ああそうか、ちょっと勘違いしてたみたいだ。
(lambda ...) に代入するときに名前を変えてやればいいんだから、
そんなに難しくはないね。
0331デフォルトの名無しさん
2008/01/28(月) 00:05:11住井先生の速攻MinCamlコンパイラ概説のAlpha.mlが読めればそれを参考にするといいかも.
ttp://min-caml.sourceforge.net/
MinCamlではλ式でなくlet recのところでローカル関数を定義するけどね.
構文木を上から調べていって,変数が導入されていたら
グローバルなカウンタか何かを使ってとにかく一意な名前に変えてしまう( x → x1, y → y2 etc. )
そしてハッシュでその対応を覚えておく.
ネストした変数束縛で同じ "x" が再び現れたら,
そこから下の部分木では対応は x → x1 でなく x → x3 (例えば)であるとハッシュを更新.
例.構文木のうち見終わった部分を [] で書くと...
(lambda (x) (lambda (y) (lambda (x) (list x y x))))
→ [lambda [x1] (lambda (y) (lambda (x) (list x y x)))] with {x → x1}
→ [lambda [x1] [lambda [y2] (lambda (x) (list x y x))]] with {x → x1, y → y2}
→ [lambda [x1] [lambda [y2] [lambda [x3] (list x y x)]]] with {x → x3, y → y2}
→ [lambda [x1] [lambda [y2] [lambda [x3] [list x3 y2 x3]]]] with {x → x3, y → y2}
0332デフォルトの名無しさん
2008/01/28(月) 01:35:10クロージャーの補足する環境にオブジェクトの値ではなく参照を含めるだけじゃダメなの?
scheme的にはどう?
0334デフォルトの名無しさん
2008/01/28(月) 10:26:25http://blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx
0335306=323
2008/01/28(月) 17:16:0345%程度の確率で*load-path*が破損している
55%: ("../test" "../lib" "../libsrc" "../src" ...)
45%: ("\f" "../lib" "../libsrc" "../src" ...)
みたいな感じ
-Iで与えられたディレクトリ名のみが破壊されてる
破壊されるパターンはランダムではなく、
いつも決まった文字列にすり替わってる
GC_DONT_GC=Yesすると0%になるからGC周りの問題なんだろうけど
どこが悪いのか見当もつかない
せめて同じ引数で起動したときには同じ状況になってくれればいいのに
0336デフォルトの名無しさん
2008/01/28(月) 23:03:080337デフォルトの名無しさん
2008/01/28(月) 23:36:35そのザウルス大丈夫なんだろうな?
0338306
2008/01/28(月) 23:44:17・最初のプロンプトが出る前にGCが発動した場合にのみ破壊が起こってること
・プロンプトが出た後のGCによって破壊されることは(今のところ)ないこと
・同じカレントディレクトリに同じ環境変数に同じコマンドライン引数でgoshを起動しても
最初のプロンプトが出る前にGCが発動するのが1000回試行中440回程度あること
・-I引数をいくつも与えると"srfi-6"とか"srfi-2"とか意味のある文字列にすりかわったりする場合があること
・同じカレントディレクトリに同じ環境変数に同じコマンドライン引数で起動した場合
すりかわった後の文字列はいつも同じであること
これらの材料でアタリをつけられる人いませんか?
0339306
2008/01/28(月) 23:58:06稼働時間長すぎて不安定になってるって可能性のほうが高いかもw
セルフコンパイル&セルフデバッグ&SSH鯖だから
0340306
2008/01/29(火) 00:05:48プログラムを起動しようとしてもBad Addressで起動しなかったりするようになる
何度も何度もチャレンジすれば起動するけど
i386-OpenBSDならそういうことないんだけど
でもそういうハード的な原因ならもっとランダムに破壊されそうなものだけど
破壊される場合は必ず同じパターンに破壊されるからソフト側の問題だと思う
Boehm-GCの機種依存部分であるスタックの底とstatic領域の始点を得る関数は
破壊パターン正常パターンともに同じ値を返してます
Gauche本体に当てたパッチはDOUBLE_ARMENDIANを未定義にするってのだけだから
やはりBoehm-GCに当てたパッチのバグ臭い
0341デフォルトの名無しさん
2008/01/29(火) 01:11:53CPUのレジスタも?・・・考えるだけでも恐ろしい
0342306
2008/01/29(火) 01:30:37どうもレジスタの指す領域のマーク漏れ臭い
でもi386-OpenBSDでは問題ないし
Linuxザウルスではうまくいってる(らしい)から
もうBoehm-GC側では怪しいところはないんだけどなぁ
0343デフォルトの名無しさん
2008/01/29(火) 06:46:25;;λ計算インタープリタ ver0.3
(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))
(define (atom? f)
(and (not (pair? f))))
;;λ式の判定 定義2.1.1(計算論)
(define (lambda-term? f)
(cond ((symbol? f) #t) ;x0,x1...
((number? f) #t) ;1,2,3..数もλ式ということにする。
((null? (cdr f)) #f) ;(M)
((and (eq? (car f) 'lambda)(symbol? (caadr f))(lambda-term? (caddr f))) #t);λx.M
((and (lambda-term? (car f))(lambda-term? (cadr f)))) ;(M N)
(else #f)))
0344デフォルトの名無しさん
2008/01/29(火) 06:47:41(define (alfa-conversion f)
(genvar 'reset)
(reset-var)
(alfa-conversion1 f))
(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)) (l '()))
(bound (caadr f) new)
(set! l (list 'lambda (list new) (alfa-conversion1 (caddr f))))
(reset-var)
l))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))
;;変数リスト
;;((x . x1)(y . x2) ...)
(define var-assoc '())
(define (bound? v)
(let ((ans (assq v var-assoc)))
(if ans
(cdr ans)
#f)))
0345デフォルトの名無しさん
2008/01/29(火) 06:49:06(set! var-assoc (cons (cons old new) var-assoc)))
(define (reset-var)
(set! var-assoc '()))
;; 変数を生成する
(define genvar
(let ((x -1))
(lambda (msg)
(cond ((eq? msg 'gen)
(begin (set! x (+ x 1))
(string->symbol (string-append "x" (number->string x)))))
((eq? msg 'reset)(set! x -1))))))
;;β基の判定 (λx.M)N 計算論p66
(define (beta-redex? f)
(cond ((atom? f) #f)
((atom? (car f)) #f)
((and (eq? (caar f) 'lambda)
(symbol? (caadar f))
(lambda-term? (caddar f))
(lambda-term? (cadr f))) #t)
(else #f)))
0346デフォルトの名無しさん
2008/01/29(火) 06:49:59(define (beta-normal-form? f)
(cond ((and (lambda-term? f)(symbol? f)) #t) ; x0
((and (lambda-term? f)(beta-redex? (cadr f))) #f) ;(x λx.M)
((and (lambda-term? f)(not (beta-redex? f))) #t)
(else #f)))
;;β変換
(define (beta-reduce l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))
;; ((N M)) -> (N M)
;; (x0) -> x0
;; (N) -> N
(define (simpl f)
(cond ((lambda-term? f) f)
((and (lambda-term? (car f))(null? (cdr f))) (car f))
((and (lambda-term? (caar f))(lambda-term? (cadar f))) (car f))
(else f)))
(define (reduce form)
(reduce1 (alfa-conversion form)))
0347デフォルトの名無しさん
2008/01/29(火) 06:51:56(cond ((beta-normal-form? form) form)
((beta-redex? form)
(begin (display form)(newline)
(reduce1 (simpl (beta-reduce (car form) (cadr form))))))
((beta-redex? (cadr form))
(begin (display form)(newline)
(reduce1 (list (car form)
(simpl (beta-reduce (car (cadr form)) (cadr (cadr form))))))))))
> uoo
((lambda (x) (lambda (y) x)) y)
> (reduce uoo)
((lambda (x0) (lambda (x1) x0)) y)
(lambda (x1) y)
>
長々とスマンです。
0348デフォルトの名無しさん
2008/01/29(火) 07:10:53しかもARM?バグバグの予感
0349デフォルトの名無しさん
2008/01/29(火) 07:15:28> bar
((lambda (y) (y ((lambda (z) (x z)) (lambda (z) z))))
(lambda (a) a))
> (reduce bar)
((lambda (x0) (x0 ((lambda (x1) (x x1)) (lambda (x2) x2)))) (lambda (x3) x3))
((lambda (x3) x3) ((lambda (x1) (x x1)) (lambda (x2) x2)))
((lambda (x1) (x x1)) (lambda (x2) x2))
(x (lambda (x2) x2))
>
0350デフォルトの名無しさん
2008/01/29(火) 12:58:28BoehmってXScaleできちんとした実績あるのかなあ
0351デフォルトの名無しさん
2008/01/29(火) 15:24:15余分な括弧を許してsimplを使うのがまわりくどい。
括弧の代わりにXMLみたいなタグをイメージしてみたら?
タグは<variable><application><abstraction>の3種類とする。
余分なタグをつけると意味が変わってしまうから、
余分なタグのない状態を保つことになり、simplなんていらなくなる。
それ以前にβ正規形の定義がおかしい。
β基は一番上とcadr以外の場所にもあるから全部探さないと
0352デフォルトの名無しさん
2008/01/29(火) 17:17:23>β基は一番上とcadr以外の場所にもあるから全部探さないと
具体的にどういう場合なのか教えてくれないか。考えてみたいんで。
0353デフォルトの名無しさん
2008/01/29(火) 17:59:52バックトラッキングみたいなことかな?
0354デフォルトの名無しさん
2008/01/29(火) 19:01:440355デフォルトの名無しさん
2008/01/29(火) 19:05:57最外簡約とかでググって。
>>307の本にも詳しく解説してある。
0356デフォルトの名無しさん
2008/01/29(火) 19:07:150357デフォルトの名無しさん
2008/01/29(火) 19:39:46言わんとすることがなんとなくわかってきた。
朝、早起きできたら書き直してみるよ。
0358デフォルトの名無しさん
2008/01/29(火) 23:06:500359306
2008/01/30(水) 06:37:02グローバル変数pre_cmdsがDATASTARTとDATAENDの間に位置してないから
スキャンの対象外になってたせいのようです
DATASTARTとDATAENDを正しく取得できるようにすればいいようです
0360デフォルトの名無しさん
2008/01/30(水) 07:25:090361306
2008/01/30(水) 07:26:45最初にsegvったところ(の1ワード手前)が.rodataセクションの開始点だと仮定してるようですが
arm-OpenBSDはセクションの間ごとにsegvるので
.bssセクションのみをスキャン対象にしてしまうようです
OpenBSD4.2のportsのパッチはそこらへんを工夫してうまくやってるようです
0362デフォルトの名無しさん
2008/01/30(水) 07:42:510363デフォルトの名無しさん
2008/01/30(水) 09:46:180364デフォルトの名無しさん
2008/01/30(水) 20:09:530365306
2008/01/30(水) 20:50:26ヒープへのポインタは入り得ないので
dataセクションとbssセクションをスキャンするようにパッチを当て
test/system.scmのcond-expandのsigwait節にelse節を追加したら(pthreadを無効にしているため)
すべてのtestにpassしました
shiroさんのとこに報告しようと思います
C++とかだとコンストラクタの関係で
rodataセクションにもヒープへのポインタが入り得るのかな?
0366デフォルトの名無しさん
2008/01/30(水) 21:41:49Arcに期待してもいのかなあ?(期待したいのだけど)
「MzScheme上で動く」って言われても、
それを望んでいたのかなあ?
ソースも何も読んでないけど(「なら何も言うな!」はご勘弁を)
Paul Graham の名前で出てくるのだから
単にLISP処理系の一つではなく
「LISPもSchemeもまとめて、S式はArcに集まれ!」
ぐらいものを期待していたんだけど。
Arcをよく知ってる人!
解説よろしく!
0367デフォルトの名無しさん
2008/01/30(水) 21:46:260368デフォルトの名無しさん
2008/01/30(水) 22:02:50alrefは=(≒setf)のためだと思うが、
値を返してしまうので、成否がわからない。
この問題は多値/optional型がFAだと思うのだが…
0369デフォルトの名無しさん
2008/01/30(水) 22:06:22その割には(とりあえず)Schemeで実装されてるとこが本末転倒だけど。
0370デフォルトの名無しさん
2008/01/30(水) 22:13:41とにかく記述のコンパクトさにこだわってる感じ
スクリプト言語的な志向性というか
0371デフォルトの名無しさん
2008/01/30(水) 23:15:36「括弧が少なくて読みづらい」「識別子が短くて読みづらい」
だな
それとなぜかlogoが連想された
0372デフォルトの名無しさん
2008/01/30(水) 23:20:26あくまで、今のところは、だけど。今後の大化けに期待。
0373デフォルトの名無しさん
2008/01/30(水) 23:29:42画期的な武器があるのかも
0374デフォルトの名無しさん
2008/01/30(水) 23:31:50余計なカッコがつくのはbeta-reduceで余計なカッコがついてしまうのが原因だった。
;;β変換
(define (beta-reduce l m)
(let ((arg (caadr l))
(body (cddr l))) ;x0 -> (x0), (x y) -> ((x y))
(car (subst arg m body)))) ;(x-) -> x0,((x y)) -> (x y)
α変換の付け替えが違っていた。
(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)))
(bound (caadr f) new)
(list 'lambda (list new) (alfa-conversion1 (caddr f)))))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))
0375デフォルトの名無しさん
2008/01/30(水) 23:34:32;;β正規形 β-normal-form
(define (beta-normal-form? f)
(cond ((not (lambda-term? f)) #f)
((symbol? f) #t) ; x0,x1...
((number? f) #t) ; 1,2,3...
((and (list? f)(eq? (car f) 'lambda)
(beta-normal-form? (caddr f))) #t) ;λx.x
((and (list? f)
(symbol? (car f))
(beta-normal-form? (cadr f))) #t) ;(x λx.x)
((and (list? f)(symbol? (car f))(symbol? (cadr f))) #f) ;(x0 x1)
(else #f)))
0376デフォルトの名無しさん
2008/01/30(水) 23:35:20速度的にあまり期待できないなぁ。
せめてCommonLispで実装してほしかったよ。
0377デフォルトの名無しさん
2008/01/30(水) 23:36:53(define (reduce1 form)
(cond ((beta-normal-form? form) form) ;β-normal-form
((and (symbol? (car form))
(beta-redex? (cadr form))) ;(x0 M)
(begin (display form)(newline)
(reduce1 (list (car form) (reduce1 (cadr form))))))
((eq? (car form) 'lambda) ;λx.M
(begin (display form)(newline)
(reduce1 (list (car form)
(cadr form)
(reduce1 (caddr form))))))
((eq? (caar form) 'lambda)
(begin (display form)(newline)
(reduce1 (beta-reduce (car form) (cadr form))))) ;(λx.x)M
(else (error "Reduction error"))))
0378デフォルトの名無しさん
2008/01/31(木) 00:23:15ヒントください。
α変換。(lambda (x) (lambda (y) (x ((lambda (z) z) y))))だとうまくいくけど
そうすると((lambda (x) (lambda (y) x)) y)がうまくいかない。
λx.λy.λz のように深くなっていくときには一番内側のλ式から変換していくと
思うのだけどxyzを順番に変換していくのがよくわからない。
0379デフォルトの名無しさん
2008/01/31(木) 00:26:35http://pc11.2ch.net/test/read.cgi/tech/1193743693/485
イータ簡約って奴でしょ。
http://www.lambda-bound.com/book/lambdacalc/node21.html
0380デフォルトの名無しさん
2008/01/31(木) 01:24:32よく見てないけど、グレアムのことだからマクロは使えるんだろうな。
0381デフォルトの名無しさん
2008/01/31(木) 02:50:21何か新しいことあるの?
0382デフォルトの名無しさん
2008/01/31(木) 05:56:09知らなきゃ書けない1行目のあとに
知らない奴しか書かない2行目が続くのはどうかと。
0383378
2008/01/31(木) 07:20:54(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)) (l '()))
(push-var)
(bound (caadr f) new)
(set! l (list 'lambda (list new) (alfa-conversion1 (caddr f))))
(pop-var)
l))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))
(define (push-var)
(set! stack (cons var-assoc stack)))
(define (pop-var)
(set! var-assoc (car stack))
(set! stack (cdr stack)))
0384378
2008/01/31(木) 07:24:23すればいいみたいなので拡張する。
((lambda (x) (lambda (y) (x y))) a b)
((lambda (x y) (x y)) a b)
0385デフォルトの名無しさん
2008/01/31(木) 10:03:30ttp://www.amazon.co.jp/dp/4764901846/
この本を読んでおくとschemeに対する理解は
深まりますか?
0386デフォルトの名無しさん
2008/01/31(木) 11:50:23理解が深まると思うよ。
Guy L. Steele, Jr.はScheme開発の初期にチャーチの論文を
読んでたらしいから。Lispはλから離れてしまったけど
Schemeはλに近いと思う。
0387デフォルトの名無しさん
2008/01/31(木) 11:55:58ありがとう。ページ数も少ないし読みやすそうなので
読んで見ます。
0388デフォルトの名無しさん
2008/01/31(木) 12:15:01プログラミング言語の新潮流
http://www.amazon.co.jp/dp/4320023773/
コンピュータサイエンス入門−論理とプログラム意味論
http://www.amazon.co.jp/dp/4000061909/
http://guppy.eng.kagawa-u.ac.jp/2005/AdvProg/
「ラムダ計算 プログラミング言語の数学モデル」
http://www.kurims.kyoto-u.ac.jp/~cs/csnyumon/appendix_A.pdf
>>387
> ページ数も少ないし読みやすそうなので
あれは純然たる数学の本の体裁だから、
プログラミング言語入門的な本に比べると、
十万ページくらいある感じですよ。
あのシリーズは余分な解説はほとんどなくて骨子のみだし。
0389デフォルトの名無しさん
2008/01/31(木) 12:38:46>十万ページくらいある感じですよ。
そうだね。
故中西先生のLispの本も同じシリーズだったと思う。
とっつきは悪いけど時間が経てば理解が深まり名著だって
思うようになるんじゃないかな。最初に中西先生のLisp本
読んだときはさっぱりわからなかったもんなぁ。
0390デフォルトの名無しさん
2008/01/31(木) 12:42:49>>389
そうですか。
もう少しscheme勉強してから読むことにします。
でも絶版になったら嫌なんで買っておきます。
0391デフォルトの名無しさん
2008/01/31(木) 12:53:47Schemeは並行計算や遅延評価に強いわけでもないだろうに
Haskellが「遠い」ように見えるのは型があってマクロがないのが原因だな
0392デフォルトの名無しさん
2008/01/31(木) 13:04:050393デフォルトの名無しさん
2008/01/31(木) 18:30:370394デフォルトの名無しさん
2008/01/31(木) 20:12:29このスクリーンショットは...
http://journal.mycom.co.jp/photo/news/2008/01/30/022/images/001l.jpg
0395デフォルトの名無しさん
2008/01/31(木) 21:28:26Pascal みたいやな
0396デフォルトの名無しさん
2008/01/31(木) 21:38:290397デフォルトの名無しさん
2008/01/31(木) 22:22:390398デフォルトの名無しさん
2008/01/31(木) 22:41:320399デフォルトの名無しさん
2008/01/31(木) 22:50:41なにを思ってこの画面を載せたんだろーか
0400デフォルトの名無しさん
2008/01/31(木) 22:54:430401デフォルトの名無しさん
2008/01/31(木) 23:07:11arc関係なさすぎw
0402デフォルトの名無しさん
2008/02/01(金) 00:04:080403真人間になれ、忍
2008/02/01(金) 00:10:4304:07 PM shinobu@MBPro ~/Downloads/arc0
$ mzscheme -m -f as.scm
Use (quit) to quit, (tl) to return here after an interrupt.
arc> ^Cuser break
=== context ===
/Users/shinobu/Downloads/arc0/ac.scm:904:4
/Users/shinobu/Downloads/arc0/ac.scm:979:7
> (begin
(display "Hello, World!")
(newline))
Hello, World!
> ワラ
0404デフォルトの名無しさん
2008/02/01(金) 00:23:130405デフォルトの名無しさん
2008/02/01(金) 00:43:110406デフォルトの名無しさん
2008/02/01(金) 01:01:55とりあえず魚拓
http://s04.megalodon.jp/2008-0201-0059-28/journal.mycom.co.jp/news/2008/01/30/022/index.html
http://s03.megalodon.jp/2008-0201-0100-52/journal.mycom.co.jp/photo/news/2008/01/30/022/images/001l.jpg
0407デフォルトの名無しさん
2008/02/01(金) 02:04:530408デフォルトの名無しさん
2008/02/01(金) 07:40:310409デフォルトの名無しさん
2008/02/01(金) 08:37:010410デフォルトの名無しさん
2008/02/01(金) 11:00:14なら((fn (x) (x T 'foo 'bar)) if)みたいなことができたり
(apply if '(NIL foo bar))みたいなことができるのかな?
CLみたくマクロと特別式に分かれてるのかな?
Schemeみたく構文として(プリミティブと合成の違いはあるけど)一緒くたなのかな?
0411デフォルトの名無しさん
2008/02/01(金) 12:01:40macro-expandとかしなくてもapply出来るわな、動的に。
0412デフォルトの名無しさん
2008/02/01(金) 12:09:06Error: "#<procedure>: expects at least 3 arguments, given 0"
こういう時に匿名マクロが欲しい
0413デフォルトの名無しさん
2008/02/01(金) 17:32:32Error: "#<procedure>: expects at least 3 arguments, given 0"
何か変だと思ったら束縛するより先にマクロ展開してる
マクロと同じ名前の局所変数がマクロを隠すことがない
逆にマクロが変数を隠す問題はfuncallに相当するものを使って回避できる
(リストの先頭に来なければマクロに間違われることもないから)
0414デフォルトの名無しさん
2008/02/02(土) 01:56:420415デフォルトの名無しさん
2008/02/02(土) 06:13:13その本もってるが、定理と証明ばっかりでさっぱり判らん。
1章はともかく、2章辺りから終始論理式と、「〜を仮定すると
〜を満たす〜があるとき〜は〜の〜という」みたいな口調で
うんざりした。だから何、と。書き方が数学屋さん向け。
時代的に無理だろうけど「はじめに」でLISPの基礎理論だ
とか言うなら、それで書いてくれた方が良い。
プログラマの心理は、手段みたいなものは最初どうでもよくて、
結果や効果からの興味で中身がどうなってるか、と関心が
向いてくと思うんだけど、そういうのを期待できる本じゃない。
0416デフォルトの名無しさん
2008/02/02(土) 09:19:47SICP読んだだけの人にはわからんのです
0417デフォルトの名無しさん
2008/02/02(土) 12:46:00schemeのスコープで評価してないだけじゃないかと。
schemeだと
((lambda (list) (list)) (lambda () 'うんこ))
=>うんこ
ちゃんとうんこが出てきます。
0418デフォルトの名無しさん
2008/02/02(土) 15:31:120419デフォルトの名無しさん
2008/02/02(土) 17:16:180420ポール@アークヒルズ
2008/02/02(土) 17:24:440421デフォルトの名無しさん
2008/02/02(土) 18:05:260422デフォルトの名無しさん
2008/02/02(土) 19:38:25へ〜、イイ感じじゃん。
0423デフォルトの名無しさん
2008/02/02(土) 19:43:34これで便秘解消ですね!
0424デフォルトの名無しさん
2008/02/02(土) 19:46:12arc> (sqrt 2)
1.4142135623730951
arc> (sin 3.14)
Error: "reference to undefined identifier: _sin"
arc> (acos -1)
Error: "reference to undefined identifier: _acos"
arc>
arc> (* 1+1i 1+1i)
0+2i
arc>
0425デフォルトの名無しさん
2008/02/02(土) 20:09:55(def sum (f n)
(if (is n 0)
0
(+ (f n) (sum f (- n 1)))))
arc> (sum sqrt 10)
22.4682781862041
arc>
0426デフォルトの名無しさん
2008/02/02(土) 20:38:53arc> (def tak (x y z)
(if (> x y)
(tak (tak (- x 1) y z)
(tak (- y 1) z x)
(tak (- z 1) x y))
y))
#<procedure: tak>
arc> (tak 12 6 0)
12
arc> time
#3(tagged mac #<procedure>)
arc> (time (tak 12 6 0))
time: 18047 msec.
12
arc>
Schemeで書かれていることを考えれば悪くはない。
0427デフォルトの名無しさん
2008/02/02(土) 20:51:27Scheme = ポルシェ
Arc = アルファロメオ
0428デフォルトの名無しさん
2008/02/02(土) 21:10:430429デフォルトの名無しさん
2008/02/02(土) 22:19:26http://xach.livejournal.com/156584.html
0430デフォルトの名無しさん
2008/02/03(日) 00:56:48ポールは結局、前置記法に嫌気が差しただけに見える
pythonやMLみたいなのを設計した方が受けが良いと思う
頭に括弧がある限り、ただのLISP方言だよ
0431デフォルトの名無しさん
2008/02/03(日) 01:25:450432デフォルトの名無しさん
2008/02/03(日) 02:04:24PaulにとってLispの価値は「美しいこと」より「現実的に強いこと」のほうにあって、
「スケッチ的に手を動かして、試行錯誤で形を作っていける力」「同じことを短く書く力」は
特に大きなウェイトを占めるから、かの言語にある程度近づくのは読めたことだろう。
ただしPerlと違うのは、Lispの構文(あるいは構文の無さ)の範疇でそれをやっているからこそ、
Perlの「しっかり覚えてもなお読みにくいという難しさ」は遠ざけることができているところかな。
「覚えなきゃ手が出せない替わりに、覚えれば物凄い速度で書き下ろせるし、混乱無く読めもする」
という所に着地するために、ArcはLispであることと、LispっぽくないことをPaul流に融合させてると思う。
>>430は「Lispである部分」を4行目、「Lispっぽくない部分」を1行目でネガティブに捉えているのだと思う。
でも、俺にはどちらも一つのヴィジョンのもとに選択され、良くまとまっているように思える・・・・・・のは多分、
俺がPaulの文章を読んでLispの世界に足を踏み入れた人間で、頭がまだちゃんと独り立ちしてないからかもしれないw
0433デフォルトの名無しさん
2008/02/03(日) 03:27:48srv.arcに
(with ((i o ip) (socket-accept s)) 〜)
みたいな使われ方があって、withの機能かと思ったら、
with自体はarc.arcに
(mac with (parms . body)
`((fn ,(map1 car (pair parms))
,@body)
,@(map1 cadr (pair parms))))
とだけ書いてあった。つまり最初のを展開するとfnにたらい回しされる。
((fn ((i o ip)) 〜) (socket-accept s))
socket-acceptは多値相当をリストで返すんかな?
こういうのは便利のような気もするけど、つい効率の方を気にしてしまう。
名前付き引数ってわけじゃないのか。
0434デフォルトの名無しさん
2008/02/03(日) 04:18:26;;数学関数追加
(xdef 'sin sin)
(xdef 'cos cos)
(xdef 'tan tan)
(xdef 'asin asin)
(xdef 'acos acos)
(xdef 'atan atan)
arc> (cos 1)
0.5403023058681398
arc> (= pi (acos -1))
3.141592653589793
arc> pi
3.141592653589793
arc>
0435デフォルトの名無しさん
2008/02/03(日) 05:16:13arc> (+ "abc" "def")
"abcdef"
そういうのアリ!
arc> ("abc" 2)
#\c
あ、いいかも。
lambdaが無いのは寂しいけど
arc> ((fn (x) (* x x x)) 3)
27
arc>
さっぱりして気持ちいいな。
よし、Arc 気に入った。
0436デフォルトの名無しさん
2008/02/03(日) 06:17:56引き算すると??
0437デフォルトの名無しさん
2008/02/03(日) 06:19:04=>"aaaaa"
(- "abcde" "bcd")
=>"ae"
な、わけねーだろ
0438デフォルトの名無しさん
2008/02/03(日) 14:31:39整数が期待されている所では
(+ "abc" "defgh" "ij") -> 10
文字列が期待されている所では
(+ "abc" "defgh" "ij") -> "abcdefghij"
リストが期待されている所では
(+ "abc" "defgh" "ij") -> ("abc" "defgh" "ij")
になるとか?
0439デフォルトの名無しさん
2008/02/03(日) 14:35:20俺Lispはかなり初期からそれやってるw
0440デフォルトの名無しさん
2008/02/03(日) 16:42:47arc> (+ '(a b) '(c d))
(a b c d)
arc> (+ '(a b) '(c d))
(a b c d)
arc> (+ "ab" "cd")
"abcd"
arc> (rem 'b '(a b c d))
(a c d)
arc> (rem #\b "abcd")
"acd"
arc>
remはremoveかね。
0441デフォルトの名無しさん
2008/02/03(日) 16:45:05(def test (n)
(if (> n 90) 'AA
(> n 80) 'A
(> n 70) 'B
(> n 60) 'C
'D))
シンプルなcond節でifだけで用が足りるからいいかも
0442デフォルトの名無しさん
2008/02/03(日) 16:54:15if とか with とか、2個単位でインデントしたくなる。
(if
c1
e1
c2
e2)
0443デフォルトの名無しさん
2008/02/03(日) 17:37:410444デフォルトの名無しさん
2008/02/03(日) 17:40:58状態でLittle SchemerとかでSchemeを勉強しても
理解できますか?
0445デフォルトの名無しさん
2008/02/03(日) 17:43:17とりあえず「知らなきゃどこにも進めない」ってものではないよ。
0446デフォルトの名無しさん
2008/02/03(日) 17:51:47全く問題ないよ。
Schemerになりなさい。
0447デフォルトの名無しさん
2008/02/03(日) 17:57:42読めるよ。全10章中、Yコンビネータが出てくるのは第9章だけ。
これを理解するのに "To Mock A Mockingbird" が巻末で推奨されている。
"Litle Schemer" は習うより慣れろの精神で書かれているので読みやすい。
0448デフォルトの名無しさん
2008/02/03(日) 18:02:350449デフォルトの名無しさん
2008/02/03(日) 18:03:57arc> (= var (table))
#hash()
arc> var
#hash()
arc> (= (var 'x) 'x1)
x1
arc> (= (var 'y) 'y1)
y1
arc> var
#hash((y . y1) (x . x1))
arc> (var 'x)
x1
arc>
0450デフォルトの名無しさん
2008/02/03(日) 18:11:41arc> (cdr '())
nil
arc> (car '())
nil
arc> (is '() nil)
t
arc>
0451デフォルトの名無しさん
2008/02/03(日) 18:14:59arc> (type "a")
string
arc> (type 1)
int
arc> (type 0.1)
num
arc> (type 'a)
sym
arc> (type '(a))
cons
arc> (type 1+1i)
num
arc>
0452デフォルトの名無しさん
2008/02/03(日) 18:19:04>>446
>>447
>>448
アドバイスありがとうございます。
C++ばかりやっていて数学的基礎もあまりなく
どうかと思ってたのですが、まずはSchemerシリーズ
3冊を一読してから考えます。
0453デフォルトの名無しさん
2008/02/04(月) 00:54:100454デフォルトの名無しさん
2008/02/04(月) 04:14:49http://www.crockford.com/javascript/little.html
0455デフォルトの名無しさん
2008/02/04(月) 12:54:21arc> (subst 'a '(b) '(a b c))
"aac"
arc> (subst "a" "b" "abc")
"aac"
arc>
0456デフォルトの名無しさん
2008/02/04(月) 13:26:47http://pc11.2ch.net/test/read.cgi/tech/1202098949/
ついカッとして立ててみた。悪気はなかった。たとえスレが寂れても
後悔するつもりはない。
0457デフォルトの名無しさん
2008/02/05(火) 15:07:500458デフォルトの名無しさん
2008/02/05(火) 15:15:240459デフォルトの名無しさん
2008/02/05(火) 16:24:01斜め上を行ってくれ。w
0460デフォルトの名無しさん
2008/02/05(火) 18:29:140461デフォルトの名無しさん
2008/02/05(火) 18:55:28Arc自体、ちゃんとしたモノになるまでまだ何年かは時間が掛かるだろう。
0462デフォルトの名無しさん
2008/02/05(火) 19:06:573-Schemeとか、3-Arcでもいいです。
; Smithの元の実装はMacLISPでした。
0463デフォルトの名無しさん
2008/02/05(火) 19:12:07http://www.htdp.org/2003-09-26/Book/
これどんなもんなんかな?
0464デフォルトの名無しさん
2008/02/05(火) 21:45:46お前が読めばいいだろ。
0465デフォルトの名無しさん
2008/02/06(水) 09:32:49そんないじわるな事言わないで><
0466デフォルトの名無しさん
2008/02/06(水) 10:17:02読むぐらい自分でしろよ
0467デフォルトの名無しさん
2008/02/06(水) 10:20:38消え失せろ。
0468デフォルトの名無しさん
2008/02/06(水) 12:18:18偉そうな事言わないで><
ネットで吠える事しかできない低能くん。
0469デフォルトの名無しさん
2008/02/06(水) 12:30:130470デフォルトの名無しさん
2008/02/06(水) 15:22:530471デフォルトの名無しさん
2008/02/06(水) 15:34:42>>468
偉そうな事言わないで><
ネットで吠える事しかできない低能くん。
0472デフォルトの名無しさん
2008/02/06(水) 19:30:38以前ざっと読んだよ。
いきあたりばったりでしかプログラム書いたことのない無能向け教科書。
0473デフォルトの名無しさん
2008/02/06(水) 20:25:59つまりごく当たり前の事しか書いてないと言いたいわけか。
0474デフォルトの名無しさん
2008/02/06(水) 21:07:29思考の段取りもつけられないようなバカも
少なからず存在しているのが世の中なわけで。
プログラミング上の概念については何がとりあげられているかは
目次見ればわかる。あとはデザイン・レシピの部分を拾って
ざっと流せば自分にとって読む必要のあるなしは判断できるだろう。
0475デフォルトの名無しさん
2008/02/06(水) 22:03:52> 思考の段取りもつけられないようなバカも
> 少なからず存在しているのが世の中なわけで。
ちゃいます!!!
"少なからず"ではなく, 彼らの方が多数なんです, 現場に行けば...
0476デフォルトの名無しさん
2008/02/06(水) 22:31:140477デフォルトの名無しさん
2008/02/06(水) 23:02:290478デフォルトの名無しさん
2008/02/07(木) 00:23:25絡む気は毛頭ないですが、
ざっと読むだけで必要、不必要が分かるってのは
言い過ぎな気がします
ざっと見た人が不必要だと思ったものでも、じっくり
読めばありな部分とかはないもんですかね?
基本的に安いものじゃないんで本はじっくり見る派です。
0479デフォルトの名無しさん
2008/02/07(木) 02:41:50http://d.hatena.ne.jp/sumii/20060413/1144920144
SICP目次
http://d.hatena.ne.jp/win_fmv/20000101
HtDP目次
http://d.hatena.ne.jp/win_fmv/20000102
HtDPはSICPより易しいです。
でも「計算機プログラムの構造と解釈」を読み通す根性がないなら
英語アレルギーを乗り越えてHtDPを読むのはなおさら無理です。
素直に「計算機プログラムの構造と解釈」を買って熟読しましょう。
0480デフォルトの名無しさん
2008/02/07(木) 05:48:04よほどの超絶英語コンプレックスだったんだな、それ書いたやつ。
0481デフォルトの名無しさん
2008/02/07(木) 07:51:12ママに読んでもらえバカ。
0482デフォルトの名無しさん
2008/02/07(木) 08:00:490483デフォルトの名無しさん
2008/02/07(木) 12:51:510484デフォルトの名無しさん
2008/02/07(木) 20:44:33> guileはutf-8で日本語は使えないのでしょうか?
guile> (let ((s "日本語表示テストです."))
(string? s))
#t
guile>
0485デフォルトの名無しさん
2008/02/07(木) 20:51:570486デフォルトの名無しさん
2008/02/07(木) 21:12:090487デフォルトの名無しさん
2008/02/07(木) 22:59:39日本語が使えますか?
gosh> (日本語が使えますか?)
#t
0488デフォルトの名無しさん
2008/02/07(木) 23:27:380489デフォルトの名無しさん
2008/02/08(金) 00:20:270490デフォルトの名無しさん
2008/02/08(金) 01:27:270491デフォルトの名無しさん
2008/02/08(金) 01:34:32先輩が言ったんですけど、ほんまですか?
0492デフォルトの名無しさん
2008/02/08(金) 01:36:140493デフォルトの名無しさん
2008/02/08(金) 01:38:250494デフォルトの名無しさん
2008/02/08(金) 01:47:57せつないきもちをまぎらわすんだよ
0495デフォルトの名無しさん
2008/02/08(金) 06:09:520496デフォルトの名無しさん
2008/02/08(金) 08:51:300497デフォルトの名無しさん
2008/02/08(金) 10:33:35guile> (define hoge "ほげほげ")
guile> hoge
"?\x81??\x81\x92?\x81??\x81\x92"
guile> (string-length hoge)
12
となってしまうけど、4にはならないの?
0498デフォルトの名無しさん
2008/02/08(金) 15:26:02guileではcharacterは8bitだったはず
(integer->char 256)はエラー
バイナリデータと文字が混在するファイルを扱う場合は
こっちのほうが割り切って使えるからいい
0499デフォルトの名無しさん
2008/02/08(金) 16:31:45プログラムでも書いてもらおうかな。
【問題】上のGuileのような文字列のバイト列を
UTF-8とみなし、その文字数を返す関数を書け。
0500デフォルトの名無しさん
2008/02/08(金) 16:44:490501デフォルトの名無しさん
2008/02/08(金) 17:15:55__(begin (define (follow-char? c)
____________(char<=? #\200 c #\277)))
__(and (string? str)
_______(let ((strlen (string-length str)))
_________(let loop ((acc 0)
____________________(i 0))
___________(cond ((= i strlen) acc)
_________________((char<=? #\0
___________________________(string-ref str i)
___________________________#\177)
__________________(loop (+ acc 1) (+ i 1)))
_________________((and (< (+ i 1) strlen)
_______________________(char<=? #\300
________________________________(string-ref str i)
________________________________#\337)
_______________________(follow-char? (string-ref str (+ i 1))))
0502デフォルトの名無しさん
2008/02/08(金) 17:19:210503デフォルトの名無しさん
2008/02/08(金) 17:52:54(define (utf8-string-length s)
(define (first-byte->length b)
(define byte (char->integer b))
(cond ((<= #x00 byte #xbf) 1)
((<= #xc0 byte #xdf) 2)
((<= #xe0 byte #xef) 3)
((<= #xf0 byte #xf7) 4)
((<= #xf8 byte #xfb) 5)
((<= #xfc byte #xfd) 6)))
(define strlen (string-length s))
(define (strlen-iter index len)
(if (<= strlen index) len
(strlen-iter (+ index (first-byte->length (string-ref s index)))
(+ len 1))))
(strlen-iter 0 0))
0504デフォルトの名無しさん
2008/02/08(金) 17:53:58_((and (< (+ i 2) strlen)
_______(char<=? #\340
________(string-ref str i)
________________#\357)
_______(follow-char? (string-ref str (+ i 1)))
_______(follow-char? (string-ref str (+ i 2))))
__(loop (+ acc 1) (+ i 3)))
_((and (< (+ i 3) strlen)
_______(char<=? #\360
________________(string-ref str i)
________________#\367)
_______(follow-char? (string-ref str (+ i 1)))
_______(follow-char? (string-ref str (+ i 2)))
_______(follow-char? (string-ref str (+ i 3))))
__(loop (+ acc 1) (+ i 4)))
_(else #f))))))
これならどうだ
0505デフォルトの名無しさん
2008/02/09(土) 21:41:09SBCL1.0.13よりLarcenyのほうが圧倒的に速いんだけど
こんなものなの?
0506デフォルトの名無しさん
2008/02/09(土) 21:52:430507デフォルトの名無しさん
2008/02/09(土) 22:12:213-Schemeと言っていい、Brownと後継Bloodはみつからず、
その代わり米澤研のRScheme, Blackが見つかりました。
RSchemeは論文に全コードが、Blackは米澤研のWebサーバ:/pub/black
0508デフォルトの名無しさん
2008/02/09(土) 23:38:58hspみたいなライブラリがついてる実装って無い?
0509デフォルトの名無しさん
2008/02/10(日) 01:03:55測定したプログラムや測定方法を書いてくれたら追試してくれる人が居るかもよ
0510デフォルトの名無しさん
2008/02/10(日) 01:06:52>>508はPLT Schemeとかどうよ。
0511デフォルトの名無しさん
2008/02/10(日) 03:04:12http://www.scsh.net/
それだけ。
0512デフォルトの名無しさん
2008/02/10(日) 08:43:08つ http://community.schemewiki.org/?scheme-faq-standards#H-3sv08v
つ http://community.schemewiki.org/?scheme-faq-standards#specialimpl
0513デフォルトの名無しさん
2008/02/10(日) 11:47:46見てみます
ありがとうございました
0514デフォルトの名無しさん
2008/02/10(日) 22:14:31Larceny めちゃくちゃ速いんで驚いたよ。
主要開発メンバーってLight Ship MacScheme 作ってた人でしょ。
この処理系、かなり期待。
0515デフォルトの名無しさん
2008/02/10(日) 22:31:000516デフォルトの名無しさん
2008/02/10(日) 22:47:46Words allocated: 0
Words reclaimed: 0
Elapsed time...: 156 ms (User: 156 ms; System: 0 ms)
Elapsed GC time: 0 ms (CPU: 0 in 0 collections.)
12
compile-file にしてもしなくても同じ結果。読み込んだ時点で
コンパイル済みなんじゃないかな。
記憶違いかもしれないけどアセンブラがどうとかってHPにあったような。
かなり最適化をしているのかも。
0517デフォルトの名無しさん
2008/02/10(日) 23:00:19Lisp1.5の時代はLAPを使ってたけど、今はVMなんかね?
Arcのコード読みでああいう簡単なのはおおよそわかったけど、
本格的なのってどういう仕組みをとってるんだろう。
0518デフォルトの名無しさん
2008/02/10(日) 23:05:01独自じゃなくて、JVMをターゲットにするのもある。
0519デフォルトの名無しさん
2008/02/10(日) 23:58:11あれ、良いと思うんだけどな。
0520デフォルトの名無しさん
2008/02/11(月) 00:03:190521デフォルトの名無しさん
2008/02/11(月) 00:04:180522デフォルトの名無しさん
2008/02/11(月) 00:04:510523デフォルトの名無しさん
2008/02/11(月) 00:30:25・・・俺が馬鹿なのは知ってるから。
SBCLのコンパイルから実行までの手順をご教授願いたい。
正直言って
初めてLISPをインストールして
「どんなのかなあ?使ってみようかなあ」と思っても
CやJAVAのように簡単に入口の手順が調べられないんですよ。
「そんな厨はLISP使うな!」は無しでお願いします。
0524デフォルトの名無しさん
2008/02/11(月) 00:44:410525デフォルトの名無しさん
2008/02/11(月) 00:47:36で、プラットフォームは何?
Mac,Linux,Windows?
初めてでWindows上ならxyzzy上のLispなんかの方が手近だと思うが。
Meadowだ、slimeだ、Emacsだとかは面倒くさいでしょ?
0526デフォルトの名無しさん
2008/02/11(月) 01:01:220527デフォルトの名無しさん
2008/02/11(月) 01:08:392. インストールする
3. New File でファイルを編集
4. コンパイルボタンを押す
5. REPL から呼び出す
0528デフォルトの名無しさん
2008/02/11(月) 01:09:31それによっても答えが変わると思う
0529デフォルトの名無しさん
2008/02/11(月) 01:13:14LinuxとFreeBSDとMacOSX以外のUnixLikeOSで動かせて
Gauche並の軽さ&速さとは言わないけど
Pythonくらいの軽さ&速さはあるCL処理系ってありますか?
SchemeでもGaucheより速い処理系も軽い処理系もあるけど
速さと軽さのバランスが一番いいのはやはりGauche
コンパイルすればCLのがチョッ速だと思うけど重い処理系が多いように思えます
0530デフォルトの名無しさん
2008/02/11(月) 01:16:48と書いてあるから、SBCL 自体のコンパイルをしたい訳ではないと予想。
cc や javac を使う様な感じで、コンパイル済みファイル(fasl?)を作成して
それをロード→実行する方法を聞いているんじゃないかしら。
すまんが俺は最近 SBCL を触っていないので、やり方が分からん。
0531デフォルトの名無しさん
2008/02/11(月) 01:18:32CLISP
0532デフォルトの名無しさん
2008/02/11(月) 01:22:00CLISPの最近のverはi386-OpenBSDでも動かないのです
(ビルドは出来るけどsaveinitmem:executable Tとか動かない)
それにちょっと遅すぎます
ECLのほうが速いくらいです
0533デフォルトの名無しさん
2008/02/11(月) 01:23:15すみません説明不足で
要するに先に出てた、SBCL VS Larceny を
Tak関数を使ってやりたいのです。
OS:Windows Vista
LISP:SBCL1.0.13
でTak関数がtak.clというファイル名であるとして
(compile-file "tak.cl")
とすれば、tak.fasl ファイルができるのですが・・・
ここから先が・・・orz
でもコンパイルしたとしても
実行時にSBCL起動して
(time (tak 12 6 0))
なんてすると意味の無いような気がするし、
"(time)"の部分も当初の tak.cl に入れて
コンパイルすればいいのでしょうが、
そこまで頭が回らないので助けていただこうかと。
0534デフォルトの名無しさん
2008/02/11(月) 01:23:53今度は CLISP より ○○ のほうが優れているように思えます!! とか言いそうだな…。
無理せず Gauche 使えばいいじゃん。
0535デフォルトの名無しさん
2008/02/11(月) 01:25:40そういう事は先に書かないと駄目だよ
ECL はネイティブコンパイルするから CLISP よりも速くて当然なんじゃないの?
0536デフォルトの名無しさん
2008/02/11(月) 01:27:38重すぎるのが難点
KCLファミリーでありながらCLtl2な所とか
長所もいろいろあるのですが
(*package*がCOMMON-LISP-USERだからCLtl2とみなしてもいいんですよね?)
0537デフォルトの名無しさん
2008/02/11(月) 01:29:18まぁ、10年以上後発なんだし結果は見えているような。
0538デフォルトの名無しさん
2008/02/11(月) 01:31:250539529=532=536
2008/02/11(月) 01:43:40CLにも敬意を表してちゃんと使えるようになりたいと考えております
多分に主観的ですが
エレガントさはSchemeに分が
それ以外の大部分はCLに分があると思っています
LuaみたいにAnsiCさえあれば動くぜ!みたいな処理系がCLにもSchemeにもほしいものです
0540デフォルトの名無しさん
2008/02/11(月) 02:09:14GC等のことを考えると速度的なペナルティ無しに完全にANSI-Cの範囲で記述するのは難しい
んじゃないかな。遅い処理系なら作れると思うけど、速くするには何かズルしないと。w
0541デフォルトの名無しさん
2008/02/11(月) 02:09:25(if (zero? choco)
(display "お前は既に死んでいる")
(display "カエルchokochoko3chokochoko/n合わせてchokochoko6chokochoko")))
0542デフォルトの名無しさん
2008/02/11(月) 02:11:41(load "tak.fasl")
0543デフォルトの名無しさん
2008/02/11(月) 02:37:040544デフォルトの名無しさん
2008/02/11(月) 04:26:33takを選んでしかも最適化宣言無し…意図が無いとしたら天才かもしれん。
haskell使えば?
0545デフォルトの名無しさん
2008/02/11(月) 04:46:57俺も Schemer が余興でやるなら CL より Haskell が良いと思う
0546デフォルトの名無しさん
2008/02/11(月) 17:38:54これを参考にしてSchemeでScheme処理系を書いている。
↑これはわかりやすくて短くていいわ。
それと「Schemeによる記号処理入門」森北出版
0547デフォルトの名無しさん
2008/02/11(月) 18:03:40結局LISPユーザー向けじゃなくてACLユーザー向けのサイトじゃん。
読んでいて ム カ つ く んですよね。
0548デフォルトの名無しさん
2008/02/11(月) 18:06:070549デフォルトの名無しさん
2008/02/11(月) 18:06:350551デフォルトの名無しさん
2008/02/11(月) 19:47:46ごめんかんちがいかも。
でもなんか気色悪いわ。
0552デフォルトの名無しさん
2008/02/11(月) 19:49:080553デフォルトの名無しさん
2008/02/11(月) 19:52:38俺には一部のACL向けの記事があるだけのように思うが。
ちゅうか中の人はCLISPの開発者なんだし、誤解のような気もするけど。
0555デフォルトの名無しさん
2008/02/11(月) 21:08:430556デフォルトの名無しさん
2008/02/11(月) 21:46:32Shiroさんとこのwilikiにある↓をいつも参考にしてるよ。
ttp://practical-scheme.net/wiliki/wiliki.cgi?MzScheme
0557デフォルトの名無しさん
2008/02/11(月) 21:48:000558デフォルトの名無しさん
2008/02/11(月) 23:00:040560デフォルトの名無しさん
2008/02/11(月) 23:27:19Drは使ったことがないのでよくわからないけど
MrEDと連携してグラフィクスなんかできたんじゃ
なかったっけ。
0561デフォルトの名無しさん
2008/02/12(火) 19:14:400562デフォルトの名無しさん
2008/02/12(火) 19:45:30S式はDSLのプロトタイプに最適だもん。
Lisp1.5の時代から、俺eval、俺apply作れたんだから。
0563デフォルトの名無しさん
2008/02/12(火) 19:47:36pugsの例を見るまでもなくHaskellも結構いける。
宣言型のコード書きやすいから。
Prologはどっか行っちゃった。
0564デフォルトの名無しさん
2008/02/14(木) 08:57:01本当にありがとうございました。
0565デフォルトの名無しさん
2008/02/14(木) 12:31:550566デフォルトの名無しさん
2008/02/15(金) 00:50:36本も売り切れるといいね。
0567デフォルトの名無しさん
2008/02/15(金) 01:05:33以前に出ていた日本語のScheme本から(一部抜粋)
(define-syntax Cond (syntax-rules (else =>)
;; #0
((Cond (else result1 result2 ...)) (begin result1 result2 ...))
;; #1
((Cond (test => result)) (let ((temp test)) (if temp (result temp))))
;; #2
((Cond (test => result) clause1 clause2 ...)
(let ((temp test)) (if temp (result temp) (Cond clause1 clause2 ...))))
;; #3
((Cond (test)) test)
;; #4
((Cond (test) clause1 clause2 ...) (or test (Cond clause1 clause2 ...)))
;; #5
((Cond (test result1 result2 ...)) (if test (begin result1 result2 ...)))
;; #6
((Cond (test result1 result2 ...) clause1 clause2 ...)
(if test (begin result1 result2 ...) (Cond clause1 clause2 ...)))))
(let ((=> #f)) (Cond (#t => 'ok)))
scmだと本の解説通り ok と表示されるのですが, scm ではないある処理系に
読み込ませたところ,'ok がprocedureではない,というエラーになりました.
どうやら「=>」に#fが束縛されておらず keywordである「=>」として扱われたようです.
正しくは,すべてのsymbolの束縛関係が解決されてから syntaxに渡され
(て,最終的にokとな)ると考えて良いのでしょうか.
0568567
2008/02/15(金) 01:32:22syntax定義の時点でしょうか,それとも
syntax呼び出しの時点でしょうか.
0569567
2008/02/15(金) 01:57:21syntax定義時と呼び出し時とで異なる値に束縛されたsymbolは
どちらの値に置き換えられて評価されるのでしょうか.
単純なscopeの優先度からすると,syntax呼び出し時の値が使われそうですが,
closureやsyntaxが制作者の意図通り動くことを保証するためには
syntax定義時の値が使われるべきなのではないかと思うのです.
closureだとclosure定義時の環境が参照されると理解しています.
0570デフォルトの名無しさん
2008/02/15(金) 02:48:340571デフォルトの名無しさん
2008/02/15(金) 08:29:510572567
2008/02/15(金) 08:52:11本の説明とscmの実装が正しいとして,束縛関係の優先順位が
1.syntax定義時
2.syntax呼び出し時
であれば納得できそうです.
0573デフォルトの名無しさん
2008/02/15(金) 12:51:51マクロに於けるリテラル識別子(この場合はelseと=>)がマッチするのは
マクロ定義とマクロ使用でともに同じ束縛を持つか
ともに束縛を持たない場合のみだから
その「scm ではないある処理系」の挙動は正しくない。
マクロのパターンマッチに束縛情報が使われることから
束縛関係を解決してから展開されるという解釈は正しいと思う。
ただしSchemeの場合は値ではなく場所に束縛される。
だから
(define foo 100)
(let ((foo foo)) foo)
ではトップレベルのfooとlet式中のfooは同じ値で違う束縛である。
(さらに細かく言えば束縛されるのはSymbolではなくidentifierである。)
このCondの例は定義時に=>が束縛を持たなかったのに(あるいは定義時の字句的束縛を持っていたのに)
使用時に=>がローカルな束縛を持っていたから#1にマッチしなかっただけである。
同じ束縛を持っていた場合は変数参照式として値が使われることはなく、リテラル識別子として#1にマッチする。
また、マクロ使用において束縛関係の優先順位が
1. 定義時
2. 使用時
というのは逆。
マクロ使用式の識別子の束縛は使用される式の位置に於ける字句的束縛である。
だからマクロ名である構文キーワード(この場合はCond)はローカル変数束縛に隠蔽されうる。
ただし展開され、挿入された式は定義に於ける字句的束縛を持つ。
犬飼大氏はscmやSLIBはR5RSに準拠してると仰ってるけれども
scmや派生処理系のGNU guileはマクロ周りを含め準拠していない部分も結構あるから
R5RSの学習には不向きだと思われる。
0574567
2008/02/15(金) 13:04:47要を得ない質問の意図をくみ取ってくださり
的確なご解説をいただきましてありがとうございます.
>>573を読み返して考えてみます.
0575デフォルトの名無しさん
2008/02/15(金) 14:10:32(define x 100)
(define y 1000)
(define-syntax foo (syntax-rules () ((foo y) (+ x y))))
;パターン(foo y)に現れていなくてテンプレート(+ x y)に現れている識別子は+とx
;さらに自由識別子だから
;+とxは挿入された場所の字句的束縛ではなく
;マクロ定義された場所の字句的束縛を持つ
;yはマクロに於ける仮引数だからマクロ使用の式の値になる
(let ((x 10))
(foo y))
-> 1100
(let ((x 10))
(foo x))
-> 110
(let ((y 1))
(foo x))
-> 200
(let ((y 1))
(foo y))
-> 101
(let ((+ -))
(foo 10000))
-> 10100
0576デフォルトの名無しさん
2008/02/15(金) 14:10:53束縛識別子とは(let ((x 10)) ...)とか(define x 100)に於けるxのことで
変数捕獲を防ぐ為にリネームされるハズなんだけど
リネームしてくれないscm系
必要最小限にリネームするGauche系
必ずリネームするScheme48系があって
それぞれ挙動が違う。
0577567
2008/02/15(金) 14:16:58ありがとうございます.ようやく理解できました.
マクロ使用における束縛関係の優先順位も,使用時の束縛関係が
定義時の束縛関係に優先するとしたほうが自然であると納得できました.
私の混乱の原因のひとつに,マクロのtemplate上のsymbol「=>」と,
マクロを適用するユーザコード上のsymbol「=>」とを混同していたことが
ありました.これらを明確に区別すべきでした.
なお,>>567に書きました非scmの処理系はbigloo(ver.3.0c)です.
また,guileはdefine-syntaxやsyntax-rules自体を実装していないようです.
0578デフォルトの名無しさん
2008/02/15(金) 14:18:31syntax-caseとsyntax-rulesが使えるようになります
0579デフォルトの名無しさん
2008/02/15(金) 14:22:37defineは使わない方が吉、の間違い。
scm系はリネームせずにdefineします。
Gaucheは(多分)set!として働く場合はリネームしませんがそれ以外はリネームします。
Scheme48系は常にリネームします。
なのでマクロテンプレート以外から参照できません。
0580デフォルトの名無しさん
2008/02/15(金) 14:28:19Gaucheはトップレベルdefineはリネームせず、内部defineのみリネームするようです。
0581デフォルトの名無しさん
2008/02/15(金) 14:36:220583デフォルトの名無しさん
2008/02/15(金) 14:38:29マクロテンプレート(例えば(let ((temp test)) (if temp (result temp))))中の(この例では現れていませんが)=>は
マクロ定義された場所で可視だった束縛を参照します。
マクロパターン(例えば(Cond (test => result)))中の=>は
マクロ使用式(Cond (#t => 'ok))中の識別子=>とのマッチングに使われます。
マクロ使用式の=>とマクロ定義の=>がともに未束縛であるか
或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする訳です。
0584デフォルトの名無しさん
2008/02/15(金) 14:59:43最初の識別子はマッチングに利用されません。
なので(_ X Y)等と書くこともあります。
XとYはいわばメタ仮引数。マクロ使用式の同じ位置の式にマッチします。
そしてテンプレート中ではマクロ使用式の同じ位置の式が挿入されます。
(syntax-rules (hoge funi) ...)に於いてhogeとfuniはリテラル識別子となります。
パターンに現れる場合はマッチングにのみ利用されます。
マッチングは同じ識別子で且つ同じ束縛である場合にのみ成功します。
テンプレート中に現れる識別子のうち、パターンの中にリテラル識別子以外で現れた識別子以外は
マクロ定義された場所で可視だった束縛を参照します。
ただし束縛コンストラクタで作られる場所に束縛される場合は実質的に改名されます。
なのでテンプレート中に=>が出現してたらそれはマクロ定義された場所の束縛を参照します。
(define bar 100)
(define-syntax foo (syntax-rules (bar)
((foo bar) bar))
(foo bar)
-> 100
(let ((bar 10000))
(foo bar))
=> ERROR! ;パターンマッチングに失敗
0585デフォルトの名無しさん
2008/02/15(金) 15:00:33パターン(foo X Y)の間違い
0586デフォルトの名無しさん
2008/02/15(金) 15:36:36本当に束縛してしまうと絶対にマッチしないパターンになるのか
紛らわしいな
0587デフォルトの名無しさん
2008/02/15(金) 15:54:38リテラル識別子はパターン部分で特別扱いするだけ
でもリテラルといいながら変数と看做したときの束縛までマッチングに利用するのは少し変な気がする。
パターン変数:任意の式にマッチする。テンプレート中ではマッチした式として挿入される。
リテラル識別子:同じ束縛を持つ同じ識別子とだけマッチする。テンプレート中ではパターン変数以外の識別子と同じ扱い。
パターン変数以外の識別子:テンプレート中の変数参照はマクロ定義された位置での束縛の参照が挿入される。
テンプレート中の束縛コンストラクタで新たに束縛される場合はその参照と共に改名される。
これの方がいいかな
0588デフォルトの名無しさん
2008/02/15(金) 16:01:42>A literal identifier matches an input subform if and only if
>the input subform is an identifier and
>either both its occurrence in the input expression and
>its occurrence in the list of literals have the same lexical binding, or
>the two identifiers have the same name and both have no lexical binding.
0589デフォルトの名無しさん
2008/02/15(金) 16:55:31構文の型の名前は全て構文に束縛されていて構文キーワードである
変数とは構文キーワードでない任意の識別子である(elseと=>も構文キーワードだから変数でない)
またR5RSの4・5章によれば
defineは
(define <変数> <式>)
(define (<変数> <仮引数部>) <本体>)
(define (<変数> . <仮引数>) <本体>)
のいずれか
set!は
(set! <変数> <式>)
lambdaは
(lambda <仮引数部> <本体>) 但し<仮引数部>は(<変数1> ...)、<変数>、(<変数1> ... <変数n> . <変数n+1>)のいずれか
てことは構文キーワードをを隠蔽するローカル変数あるいはトップレベル変数をdefine、set!、lambda、let、let*、letrec、doで作る事はR5RS外だったんだ
構文キーワードの変数参照がR5RS外って事は知ってたけどこの事は知らなかった
だけど4.3にはローカル変数束縛がキーワード束縛を隠蔽しても良いって書いてあるけど
どうすれば構文キーワードを隠蔽できるローカル変数束縛ができるの?
他方、構文束縛は変数でなく識別子に対して行われるからローカル構文束縛で隠蔽されることはあり得る。
7.2.1の抽象構文に於いては変数と識別子が同一されているから<変数>の解釈が2パターンあるってオチなんだろうけど
0590デフォルトの名無しさん
2008/02/15(金) 16:56:06同一されている->同一視されている
0591デフォルトの名無しさん
2008/02/15(金) 18:14:38気付かなかった
0592デフォルトの名無しさん
2008/02/15(金) 18:15:03再帰のメタプログラムがわかるようになってきた。
両方勉強しようと思う。
0593デフォルトの名無しさん
2008/02/16(土) 01:49:25DrSchemeのGUI環境で、選択できる言語の一つに、遅延評価のLazy Schemeとい
うのがあるのですが、これで tarai を回して, time関数で時間を計ろうとすると、
tarai関数は実行されず、promiseオブジェクトが返ってきてしまいます。
> (time (tarai 200 100 0))
cpu time: 0 real time: 0 gc time: 0
#<promise:?>
どこかにforceを書けばいいのかと思ったのですが、いろいろやってもうまく行
きません。
> (time (force (tarai 200 100 0)))
cpu time: 0 real time: 0 gc time: 0
#<promise:?>
どなたか見当のつく方、アドバイスをいただけないでしょうか?
0594デフォルトの名無しさん
2008/02/16(土) 02:12:540595デフォルトの名無しさん
2008/02/16(土) 08:50:340596デフォルトの名無しさん
2008/02/16(土) 12:06:33見当はずれだったみたい
ごめんなさい
とりあえず
(force (delay (time (tarai 200 100 0))))
したら計算できた
syntaxにおけるimplicit forcingがうまく働いてないのかも
forceはprocedureだから引数がimplicit forceされてforceしようとした値がpromiseじゃなくなってるとか
implicit delayとdelayが違う物みたいだし
doc読んでないので見当違いかもしれないけど
0597デフォルトの名無しさん
2008/02/16(土) 12:08:300598デフォルトの名無しさん
2008/02/16(土) 12:11:48> (force (delay (time (tarai 200 100 0))))
delayいらないんじゃね?
0599デフォルトの名無しさん
2008/02/16(土) 12:12:56マクロを含めsyntaxに渡されたときは#<promise:?>が返る
0600デフォルトの名無しさん
2008/02/16(土) 12:14:05(force (time (tarai 200 100 0)))だとforceに200が渡されてエラー
forceは関数だからだと思われる
明示的にdelayしてないとimplicit forceされる
0601デフォルトの名無しさん
2008/02/16(土) 12:23:37explicit delayされた物はexplicit forceしなくてはいけない
implicit delayされた物をexplicit forceすることはできない
explicit delayされた物はimplicit forceされない
implicit forceされるのは値を受け取る継続が関数の場合のみ
timeはsyntaxであるから#<struct:promise>でなく#<promise:?>が返される
ってことかな?
0602デフォルトの名無しさん
2008/02/16(土) 12:34:26他方、explicit promiseはexplicit forceされてもexplicit promiseのまま
(define x (call/cc (lambda (return) (delay (return 'value)))))
x
-> #<struct:promise>
(promise? x)
-> #t
(force x)
(promise? x)
-> #f
x
-> 'value
こんな感じなのかな
0603デフォルトの名無しさん
2008/02/16(土) 12:42:06cpu time: 0 real time: 0 gc time: 0
1
> (time (+ 1 1))
cpu time: 0 real time: 0 gc time: 0
#<struct:promise>
だなあ。
0604デフォルトの名無しさん
2008/02/16(土) 13:16:33ようこそ DrScheme, バージョン 372 [3m].
言語: Lazy Scheme.
> (time 1)
cpu time: 0 real time: 1 gc time: 0
1
> (time (+ 1 1))
cpu time: 0 real time: 0 gc time: 0
#<promise:?>
になりますね
とにかく構文に渡されたimplicit promiseはimplicit forceされないので
implicit forceされた物を構文に渡さないといけないみたい
0605デフォルトの名無しさん
2008/02/16(土) 13:24:37構文の値を受け取る継続がトップレベルまたは構文の場合は
implicit forceされない…のかも
0606デフォルトの名無しさん
2008/02/16(土) 14:14:59ちゃんと正規評価してると考えた方がいいのかも
ifやcond遅延評価処理系では関数的な構文
トップレベルでは評価されない
そういった意味では構文はquoteとdefineとset!とlambdaとその派生式のみになる
timeやifやcondやandやorは関数的な構文なので評価されない
これで辻褄が合うと思う
0607デフォルトの名無しさん
2008/02/16(土) 14:18:15ifやcond*などの*遅延評価処理系では関数的な構文
つまり(quoteなどの関数では記述できない構文)以外のことね
0608デフォルトの名無しさん
2008/02/16(土) 14:19:340609デフォルトの名無しさん
2008/02/16(土) 16:13:460610デフォルトの名無しさん
2008/02/16(土) 16:19:12言語: Lazy Scheme.
> (fact 10)
3628800
> (time (fact 10))
cpu time: 0 real time: 0 gc time: 0
#<struct:promise>
> (force (time (fact 10)))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
> (force (delay (time (fact 10))))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
> (+ 0 (time (fact 10)))
cpu time: 0 real time: 0 gc time: 0
3628800
だな。このバージョンのトップレベルはなんかおかしいな。
0611デフォルトの名無しさん
2008/02/16(土) 16:40:16・変数参照は評価される
・手続き呼出しは評価される
・マクロ使用は展開される
・defineは束縛した変数が参照されるまで評価されない
・quote、begin、lambda、quasiquote、delayは評価される
・構文定義構文は不明
・これら以外は評価されない
・評価される式から参照される式は評価される
という構文周り以外はオーソドックスな実装になってるみたい
末尾再帰がspace leakしないし
0612デフォルトの名無しさん
2008/02/16(土) 16:44:28トップレベル以外で評価される文脈に於いては構文も評価される
0613デフォルトの名無しさん
2008/02/16(土) 16:47:00束縛された式(正しくない表現だけど意図を察してください(^_^;))は
変数が参照されるまで評価されない、という表現に訂正
0614デフォルトの名無しさん
2008/02/16(土) 16:54:10挙動自体は同じみたいですね
とにかくifもcondもandもorも正格評価の為に構文とされちゃった物は
関数でラッピングしちゃえばいい
(define lazy-if
(lambda (pred then-clause else-clause)
(if pred then-clause else-clause)))
みたいに
0615デフォルトの名無しさん
2008/02/16(土) 16:57:50> (force (delay (time (fact 10))))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
ここが違いますね
v372だと時間が計測されて3628800が返ります
0616デフォルトの名無しさん
2008/02/16(土) 17:05:28でも式が変数参照だと?じゃないpromiseを返す
単にバグバグなだけかも…
0617デフォルトの名無しさん
2008/02/16(土) 17:12:190618567
2008/02/16(土) 18:03:55macro 展開の際に,あらかじめ symbol の束縛関係が参照されると理解しました.
この点についてもう少し具体的に質問させてください (>>589の記述に関係しているのかもしれません).
内部で set! を呼ぶだけの macro Set1 を書いてみました.
;; マクロ定義
(define-syntax Set1 (syntax-rules () ((_ macroSymA macroSymB) (set! macroSymA macroSymB))))
;; 前準備
(define variable 200)
(define newValue 900)
variable ;;==> 200
;; マクロ呼び出し
(Set1 variable newValue)
;; 結果
variable ;;==> 900
もしも処理系が macro 適用時に「手続き set! は第1引数として symbol を取る」という事実を知らないで
無条件に macro に渡された引数の束縛関係を解決 (symbol を束縛値に置換) してしまうのであれば,
(newValue を束縛値 900 に置換するのと同様に) variable も束縛値 200 に置換してしまってから
macro 展開が行われるので,評価対象が (set! 200 900) となってエラーになってしまうはずです.
実際にはそうならないのは,処理系が macro 適用時に
(set! macroSymA macroSymB) が特殊な手続き set! の呼び出しであることを認識して,
(第2引数の newValue のほうは通常どおり束縛値 900 で置換してよいのだが)
第1引数である variable については束縛値で置換することを敢えて行わず,
symbol 「variable」 のまま macro 展開しているからである,と理解してよいでしょうか.
0619デフォルトの名無しさん
2008/02/16(土) 18:36:03束縛関係の解決とは
C言語風に言えば「変数名がどのアドレスを指すかを確定する事」であり
実際にそのアドレスから値を読み込む事ではありません。
マクロ置換に於いては
syntax-rulesの第一引数のリストに列挙されている識別子のみ
アドレスも使ったマッチングが行われます。
syntax-rules ()のように識別子が無い場合はアドレスはマッチングに利用されません。
アドレスはマッチング、すなわちどの置換パターンを利用するかを決定するのにのみ利用されるだけです。
そして置換された後の式によって変数が参照されるかどうか決まります。
この場合は置換後の式が(set! variable newValue)なのでvariableは評価されません。
set!の第2引数は評価されるのでnewValueが変数参照されて900となります。
しかし置換後の式が例えば(+ variable newValue)ならば手続き呼出しですので
+が変数参照されて#<procedure +>に
variableが変数参照されて200に
newValueが変数参照されて900に評価されてから
手続きが呼び出されます。
0620デフォルトの名無しさん
2008/02/16(土) 18:44:05Aが構文に束縛されているかどうかを調べ
・構文に束縛されている場合
・primitive構文に束縛されているなら、その評価規則に従って評価します。
・マクロに束縛されているならパターンマッチを行い、テンプレートに従って置換した後、その式を評価します
・場所に束縛されているなら
・手続き呼出しを行います。AとBとCはすべて評価されますが、順番は決まっていません。
AやBやCが評価されるときに初めて変数参照として値が読み出されます
0621デフォルトの名無しさん
2008/02/16(土) 18:52:27primitive構文はdefine、if、quote、lambda、set!のみで
他の構文は全てマクロです。(R5RSの場合。処理系独自のprimitive構文もあり得る。)
0622デフォルトの名無しさん
2008/02/16(土) 18:56:49AとBとCが評価される順番は決まっていませんが
手続きが呼び出される前には評価されます。
つまりAとBとCが評価された後にAが束縛されていた場所の値を手続きとして呼び出します。
もしAの場所の値が手続きでなければエラーとなります。
0623デフォルトの名無しさん
2008/02/16(土) 19:07:03なので例えば
(define x '(1 2))
(define-syntax foo
(syntax-rules ()
((foo (x y)) (list y x))
((foo z) (list z))))
(foo x)
-> '((1 2))
となります。
つまり(foo (x y))にではなく(foo z)にマッチした訳です。
(foo x) --(置換)-> (list x) --(部分式の評価)-> (#<procedure list> (1 2))
-> '((1 2))
というわけです。
0624デフォルトの名無しさん
2008/02/16(土) 19:35:58正しくはアドレスではなく束縛によって行われますので
構文に束縛されているリテラル識別子は
同じマクロ変換子に束縛されている識別子にマッチします。
構文に束縛されている識別子は
場所には束縛されていませんので
アドレスという概念は当てはまりません。
ローカルな変数束縛によって構文束縛が隠蔽される事も
ローカルな構文束縛によって変数束縛が隠蔽される事もあります。
なので束縛の種類とその束縛されているモノと字の綴りが同じ識別子のみが
リテラル識別子にマッチするという方が正しいでしょう。
0625デフォルトの名無しさん
2008/02/16(土) 19:48:280626567
2008/02/16(土) 21:05:57早速のご返答ありがとうございます.
いま R5RS も見ながら考えさせていただいていますが,もう少し時間をいただきます.
問題の本質とは少しずれますが,私が混乱していた原因の一つに,syntax-rules の
第1引数である literals に含まれている literal-identifier についての誤解があったようです.
「literal」という名前から,字面の一致だけを見るものだと思いこんでいましたが
正しくは,R5RS や >>573 さんはじめ上の書き込みにもさんざんあるように,
literal-identifierは
>>583:
>ともに未束縛であるか
>或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする
ということなんですね.思いこみで記述が頭に入っていませんでした.
なお,577:で
5s/template上のsymbol/pattern上のsymbol/
でした.
0627593
2008/02/18(月) 00:57:16途中から議論が分からなくなってしまったのですが、>>596さんのコードを実
行したところ、tarai は実行されますが、表示される時間は 0 です。
> (force (delay (time (tarai 800 400 0))))
cpu time: 0 real time: 0 gc time: 0
800
すみませんが、これはどうにかならないでしょうか?
0628593
2008/02/18(月) 00:59:590629デフォルトの名無しさん
2008/02/18(月) 01:01:000630デフォルトの名無しさん
2008/02/18(月) 10:52:21正しいのでは?
タライ回し関数は遅延評価で計算すると
正格評価にくらべて格段に速い
0631630
2008/02/18(月) 11:04:000632593
2008/02/18(月) 13:59:55(force (delay (time (tarai 1000 500 0)))) を実行してみてください。
これで0秒なのは、おかしいでしょう?
0633593
2008/02/18(月) 14:02:07いう計算結果が表示されるのです。もしもっと早いマシンをお使いなら、引数
を適宜増やしてお確かめください。
0634デフォルトの名無しさん
2008/02/18(月) 14:48:40time構文はLazy Schemeでは使い物にならないと考えた方がいいかも
0635デフォルトの名無しさん
2008/02/18(月) 15:18:200636デフォルトの名無しさん
2008/02/18(月) 16:00:56(define (bench exp)
__(let* ((start (current-milliseconds))
_________(value exp)
_________(end (current-milliseconds)))
____(display start)
____(newline)
____(display value)
____(newline)
____(display end)
____(newline)
____(display (- end start))))
ミリ秒でしか測れないし
余計な出力もあるのがダサいけど
0637593
2008/02/18(月) 17:06:55ありがとうございます。ちゃんと動きました。
ありがたいことに、自分にも隅々までよく分かるコードです。
しかし、遅延評価であるがゆえに、逆に副作用だらけになってしまったのが、
少し泣けます。
0638デフォルトの名無しさん
2008/02/20(水) 00:54:510639デフォルトの名無しさん
2008/02/20(水) 01:05:040640デフォルトの名無しさん
2008/02/20(水) 12:33:26共通語がないと不便じゃないか
0641デフォルトの名無しさん
2008/02/20(水) 12:45:47http://schemers.org/Documents/Standards/Charter/status-jun-2006/status-jun06.html#g11
0642デフォルトの名無しさん
2008/02/20(水) 14:19:47まあ普及しちゃったからしょうがないけど、必要悪だろ。
0643デフォルトの名無しさん
2008/02/20(水) 15:01:380644デフォルトの名無しさん
2008/02/20(水) 15:40:04うしたらよいでしょうか?
http://www1.ocn.ne.jp/~scheme/petite-start.html
↑のページで紹介されている、ChezSchemeの trace関数のようなものです。
0645デフォルトの名無しさん
2008/02/20(水) 15:50:08Schemeにはそもそもプロセスという概念が無い?
今はただ関数定義程度の練習レベルです。
0646デフォルトの名無しさん
2008/02/20(水) 15:51:20がイマイチ分かってないということです。
0647デフォルトの名無しさん
2008/02/20(水) 18:32:37Cにはそもそもプロセスという概念が無い?
今はただ関数定義程度の練習レベルです。
つまり、Cで出来ること、あるいはCの用途
がイマイチ分かってないということです。
0648デフォルトの名無しさん
2008/02/20(水) 18:39:45そうか。意味不明だったか。確かに。
どういう分野に活かしていくのが普通なんでしょうか?
例えば、CやC++ならネットワークプログラミングとかOSとか
デバイスドライバとか作成しますが、Schemeのアプリケーション
とはどういったものになりますか?コンパイラ作成用途とかになる
んですかね?
0649デフォルトの名無しさん
2008/02/20(水) 20:07:12まあ記号処理には強いだろうね。
0650デフォルトの名無しさん
2008/02/20(水) 20:11:01記号処理ですか。未知の分野なのでもう少し精進して
調べて見ます。
0651デフォルトの名無しさん
2008/02/20(水) 20:42:31MzScheme だとライブラリを使えばtrace、untraceもOK。
> (require (lib "trace.ss"))
>
0652デフォルトの名無しさん
2008/02/20(水) 20:51:09Petite Chez Scheme だとprocessを使って
他のプロセスにデータを送れたよ。
fprintを使うんだったかな。
>>650
数式処理には向いていると思う。
他にもいろいろと応用はあるんじゃないかな。
0653644
2008/02/20(水) 21:35:05MzScheme, DrSchemeでうまく行きました。
ありがとうございました。
Gauche はこんな感じのようです。
・トレース - 結城浩のSICP日記 - sicp
http://sicp.g.hatena.ne.jp/hyuki/20060507/trace
0654デフォルトの名無しさん
2008/02/20(水) 21:41:28使用言語の選択を誤っていると思う
あなたの場合Lispを選択する意味はないのではないか
一般に手に入る資料が豊富な分C/C++でやるのがよい
0655デフォルトの名無しさん
2008/02/20(水) 21:44:42C/C++は習得済みで業務で使用してます。
Schemeでプロダクトコード書くわけではないので。
0656デフォルトの名無しさん
2008/02/20(水) 21:58:03だからやりたい
とか言う程の物さ
0657デフォルトの名無しさん
2008/02/20(水) 22:16:40言語の話とライブラリの話がごっちゃになってないかな。
言語の特徴としては、再帰的な処理の記述とか、
メタなプログラミングが楽とか色々あるけど。
そういうことが知りたいんじゃないんだろうし。
Schemeのアプリケーションって言われても、
ウェブアプリケーションサーバ書いてる人もいれば、
.NET向けのアプリケーションを書くために処理系を実装してたり、
日常的に使うスクリプトをSchemeで書いてる人もいたりして様々。
0658デフォルトの名無しさん
2008/02/20(水) 22:22:45>再帰的な処理の記述とか、 メタなプログラミング
ここが勉強したいと思ったきっかけです。
>Schemeのアプリケーションって言われても、
>ウェブアプリケーションサーバ書いてる人もいれば、
>.NET向けのアプリケーションを書くために処理系を実装してたり、
>日常的に使うスクリプトをSchemeで書いてる人もいたりして様々。
色々できるんですね。ありがとうございます。
0659デフォルトの名無しさん
2008/02/20(水) 22:30:23ttp://practical-scheme.net/index-j.html
にある文章をいくつか読んでみたらどうだろう。ここのスレの人とかが、
何故敢えてLispやSchemeを使うのか、理解する助けになると思う。
0660デフォルトの名無しさん
2008/02/20(水) 22:32:48SchemeよりEmacs Lispの方が楽しめると思う。
CL使わないとLispらしさのかけらもないコードになっちゃうけど。
0661デフォルトの名無しさん
2008/02/20(水) 22:52:37>言語の特徴としては、再帰的な処理の記述とか、
>メタなプログラミングが楽とか色々あるけど。
>そういうことが知りたいんじゃないんだろうし。
とオレも思ったのだが
>>658
>>再帰的な処理の記述とか、 メタなプログラミング
>ここが勉強したいと思ったきっかけです。
という意外な応答
真意がつかめない
0662デフォルトの名無しさん
2008/02/20(水) 22:58:39Larcenyでtraceは使えるんですが、再帰関数をtraceしても
再帰的にtraceしてくれません
何かうまい使い方があるのでしょうか?
0663デフォルトの名無しさん
2008/02/21(木) 00:40:01読んで見ます。
>>661
C++でテンプレート使ってライブラリ書きたいんですが
再帰とメタファンクションを使わなければいけないんですよ。
で、そもそも再帰とベースとする言語として関数型言語
を覗いたわけです。
0664デフォルトの名無しさん
2008/02/21(木) 07:29:08そうなんだよね、traceがちょっと他と違っている。
libにtrace.schがあるんでこれをハックしてみるとか。
0665デフォルトの名無しさん
2008/02/21(木) 12:55:30Gimpのスクリプトで遊んでみるのもいいかも
0666デフォルトの名無しさん
2008/02/21(木) 14:52:33やっぱりあれだけ赤が入ると無理だったのでしょうか。
0667デフォルトの名無しさん
2008/02/21(木) 16:23:220668デフォルトの名無しさん
2008/02/21(木) 17:23:120669デフォルトの名無しさん
2008/02/21(木) 17:24:080670デフォルトの名無しさん
2008/02/21(木) 17:49:470671デフォルトの名無しさん
2008/02/21(木) 18:54:27ナカーマ
象さん分かりやすいが、文法のリファレンスも欲しい今日この頃。
お勧めありますか?
0672デフォルトの名無しさん
2008/02/21(木) 19:05:40自分はA5用紙に印刷して綴じて常に携帯してる
ついでに電子辞書にもtxtファイルで入れてる
0673デフォルトの名無しさん
2008/02/21(木) 20:28:28カーとクダーでいいですか?
0674デフォルトの名無しさん
2008/02/21(木) 20:29:03thx 日本語訳あったんで落とした。
0675デフォルトの名無しさん
2008/02/21(木) 21:29:24おk
0676デフォルトの名無しさん
2008/02/21(木) 22:12:42漏れはネットのあちこち入門サイトにお世話になってるお
0677デフォルトの名無しさん
2008/02/21(木) 22:23:570678デフォルトの名無しさん
2008/02/21(木) 22:56:02Scheme勉強するのは楽しいです。
仕事の時間は無駄な時間に感じます。
0679デフォルトの名無しさん
2008/02/21(木) 23:04:030680デフォルトの名無しさん
2008/02/21(木) 23:17:53金をもらえるんだものね。
金なしでやる人が大勢いるようなことなら、誰も金を出すわけない。
0681デフォルトの名無しさん
2008/02/21(木) 23:25:36ようやって作ったScheme版で独立すれば?という夢ぐらいは持ちたいものだw
0682デフォルトの名無しさん
2008/02/21(木) 23:27:080683デフォルトの名無しさん
2008/02/22(金) 00:15:56CLは細かいところまでよくできてるっぽいし
見かけによらないものだなーと
0684デフォルトの名無しさん
2008/02/22(金) 00:50:01先頭の再と末尾の帰が!
0685デフォルトの名無しさん
2008/02/22(金) 00:52:27>CLは細かいところまでよくできてるっぽい
と思えない俺は異常かおrz
0686デフォルトの名無しさん
2008/02/22(金) 01:13:300687デフォルトの名無しさん
2008/02/22(金) 01:13:33Schemeみたいにsymbol-valueとsymbol-functionを統合しとけば良かったなあ
けど互換性を重視したから難しかったんだよ
そう言っておられたぞ。
0688デフォルトの名無しさん
2008/02/22(金) 01:35:56Gauche c-wrapperはswigみたいなもの?
なんでswigにしなかったの?
0689デフォルトの名無しさん
2008/02/22(金) 05:46:08へー、初耳だ。
どこで言ってたの?
0690デフォルトの名無しさん
2008/02/22(金) 09:35:15それでよし
0691デフォルトの名無しさん
2008/02/22(金) 09:37:24>symbol-valueとsymbol-function
CL最醜の汚点だと思う
0692デフォルトの名無しさん
2008/02/22(金) 11:14:06bitの井田さんのインタビューかな?
0693デフォルトの名無しさん
2008/02/22(金) 12:06:12ちなみに、funcallを書くのは面倒だけど
フォームの頭に構文の名前 (funcallやlambdaやifやマクロの名前) を必ず書きましょう
と考えると汚くはない
funcallが汚いんじゃなくて、funcallを省略できる設計が汚い
0694デフォルトの名無しさん
2008/02/22(金) 12:10:21SPECIAL変数付近の扱いはちょっと汚いかなと思う。
0695デフォルトの名無しさん
2008/02/22(金) 12:54:19関数とその他の値とを区別無くfirst class objectとして扱うコードを
書きたいときに柔軟性を制約する一因とはならないのだろうか?
0696デフォルトの名無しさん
2008/02/22(金) 12:58:11その話は関連する話ではあるけど、
symbolがsymbol-valueとsymbol-functionの二つ持つという話そのものから、
ちょっと離れていっていると思います。
一つしかない場合もその種の議論は成立するのですから。
>>694
スペシャル変数は、スレッドローカルな変数とか、
elispみたいなバッファーローカルな変数と同様の「パターン」で、
ある種のライブラリ、応用にはとても自然なeval拡張だと思う。
別の機構も考えられるけども、とてもLisp的だと思う。
(拡張というのはレキシカルスコープなevalに対して)
0697デフォルトの名無しさん
2008/02/22(金) 13:01:00そういう「特殊な」ことをやる場所ではfuncallを使う。
そういうとこへ関数を渡すときは #' を付けてましょう。
というのが CL 的発想だと思う。大きなプログラムの中での可読性を
考えれば、そんなに悪くないと思う。
純潔なSchemerには我慢できないだろうけど。w
0698デフォルトの名無しさん
2008/02/22(金) 13:29:54> 関数とその他の値とを区別無くfirst class objectとして扱うコードを
CLが違うのはシンボルにセルが2つあるのと関数を適用するときの特別扱いであって、
「区別無くfirst class objectとして扱う」こと自体は普通に書けるじゃん。
0699デフォルトの名無しさん
2008/02/22(金) 13:40:160700デフォルトの名無しさん
2008/02/22(金) 13:43:02>一つしかない場合もその種の議論は成立する
そうです
Schemeでも関数なのかマクロなのか判断できなくて困ることがある
CLを汚いと言えるほどSchemeは綺麗じゃない
変数と関数じゃなくて
コンパイル時と実行時とで名前空間を分ければいいのかな?
0701デフォルトの名無しさん
2008/02/22(金) 13:44:440703デフォルトの名無しさん
2008/02/23(土) 12:21:19>Gauche c-wrapperはswigみたいなもの?
そう、ヘッダファイルからスタブを自動生成して関数やデータやマクロなんかをGaucheで使えるようにするもの。
>なんでswigにしなかったの?
最初swigを見たとき、バインディングの作り方がよく分からなかったから。
あと、コンパイルとかInterfaceファイルを作るのが面倒そうだったから。
0704デフォルトの名無しさん
2008/02/23(土) 17:07:34この本はどのような人を対象としてるか読んだ人分かりますか?
なんかProlog的なコーディングをSchemeでもできるという紹介
文でしたが、これはScheme的ではない異色の内容なんですかね?
0705デフォルトの名無しさん
2008/02/23(土) 17:21:57言語プリミティブ的なものが応用対象だから。
0706デフォルトの名無しさん
2008/02/24(日) 17:18:06On LispでもPrologやってるし。
0707デフォルトの名無しさん
2008/02/24(日) 17:20:490708デフォルトの名無しさん
2008/02/24(日) 17:30:57ML/Haskellはパターンマッチ渡しがあるから、
論理型言語とは「項書換えシステム」で統一的な見方ができる。
The Reasoned Schemerはその点でも面白い。S式は面白い。
0709デフォルトの名無しさん
2008/02/24(日) 17:50:240710デフォルトの名無しさん
2008/02/24(日) 17:58:541> (apples peaches pumpkin pie) はrelではない。なぜならペアのリストではないから。
2> ((apples peaches) (pumpkin pie) (apples peaches)) はrelではない。ペアのセットではないから。
3> ((apples peaches) (pumpkin pie)) はrelですか? yes
4> ((4 3) (4 2) (7 6) (6 2) (3 4)) はrelですか? yes
どういうことなのかさっぱりわかりません。
0711デフォルトの名無しさん
2008/02/24(日) 18:02:25まだそこまで読んでない。
0712デフォルトの名無しさん
2008/02/24(日) 18:09:41;; カッコに全角を使うのは辞めてください。釣りかと思います。
0713デフォルトの名無しさん
2008/02/24(日) 18:15:06サンクス!そういうことか!
ていうか、章の始めで教わってんじゃん・・・1日悩んじまったorz
全角ゴメン。気をつけます!
てかP.121じゃなくてP.119だし・・・
0714デフォルトの名無しさん
2008/02/25(月) 19:07:240715デフォルトの名無しさん
2008/02/25(月) 19:39:240716デフォルトの名無しさん
2008/02/25(月) 19:40:14ecmaスレで聞けよw
0717デフォルトの名無しさん
2008/02/25(月) 20:31:440718デフォルトの名無しさん
2008/02/25(月) 20:35:09まあいいや
0719デフォルトの名無しさん
2008/02/25(月) 20:37:180720デフォルトの名無しさん
2008/02/25(月) 21:01:450721デフォルトの名無しさん
2008/02/25(月) 21:11:190722デフォルトの名無しさん
2008/02/25(月) 21:19:450723デフォルトの名無しさん
2008/02/26(火) 00:19:15チューリング完全性だけが重要なら、抽象化はどうでもいいはずだが、現実は違う
0724デフォルトの名無しさん
2008/02/26(火) 00:48:20JavascriptのクラスシステムはJavascriptで書かれてます。
次のバージョンからは組み込みになりますが。
prototype base object systemあたりでググってください。
0725デフォルトの名無しさん
2008/02/26(火) 13:22:52Go and get one!
Or better yet, make your own.
は
”先へ進んで、完璧を目指せ!
もっといいのは、自分の力でやることだ。”
という意味であってる?
0726デフォルトの名無しさん
2008/02/26(火) 22:17:26邦訳の「Scheme手習い」元吉文男、横山晶一訳
たぶん、7章の最後の文だと思うんだけど。
「自分で行って手に入れよ。
さもなくば、独自のものを作れ」
となっている。
0727デフォルトの名無しさん
2008/02/26(火) 22:34:52「ここで一休み、お菓子取ってきなよ♪
でなきゃ、自分で作ってみてはどうかな?」
という意味に取ったけど。
0728デフォルトの名無しさん
2008/02/26(火) 22:38:29全然違ってた。。
邦訳なんかあったんだ
まあ内容には関係ないからいいか
>>727
お菓子はないだろw
0729デフォルトの名無しさん
2008/02/26(火) 22:41:23いや、まじめに。だってクッキーの作り方書いてあるじゃん。
0730デフォルトの名無しさん
2008/02/26(火) 22:50:15その訳でクッキーのレシピはどうなってるの?
0731デフォルトの名無しさん
2008/02/26(火) 22:53:27ああ、あの囲みのコード?
おれはてっきりあれを自分で完成させろということかと思った。
アメリカンジョーク?
0732デフォルトの名無しさん
2008/02/26(火) 22:55:26あのコードをみて Make your own cokkies.ということかと・・・・
てか、度々「一休みしてお菓子食べなよ!マスタード忘れないようにNE!」
みたいなメッセージが出てきてるじゃん?
0733デフォルトの名無しさん
2008/02/26(火) 22:58:15クッキーのレシピがlambda式風に書かれている。
戒律風に訳されているので、この部分も戒律風にわざと訳したのかもね。
0734デフォルトの名無しさん
2008/02/26(火) 23:00:22(lambda ()
(焼く
(quote (180 度))
(quote (12 分))
0735デフォルトの名無しさん
2008/02/26(火) 23:02:47そんな風になってるのか。
0736デフォルトの名無しさん
2008/02/26(火) 23:02:510737デフォルトの名無しさん
2008/02/26(火) 23:03:450738デフォルトの名無しさん
2008/02/27(水) 01:17:17後半は、
「まだまだいいのがあると思うなら、自分で作ることだね」
0739デフォルトの名無しさん
2008/02/27(水) 01:45:50> A Food Preparation Place
0740デフォルトの名無しさん
2008/02/28(木) 10:57:55Seasoned Schemer
Reasoned Schemer
があるんだけど、Little Schemerだけ紙質が悪いんだが
何で?わら半紙みたいでツルツルしてない。
0741デフォルトの名無しさん
2008/02/28(木) 11:25:16それが一番しっくりくるかな
0742デフォルトの名無しさん
2008/02/28(木) 13:49:27学生用のテキストは安いのを作ることがある。
0743デフォルトの名無しさん
2008/02/28(木) 14:04:29ツルツル版もあるの?
0744デフォルトの名無しさん
2008/02/28(木) 14:05:50はげまるくーん
0745デフォルトの名無しさん
2008/02/28(木) 14:16:050746デフォルトの名無しさん
2008/02/28(木) 14:17:46ものがあったな。
0747デフォルトの名無しさん
2008/02/28(木) 20:41:320748デフォルトの名無しさん
2008/02/28(木) 23:13:03Cでスタックを使うところにヒープを使えば自然と思いつきそうなものだが
Schemeみたいな高級言語で教えるのとどっちが分かりやすいのかね
0749デフォルトの名無しさん
2008/02/28(木) 23:15:36ポインタはね。関数は無理なのよ。しかも定義を呼び出し関数内に書ける
のがいい。C++のBOOST_FOREACHに似てる感覚。
0750デフォルトの名無しさん
2008/02/28(木) 23:56:380751デフォルトの名無しさん
2008/02/29(金) 00:05:370752デフォルトの名無しさん
2008/02/29(金) 00:22:340753デフォルトの名無しさん
2008/02/29(金) 03:20:15巷ではJavaScriptって、高級低級で二分するなら低級のほうに入るのか?
0754デフォルトの名無しさん
2008/02/29(金) 03:29:400755デフォルトの名無しさん
2008/02/29(金) 03:39:48高級・低級の分かれめってなんだか知らない(たぶん、時代によって変わる)けど、
lambdaが使える言語はみな高級だと思う。
あと、低級っていっても馬鹿にしてるわけじゃないことをお忘れ無く。
0756デフォルトの名無しさん
2008/02/29(金) 03:54:56「ひょっとしてこの人、高級の意味を誤解してるのかな」
という想像が最初に来るところだけど、Lispスレだからな。一応「その心は?」と聞きたくなる。
0757デフォルトの名無しさん
2008/02/29(金) 04:36:48意味わかりにくくなるけど
0758デフォルトの名無しさん
2008/02/29(金) 09:18:13今低級・高級を再定義するなら、機械が直接対応しない概念(クロージャとか)を
扱えるものが高級言語、でどうだろう。
シンタクスによる区別だったのをセマンティクスによる区別で再定義というか。
0759デフォルトの名無しさん
2008/02/29(金) 09:35:060760デフォルトの名無しさん
2008/02/29(金) 09:43:060761デフォルトの名無しさん
2008/02/29(金) 10:07:480762デフォルトの名無しさん
2008/02/29(金) 12:28:20ならあるぞ
0763デフォルトの名無しさん
2008/02/29(金) 12:40:47std::vectorとかポインターをcに渡すことはできるの?
0764デフォルトの名無しさん
2008/02/29(金) 12:48:11何で記述されてますか?
0765デフォルトの名無しさん
2008/02/29(金) 12:50:28値を返さない手続きがない(void以前)ので」ってオチ禁止
0766デフォルトの名無しさん
2008/02/29(金) 14:44:35あまり関係ないけど
GCCはLispライクな中間コードにコンパイルしてから
CPUコードを出力するって聞いたことがあるけど
0767デフォルトの名無しさん
2008/02/29(金) 15:31:53--------------------------------------------------------
The Tenth Commandment
Build functions to collect more than one value at a time.
”一度に複数の値を集めるための関数を作れ!”
--------------------------------------------------------
これが言わんとする深い意味はなんですか?
直前のmultiremberEco関数の例で確かに二つのリストに振り分けてるのは
理解できるんだけど。(tunaに一致するもののリストと一致しないもののリスト)
条件に応じて、その条件を満足する値(アトムなど)あるいは満足しない値を集めろ!
って意味なのかな?
0768デフォルトの名無しさん
2008/02/29(金) 21:33:46>c-wrapperのデモビデオがみれなくなってる
今確認してみましたが、こちらからは見れました(ホームページのやつですよね)。
>std::vectorとかポインターをcに渡すことはできるの?
ポインターの受け渡しはできますが、今のところ c-wrapper は C++ には
対応していないので、残念ながら std::vector は無理です。
0769デフォルトの名無しさん
2008/02/29(金) 22:25:51俺もそこらへん読んでる。急に難しくなってきたね。
説明できないのでもうちょっとよく読んでみる…
0770デフォルトの名無しさん
2008/03/01(土) 00:44:35multirember&co関数かと。
0771デフォルトの名無しさん
2008/03/01(土) 01:04:22http://groups.google.co.jp/group/comp.lang.scheme/browse_thread/thread/a059f78eb4457d08/be4705d06e96a2e4?hl=ja&lnk=gst&q=little+schemer+-+multirember%26co#
0772デフォルトの名無しさん
2008/03/01(土) 02:16:04「at a time」でやることによって、
純関数型に特徴的なプログラミングスタイルが登場します。
昔birdが書いたコンパイラの純関数型ワン・パス・パーザや,
DanvyのTABA(There and Back Again)パターンや、
purely functional algorithmに出てくるようなコードなどでも
この章で使うようなテクニックが使われてます。
Little Schemeは非常に簡単な例でやっているので、
何が何だか分からない奇妙なパズルをやらされている気分になるかもしれませんが、
無意味なことはほとんどないので、著者を信じて頑張ってください。
まあバリバリ手続き型で書きたい人には苦行すぎる面もありますが。
0773デフォルトの名無しさん
2008/03/01(土) 12:01:59&か。何の文字かわからなかった。
>>772
実用的なコードの源泉かあ。
今は習うより慣れろのレベルだけど、Schemerシリーズは全部やる。
単純な例でも脳の体操にもなるし。
0774デフォルトの名無しさん
2008/03/01(土) 21:26:31The Scheme Programming Language, 3rd Edition
これは評価が高いですが、やはり良書ですか?
CのK&R相当らしく、数日でたくさん学ぶ人もいるらしいですが
どうなんでしょう。
0775デフォルトの名無しさん
2008/03/01(土) 21:42:06Second Edition と村上さんの邦訳をもっているけど、
3rdはかなり改訂されてるんかい?
0776デフォルトの名無しさん
2008/03/01(土) 21:49:400777デフォルトの名無しさん
2008/03/01(土) 21:55:25おお、公開されてるんだ。Dybvigさん、太っ腹。
0778デフォルトの名無しさん
2008/03/01(土) 21:59:06初心者向けの良い本だと思う。
0779デフォルトの名無しさん
2008/03/02(日) 00:08:16にある以下のプログラムなんですが、
(define evens-only*&co
(lambda (l col)
(cond
((null? l) (col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l)) (evens-only*&co (cdr l)
(lambda (newl P S)
(col (cons (car l) newl) (* (car l) P) S))))
(else (evens-only*&co (cdr l)
(lambda (newl P S)
(col newl P (+ (car l) S)))))))
(else
(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))
特に (col (cons al dl) (* ap dp) (+ as ds)) とする意味が分かりません。
こういうものはどういう思考で捉えていけば良いのでしょうか?
具体値で考えると確かに正しいことは分かるのですが、それを一般式で
表すのが難しくて思いつきません。
0780779
2008/03/02(日) 00:31:17(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))
(car l) と (cdr l) について再帰してそれぞれの結果を得る。
まず、(cdr l) に対して結果を得る。つまり、dl dp ds が具体値に
決まる。その後、その結果に対して、(car l) に対する再帰の結果
である al ap as を得て、(cdr l) に対する結果とマージする。
よく分からなかったのはlambda関数のパラメータでした。
自分としてのキーポイントは、
�@lambda関数のパラメータが具体値に求まる。
�Alambda関数のパラメータが具体値に求まる順番はネストの深い
ものから始まる。
という風に考えるとよいかなと思いました。
0781779
2008/03/02(日) 00:36:37(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds)))
要は、まず上の部分の (cdr l) の再帰が先に終了し、そのパラメータであるdl dp ds
が具体値に求まる。その後で、具体値に求まったdl dp dsとともに
(evens-only*&co (car l) (lambda (al ap as) ・・・の (car l) の部分の再帰が行われる。
0782779
2008/03/02(日) 00:42:43パラメータは変数なので。。
ただ具体的な値で追っていくと、例えば
(col (cons al (2 4)) (* ap 8) (+ as 4)))
みたいな感じで、dl dp ds 部分が決まっていくようです。
パラメータが具体値に求まるというのは、その程度の意味です。
0783デフォルトの名無しさん
2008/03/02(日) 01:58:27; direct style
(define (fact n)
(if (= n 0) 1
(* n (fact (- n 1)))))
; accumulator style
(define (fact n) (factacc n 1))
(define (factacc n acc)
(if (= n 0) acc
(factacc (- n 1) (* n acc))))
; continuation passing style
(define (fact n) (factacc n (lambda () 1)))
(define (factacc n cc)
(if (= n 0) (cc)
(factacc (- n 1) (lambda () (* n (cc))))))
accumulator styleは演算子が可換、
あるいは逆から数え上げることが可能(e.g. (from n) ←→(to n))でないと困る。
例えばリストに対する演算の場合。consは可換でない。
0784デフォルトの名無しさん
2008/03/02(日) 11:33:34可換じゃなくて、a * b = b * a
結合則が成立するかどうかな。(a * b) * c = a * (b * c)
0785デフォルトの名無しさん
2008/03/02(日) 11:55:51http://www.cs.utah.edu/classes/cs6520-mflatt/s02/cps.pdf
0786779
2008/03/02(日) 12:45:19>>784
>>785
ありがとうございます。
evens-only*&co は CPS の記述スタイルで書かれていると思ったのですが、
>>785さんのpdfファイルに記載されている内容が、その考え方の基礎という
ことですね。
0787デフォルトの名無しさん
2008/03/02(日) 13:44:29Schemeでは自己末尾再帰が使用されるとよく言われてますが、
自己末尾再帰の理解が正しいか教えてください。
例はC言語で書かせていただきます。
階乗計算の例で以下のようなコードがよく使われます。
int kaijyo(int n)
{
if(n == 0) return 1;
return n * kaijyo(n - 1);
}
ただし、n * kaijyo(n - 1) の部分に注目すると自分自身であるkaijyoと他者のn
との積算になっています。つまりkaijyo関数は自己末尾再帰ではない。
自己末尾再帰とは自分自身のみを使って再帰するという意味である。
以下のようにプログラムを修正した場合、calculate関数は自分自身のみで再帰している
ので自己末尾再帰であるといえる。
int calculate(int n, int m, int p)
{
if(m == 0) return p;
return calculate(n-1, m-1, n*p);
}
int kaijyo(int n)
{
return calculate(n, n, 1);
}
0788デフォルトの名無しさん
2008/03/02(日) 13:52:10NO
末尾で自分自身を呼び出していれば末尾再帰。
末尾以外で自分自身以外を使っていてもよい。
0789デフォルトの名無しさん
2008/03/02(日) 13:52:50関数を処理した後に行わないといけない処理を含んでいる。
自己末尾再帰ってのは、
「最も最後に行われる処理が自己再帰」であるから、
上の奴は自己末尾再帰ではない。
自己末尾再帰はループ処理に最適化可能だから、
パフォーマンスを考えると自己末尾再帰が良い。
下のように戻り値用の引数を加えるというのはよくある手。
0790デフォルトの名無しさん
2008/03/02(日) 14:00:33{
if(n == 0) return p;
return calculate(n-1, n*p);
}
int kaijyo(int n)
{
return calculate(n, 1);
}
どうでもいいけど、これでもいいんでね?
0791デフォルトの名無しさん
2008/03/02(日) 14:22:16>>788
なるほど。途中は何をやっていたもいいと。
処理の最後(末尾)で自身を呼び出していればOKということですね。
>>789
>関数を処理した後に行わないといけない処理を含んでいる。
これは、今の例の場合 return のことでしょうか?
仮にcalculateの戻り値をvoidにできたとして、最後にcalculateを
呼び出していれば、自己末尾再帰ということになるのでしょうか?
>>790
確かにそうですね。引数が一つ余分でした。
アルゴリズムの範疇になるかと思いますが、
上のC言語での階乗計算を自己末尾再帰で表現することは可能ですよね?
Schemeの再帰は実行効率を考えて自己末尾再帰が採用されているという
ことですよね。
0792デフォルトの名無しさん
2008/03/02(日) 14:24:23>関数を処理した後に行わないといけない処理を含んでいる。
かけ算のこと。
0793デフォルトの名無しさん
2008/03/02(日) 15:13:15失礼しました。上の例ということですね。
再度すみませんが、下の例は自己末尾再帰になっていると
いうことですよね?
0794デフォルトの名無しさん
2008/03/02(日) 15:27:390795デフォルトの名無しさん
2008/03/02(日) 15:29:08の処理の流れは
1. kaijyo(n - 1) を実行する
2. n とその戻り値を掛けた値を返す
であって、自己再帰(1)より後に(2)の処理が入る。
0796デフォルトの名無しさん
2008/03/02(日) 15:31:25とりあえず自分でループ処理に変換しようとしてみると
何が問題になるのかが分かりやすいと思う。
0797デフォルトの名無しさん
2008/03/02(日) 15:32:35>上のC言語での階乗計算を自己末尾再帰で表現することは可能ですよね?
>Schemeの再帰は実行効率を考えて自己末尾再帰が採用されているという
>ことですよね。
何かを勘違いしている予感。
0798デフォルトの名無しさん
2008/03/02(日) 15:58:42わかりました。ありがとうございました。
>>795
次数の低い部分が先に求まるということですよね。
>>779も私なのですが、
(evens-only*&co (car l) ;再帰1
(lambda (al ap as)
(evens-only*&co (cdr l) ;再帰2
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds)))))
これも同じように理解していいのでしょうか?
(1) 再帰2を実行する。
例えば、(col (cons al '(2 4)) (* ap 8) (+ as 6)) のような状態が作られる。
(2)(1)の結果に対して、再帰1が実行され、a1 ap as に具体的な値が求まる。
例えば、(col (cons '(6) '(2 4)) (* 6 8) (+ 1 6)) のような状態が作られる。
(1)の処理の後に(2)の処理が実行される。
>>797
考えて見ます。
>>798
前半部分の質問は勘違いですので撤回します。
自己末尾再帰が採用されているというよりは、自己末尾再帰で
処理可能な言語仕様になっていると言えば正しいですか?
0799デフォルトの名無しさん
2008/03/02(日) 20:22:07「自己末尾再帰になっている」ことと、「それを効率的に計算する」ことは別だよ。
今時のGCCは、自己末尾再帰の最適化くらいやれるけど、それはCの言語仕様じゃなく
GCCが頑張っているだけ。scheme では仕様として自己末尾再帰になっていれば効率的に計算する。
0800デフォルトの名無しさん
2008/03/02(日) 20:40:15相互末尾再帰もループに最適化してくれるのかな?
自己末尾再帰だけかな?
R5RSの「仕様として末尾呼出し最適化が決められている点」はCLにも無い長所(ですよね?)
CLはコンパイルしない場合は末尾呼出し最適化は行われないかもしれない(んですよね?)
実際のCLtLはどうか知らないけど
グレアムのAnsiCLでは
速度最速宣言を行ってコンパイルを行った場合*のみ*
末尾呼出し最適化が行われるって感じの表現だった
0801デフォルトの名無しさん
2008/03/02(日) 20:40:16なるほど。
・Scheme → 自己末尾再帰で記述 → 言語仕様で効率的に処理されることが保障される
・C、C++ → 自己末尾再帰で記述 → 言語仕様では効率的に処理されることは保障されない
ですね。
0802デフォルトの名無しさん
2008/03/02(日) 21:44:32beginのnは違うのね。
というかprognがprog+nだってことをすっかり忘れてて
頭の中では「プログン、プログン」って唱えてた。
R5RSではbeginは原始式でなく派生式ということになってるけど
syntax-rulesでは記述できないですよね?
R5RSでも定義が含まれていない場合の定義例しか書いてないし。
戯れにPascalライクに(begin ... end)って記述するようにしようとした時に
定義を含む場合のbeginが書けなくて挫折したことがある。
0803デフォルトの名無しさん
2008/03/02(日) 21:51:33・Scheme → 末尾呼び出しで記述 → 言語仕様で効率的に処理されることが保障される
・C、C++ → 自己末尾再帰で記述 → 言語仕様では効率的に処理されることは保障されない
末尾呼び出し一般の最適化をCでやるのは、フレームが共通の形になるように
してなんとかやれなくもない気がするんだけどどうですかね?
0804デフォルトの名無しさん
2008/03/02(日) 21:54:32RVO も規格で保証して欲しいと思ってるけど保証してないし。
0805デフォルトの名無しさん
2008/03/02(日) 21:57:52今やアセンブラみたいなもんだし。
0806デフォルトの名無しさん
2008/03/02(日) 21:58:57C++ のパースは凄い難しいらしいな。
0807デフォルトの名無しさん
2008/03/02(日) 22:02:030808デフォルトの名無しさん
2008/03/02(日) 22:02:150809デフォルトの名無しさん
2008/03/02(日) 22:14:07GCLとは別のヤツで。
・gccが動く環境全てで利用できるというポータビリティの高さ
・GCLとは違ってCLtL2完全準拠
・GCJに於けるgijみたいなインタプリタもある(しかも結構速い)
・コンパイルすればg++よりうんと速い
を満たすヤツ
そしたらC++を使う必要がなくなってみんなハッピー
0810デフォルトの名無しさん
2008/03/02(日) 22:17:570811デフォルトの名無しさん
2008/03/02(日) 22:53:24http://ossan.fam.cx/up/uploda1/src/up0761.zip.html
WiLiKiとかslibとか同梱。 ついてでにzlibやqdbmやcdbのバインディングも入れてる。
本体のバイナリは公式ページにもあるけど、
Windows特有の事情で拡張パッケージがすんなりインストールできないことが多いので将来的にはなんとかしてほしいなぁ。
0812デフォルトの名無しさん
2008/03/02(日) 23:11:00align関数のところでweight関数を出してきてるが
何を言いたいのかが全然ワカラン。
0813デフォルトの名無しさん
2008/03/02(日) 23:14:40もっとも微妙な英語のニュアンスが分かってないのと、
想像力が足らないんだろうとは思ってるが。
0814デフォルトの名無しさん
2008/03/02(日) 23:26:15たぶん英語の問題が大きいんだろう。
落ち着いてじっくり嫁。
0815デフォルトの名無しさん
2008/03/02(日) 23:47:19weight*の話を持ち出してるのか?話しの流れが
サッパリわからない。何でatomの総数を計算するlength*
が間違いで、weight*のように前半部を2倍するんだろう。
そのことと、alignがpartial functionではないことと何の
関係があるのか。
0816デフォルトの名無しさん
2008/03/02(日) 23:54:00ヘー、CygwinやMinGWがインストールされてなくても使えるの?
0817デフォルトの名無しさん
2008/03/03(月) 00:23:45やってみればわかることをなぜ聞く
0818デフォルトの名無しさん
2008/03/03(月) 00:25:140819デフォルトの名無しさん
2008/03/03(月) 00:28:330820デフォルトの名無しさん
2008/03/03(月) 00:30:45ねぇねぇ、聞いたほうが早いって言ってるけど
早かった?
∩___∩ ∩___∩
♪ | ノ ⌒ ⌒ヽハッ __ _,, -ー ,, ハッ / ⌒ ⌒ 丶|
/ (●) (●) ハッ (/ "つ`..,: ハッ (●) (●) 丶 早かった?
| ( _●_) ミ :/ :::::i:. ミ (_●_ ) | ねぇ、早かった?
___ 彡 |∪| ミ :i ─::!,, ミ、 |∪| 、彡____
ヽ___ ヽノ、`\ ヽ.....::::::::: ::::ij(_::● / ヽノ ___/
/ /ヽ < r " .r ミノ~. 〉 /\ 丶
/ /  ̄ :|::| ::::| :::i ゚。  ̄♪ \ 丶
/ / ♪ :|::| ::::| :::|: \ 丶
(_ ⌒丶... :` | ::::| :::|_: /⌒_)
| /ヽ }. :.,' ::( :::} } ヘ /
し )). ::i `.-‐" J´((
ソ トントン ソ トントン
0821デフォルトの名無しさん
2008/03/03(月) 00:36:56どうかと思うけどな
0822デフォルトの名無しさん
2008/03/03(月) 01:13:350823デフォルトの名無しさん
2008/03/03(月) 01:16:070824デフォルトの名無しさん
2008/03/03(月) 01:27:42質問者より816のほうが変だよ
0825デフォルトの名無しさん
2008/03/03(月) 01:28:28質問者より817のほうが変だよ
0826デフォルトの名無しさん
2008/03/03(月) 01:29:020827デフォルトの名無しさん
2008/03/03(月) 01:30:17>>817は思い込みによるバグを量産するタイプだな。
0828デフォルトの名無しさん
2008/03/03(月) 01:49:010829811
2008/03/03(月) 09:43:16使う前にslibcatは削除しとかないと、slibを見つけられないかも。
0830デフォルトの名無しさん
2008/03/03(月) 12:44:39L-99: Ninety-Nine Lisp Problems
ttp://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html
Schemeで解いてる。気分転換になっていいかも。
最初は簡単なんだけど後半はちょっと大変。
0831デフォルトの名無しさん
2008/03/03(月) 12:49:27数独を解くアルゴリズムとか面白そうだうな
0832デフォルトの名無しさん
2008/03/03(月) 13:15:02なんで”本物”じゃないのでしょうか?
0833デフォルトの名無しさん
2008/03/03(月) 13:22:49というお約束は置いといて、
動的スコープであることが一番あれこれ言われるところかな?
0834デフォルトの名無しさん
2008/03/03(月) 13:27:140835デフォルトの名無しさん
2008/03/03(月) 13:38:581958年にMcCarthyが作った最初のlispが外れるような定義だと
本物という言葉にそぐわないし。
0836デフォルトの名無しさん
2008/03/03(月) 13:46:23おお、勇者よ!
フムフム本
http://www.oreilly.co.jp/books/9784873113487/
の中の人ですが、811をshiroさんに送って、
sourceforge.netのどこかに置いてもらってよいですか?
あと、Windows版を継続的にメンテナンスする人が不足しているので、
gauche-develあたりで立候補していただけるとみんなが喜びます。
0837デフォルトの名無しさん
2008/03/03(月) 14:09:35・buffer local variable
・interactive
など非常に興味深い機構のある正真正銘のLispです。
ボンクラの戯言は無視すればいいと思う。
0838デフォルトの名無しさん
2008/03/03(月) 15:00:08T
0839デフォルトの名無しさん
2008/03/03(月) 15:23:320840デフォルトの名無しさん
2008/03/03(月) 15:59:05beginのnは「n番目」のnだったんだよ!!!
な、なんだっt(ry
(lispp x) -> T なるxは単にlispであるというだけ。
しかし(lisp x) -> T なるxはlispを満足する。すなわち本物のLispである。
0841デフォルトの名無しさん
2008/03/03(月) 20:39:22rfc.uriとかgauche.charconvがuseできない。
libiconv-2.dllが無いって言われた。
俺の環境だけの問題なのかな?
0842デフォルトの名無しさん
2008/03/03(月) 21:04:590845811
2008/03/03(月) 21:48:26やりなおしますた。
http://upload2.dyndns.org/up/4/_/jump/1204548392.zip/attatch
ダウンロードパスはgaucheにしてま。
ちょっとサイズが大きくなったのでこないだのアプロダは使えなかった。
0846816
2008/03/04(火) 00:01:01やってみた。
どうなってるのか知らないけどMinGWを入れてなくても動くんだね。
これは面白い、と言うかWindows上で気楽に試してみれるので有り難い。
おかげで今までGauche(と言うかScheme)を触った事も無かったけど
Oreillyの本(http://www.oreilly.co.jp/books/9784873113487/)も
予約注文したよ。
0847デフォルトの名無しさん
2008/03/04(火) 00:03:45Amazonで買いたいのに・・・
0848デフォルトの名無しさん
2008/03/04(火) 00:05:510849デフォルトの名無しさん
2008/03/04(火) 00:08:030850デフォルトの名無しさん
2008/03/04(火) 00:09:540851デフォルトの名無しさん
2008/03/04(火) 00:10:270852デフォルトの名無しさん
2008/03/04(火) 00:19:250853デフォルトの名無しさん
2008/03/04(火) 01:23:17新しいバージョンのGaucheが出たら、
すかさずWindows版をビルドしてうpしたりアナウンスしたりする。
0854デフォルトの名無しさん
2008/03/04(火) 01:25:57アマゾンは登録が遅いのでこのへんで買ってください。
http://books.yahoo.co.jp/book_detail/r0321851
http://www.7andy.jp/books/detail?accd=R0321851
http://www.cbook24.com/bm_detail.asp?sku=9784873113487
もちろんオライリーでも買えます。
http://www.oreilly.co.jp/books/9784873113487/
0855デフォルトの名無しさん
2008/03/04(火) 01:40:42持ち歩きたいけど何kgくらいだろこれ。
0856デフォルトの名無しさん
2008/03/04(火) 02:00:10そりゃ対ドルだけじゃねぇかよ
0857デフォルトの名無しさん
2008/03/04(火) 02:04:470858デフォルトの名無しさん
2008/03/04(火) 02:25:43アマゾンだと送料無料になる。
0859841
2008/03/04(火) 02:54:08なんか俺のビルドしたやつとサイズ違うな〜と思ったら
文字エンコーディングUTFなんだね。
俺はShiftJISにしたんだけど需要あるかしら?
それ以外は標準のままなんだけどねw
0860デフォルトの名無しさん
2008/03/04(火) 02:56:48thx
使わせてもらいます。
0861デフォルトの名無しさん
2008/03/04(火) 03:35:26アマゾンは1500以上送料無料。cbook24.comなら全商品送料無料。
0862デフォルトの名無しさん
2008/03/04(火) 03:43:20なるほど。
Oreillyに直接注文して300円損したw。
0863デフォルトの名無しさん
2008/03/04(火) 04:13:19Windowsで動いた。Cygwinを使わなくてもいいので助かる。
どうやったんだい?すごいなぁ。
0864デフォルトの名無しさん
2008/03/04(火) 09:11:19いつも使ってるのがAmazonだから
今回もAmazonで買いたかった。
あまりにぎりぎりまで登録されないようなら
>>854に挙げられているどこかで買ってみます。
0865デフォルトの名無しさん
2008/03/04(火) 10:45:12お暇なときにでもupしていただけると有り難いです。
0866デフォルトの名無しさん
2008/03/04(火) 11:54:52代引き手数料は?
0867デフォルトの名無しさん
2008/03/04(火) 12:05:49cbookでポチってきた。
0868デフォルトの名無しさん
2008/03/04(火) 17:18:44実際に使ってないから分からないけど
cygwinかMinGWのdllをスタティックリンクしているのでは?
自分が作ったOpenBSDザウルスのパッケージは2.0M、OpenBSD-i386のパッケージは1.8Mだけど
845のは6.4Mもあるみたいだし
と言っても単純になんでもかんでもスタティックリンクしたら6.4Mでは済まなそうだから
何か工夫されてるのかも
0869デフォルトの名無しさん
2008/03/04(火) 18:01:06VC++に対応したんだよね?>Gauche
0870デフォルトの名無しさん
2008/03/04(火) 18:43:54mingw.dllはスレッドを使わない限り不要だったはず。
0871841
2008/03/04(火) 20:05:44うpしてみました。
ttp://upload0.dyndns.org/up/2/_/jump/1204628280.zip/attatch
パスはgauche
MinGW&MSYSでビルドしたやつだけどたぶんMinGW無い環境でも動くと思う。
ShiftJISでGauche使い方はどうぞ。
0872デフォルトの名無しさん
2008/03/04(火) 20:27:14Gauche本とiPod touchを手にアウトドアでプログラミング出来るのが夢。
0874デフォルトの名無しさん
2008/03/04(火) 21:13:17stripくらいかけといてくれるといいなー。デカいッス。
あとslibのインストール方法がわからん…。
0875デフォルトの名無しさん
2008/03/04(火) 23:07:04ちょっと舐めてたわ。Y combinator?
9章までいくと、再帰を追っていくのが大変だわ。
関数を返す関数の再帰。。。
0876デフォルトの名無しさん
2008/03/04(火) 23:26:25Littleもそうだけど、このスレ自体もオレに言わせりゃ神レベルw
難しくてわかんないことが多いw
Lisper・Schemerって凄いなと思った。
Y combinatorってこのスレの前の方に出てきた話題だね。
0877デフォルトの名無しさん
2008/03/04(火) 23:50:04ども
0878デフォルトの名無しさん
2008/03/05(水) 00:03:32PalmにLispMeを入れてLittle Lisperと一緒に持ち歩いて遊んだ俺が来ましたYO!
0879デフォルトの名無しさん
2008/03/05(水) 00:08:11この本が上のレスの方にありますが、Schemerシリーズより難しい?
0880デフォルトの名無しさん
2008/03/05(水) 00:14:289章よりはやさしいけど全体的には同じくらいかな。
Yコンビネータを知ってる人は理解が早いと思う。
Q&A形式という似たような形式なのもなじみやすいYO!
0881デフォルトの名無しさん
2008/03/05(水) 00:24:360882デフォルトの名無しさん
2008/03/05(水) 00:30:16このスレには東大卒が絶対にいる。
0883デフォルトの名無しさん
2008/03/05(水) 00:31:210884デフォルトの名無しさん
2008/03/05(水) 00:31:350885デフォルトの名無しさん
2008/03/05(水) 01:03:400886デフォルトの名無しさん
2008/03/05(水) 01:28:33英語ペラペラか?
>>885
古い本だし今のうちに買っておくかな
0887デフォルトの名無しさん
2008/03/05(水) 01:40:20(case (大学 卒業) (大学院 修了))
0888デフォルトの名無しさん
2008/03/05(水) 01:45:33院修了 に一致する日本語のページ 約 18,500 件中 1 - 50 件目 (0.53 秒)
0889デフォルトの名無しさん
2008/03/05(水) 03:05:37にしてもなんとなく東大関係者はなかりたくさん居る気がする。
On Lisp 翻訳の人も駒場の学生(当時)だったし
0890デフォルトの名無しさん
2008/03/05(水) 03:09:260891デフォルトの名無しさん
2008/03/05(水) 06:54:070892デフォルトの名無しさん
2008/03/05(水) 10:43:400893デフォルトの名無しさん
2008/03/05(水) 13:01:23それでもschemeの方がいい理由は?
0894デフォルトの名無しさん
2008/03/05(水) 14:48:25ユーザが多いから。
もちろん日本人の。
0895デフォルトの名無しさん
2008/03/05(水) 17:55:57最近、Gaucheが流行ってる。けど、どっちでもいいと思うYO!
使いたいコードがころがってる方を使えばいいんジャマイカ?
0896デフォルトの名無しさん
2008/03/05(水) 18:09:42loop書くの嫌だ
0897デフォルトの名無しさん
2008/03/05(水) 18:12:52んなもん使わなくてもプログラムくらい書ける
0898デフォルトの名無しさん
2008/03/05(水) 19:03:09仕様が小さい(印刷して持ち運べる)
シンプルに書ける(パワーはないけどエレガント)
処理系が多い(出来はピンキリだけどいろいろな環境で動かせる)
0899デフォルトの名無しさん
2008/03/05(水) 20:01:51実用的なゴチャゴチャした処理やパフォーマンスが欲しくなったら
Common Lispで書き直すのが一番良いと。
0900デフォルトの名無しさん
2008/03/05(水) 20:53:11圧倒的少数だよね。
loop嫌いって言ってる奴だって結局Common Lisp使ったことないんだろ?w
0901デフォルトの名無しさん
2008/03/05(水) 21:00:26そうなの?
ある程度以上に大きい実用的なソフトを書こうとしたら
Common Lispを使うのが普通だと思ってたけど。
0902デフォルトの名無しさん
2008/03/05(水) 21:03:38多い少ないは知らんけど、個人的には圧倒的に Common Lisp をよく使う。
ちなみに loop はあまり好きではないな。w
0903デフォルトの名無しさん
2008/03/05(水) 21:10:020904デフォルトの名無しさん
2008/03/05(水) 21:10:37データ見て言ってるかのうように書いちゃったのでは。
0905デフォルトの名無しさん
2008/03/05(水) 21:43:10だがしかし、プログラミングCommon Lispという本が出版されて、
cl.nightというイベントが開催され、チケットが売り切れるようなことは
想像できないなwww
まあ、願望とも印象ともつかないことだがwww
0906デフォルトの名無しさん
2008/03/05(水) 21:56:22アマゾンまだぁ〜?
0907デフォルトの名無しさん
2008/03/05(水) 21:58:560908デフォルトの名無しさん
2008/03/05(水) 22:05:23multirember&coのp.140で(a-friend ls1 ls2)のls2が(tuna)になるのは何故ですか?
colのパラメータ(?)にaあるいはlatの子孫がくる様に考えられないのです。
どなたかヒント下さいませんか。
あと同じp.140で英語の質問なのですが
Those atoms are not are collected in one list ls1;〜
の構文がわからないです。
あーあ9章もざっと眺めたら難しそうだし、7章までじっくり復習した方が良いかなぁ…(-_-;)
ここまで楽勝と思ってたのに、multirember&coでいきなりつまづいちゃったよ…
読んでる(読んだ)方達は全部解答書きながら読んでます(ました)?
0909841
2008/03/05(水) 22:10:09>>874
make install-stripなんてのあるの知りませんでした。
Gaucheの次バージョン出たらそうしようっと。
slibは>>845さんのslibを入れてSCHEME_LIBRARY_PATH通せば使えるよ。
念のためパスの最後は/ね。
slib、wilikiありがたくいただきました。
0910811
2008/03/05(水) 22:31:54share\gauche\0.8.13\lib\slib.scmのlibrary-vicinity関数を書き換えてる。
この方法を使えばどこへ持っていっても環境変数で設定する必要は無くなる。
バイナリパッケージを作るならこの方法が良いと思う。
0911デフォルトの名無しさん
2008/03/05(水) 22:40:27「Common LispとLoopとλとS式を愛するすべてのCLerに贈るdisassembleな一夜。」
何かの学会みたいになるんだろうなw
0912デフォルトの名無しさん
2008/03/05(水) 22:42:21CommonLisp使ってるし普通にLoopマクロ愛してるけど?
0913デフォルトの名無しさん
2008/03/05(水) 23:26:21CommonLisp使ってるけど, コンパイラを信じて再帰する俺
コンパイラが屑で, 再帰で性能でないと (loop ...
0914デフォルトの名無しさん
2008/03/05(水) 23:38:59Common LispとSchemeのどちらなんだろう?
0915デフォルトの名無しさん
2008/03/05(水) 23:53:15まず、再帰の最も内側で
式�@
(col newlat (cons 'tuna seen) )
where newlat is '()
and seen is (quote '()
ここのcolは式�Aの関数に置き換わる。
次に
式�A
(col (cons 'and newlat) seen)
where newlat is 式�@の第一引数 '()
and seen is 式�@の第二引数 (cons 'tuna '()) = '(tuna)
つまり、
(col (cons 'and '()) '(tuna))
つまり、
(col '(and) '(tuna)) となる。
col を a-friend に置き換えて、
(a-friend '(and) '(tuna))
Those atoms that are not の are not という部分は、省略されてるけど、
前文の whether it is eq? to a と 後半のothersの部分を見れば、
”a と一致しない”という意味が読み取れる。つまり、(eq? (car lat) a)
が真にならないatomは最初のリストls1に集められ、真になるatomは二番目の
リストls2に集められるという意味になる。
0916デフォルトの名無しさん
2008/03/05(水) 23:54:51× and seen is (quote '()
○ and seen is '()
0917デフォルトの名無しさん
2008/03/06(木) 00:05:46酔っぱらっているので英語の方だけ。
;; 引用でthatを抜かしてるじゃん…
;; あと酔っぱらって本を参照するの面倒だから、全文引用してくれw
"that are not"なthose atomってのは、
"(that) is(are) not eq? to a"なthose atomってこと。
(those atom (that are not)) are collected ((in one list) (ls1));
逆の"is(are) eq? to a"な方が、
"the others for which the answer is true"と表現されている。
0918917
2008/03/06(木) 00:07:560919デフォルトの名無しさん
2008/03/06(木) 01:13:32どっちも勉強してみてそれから自分で決めればいいよ!
という遅延アドバイス。
0921デフォルトの名無しさん
2008/03/06(木) 01:24:560922908
2008/03/06(木) 01:28:25PCが調子悪くてこちらもうまくレス出来ませんが…
0923908
2008/03/06(木) 02:31:16おかげさまでとりあえず手で追えました。
前の関数を使うところとquoteの両方で間違えてこんがらかってたようです。
わかっているつもりになってるところがしっかり出来なかったので、
ちょっとへこみましたw
0924デフォルトの名無しさん
2008/03/06(木) 13:50:25マクロで定義できるからどちらもさほど変わらないけど
強いて言えばプリミティヴに用意されている処理系の場合は
Schemeがパフォーマンス的に有利かも。
R5RSのdelayは末尾再帰でspace leakする問題があり
SRFI-45で代替構文が提案されている。
この実装はCLマクロでも可能。
GaucheはSRFI-45構文をプリミティヴにサポートしてたはず。
0925デフォルトの名無しさん
2008/03/06(木) 14:40:49黒田さん出演決定しました。
0926デフォルトの名無しさん
2008/03/06(木) 14:59:11急だなwwww
0927デフォルトの名無しさん
2008/03/06(木) 15:54:210928デフォルトの名無しさん
2008/03/06(木) 19:49:43delayがメモ化することを今初めて知った
0929デフォルトの名無しさん
2008/03/06(木) 19:52:06アマゾンまだぁ〜?
0930914
2008/03/06(木) 22:21:13レスサンクス。
しかしSRFI-45構文とかややこしいな。
まあ、末尾再帰で最適化されそうなところに遅延評価を仕掛ける
つもりも無いし、普通はそう気にしないでも良いかな。
マクロを自分で書けば"lazy"って操作も実装できるみたいだし。
http://www.katch.ne.jp/~leque/translations/srfi-45/srfi-45j.html
Common Lispだと"delay" "force"を実装するにはOn Lispで
紹介されてるマクロを自分で書かないといけないらしいので
面倒くさそうだし、本当にうまく動くものなのかどうか
ちょっと不安になる。
0931デフォルトの名無しさん
2008/03/06(木) 23:24:030932デフォルトの名無しさん
2008/03/07(金) 08:14:30考えてみたけど良くワカラン orz
0933デフォルトの名無しさん
2008/03/07(金) 10:51:59ここを理解しないとSeasoned Schemerは読めない?
0934デフォルトの名無しさん
2008/03/07(金) 12:01:20(time (tarai 200 100 0))は引数のpromiseをつくる時間(≒0)を測定してるだけ
call by needなんだからtimeの内部でその必要がない限りforceされることはない
という解釈ではだめなの?
0935デフォルトの名無しさん
2008/03/07(金) 12:22:54>>601-602辺りを良く読んで。
そんな単純な話ではない。
0936デフォルトの名無しさん
2008/03/07(金) 13:26:24これ↓を毎日クリックするんだ
http://www.amazon.co.jp/o/ASIN/4873113487
0937デフォルトの名無しさん
2008/03/07(金) 15:02:45何が分からないのか分かってきたけど、ただのバグだと思う
自分でreplを定義してその中に入ると問題が起きない
(define (repl)
(! (let loop () (write (eval (read))) (newline) (loop)))
)
ちなみに(time (! (tarai 200 100 0)))で時間測れるよ
0938デフォルトの名無しさん
2008/03/07(金) 16:27:44しかし
> (time (! (tarai 1000 500 0)))
cpu time: 22691 real time: 24767 gc time: 2524
1000
> !
#<procedure:force>
> (tarai (force (tarai 1000 500 0)))
#<promise:?>
>
これは一体どうしたものか
0939デフォルトの名無しさん
2008/03/07(金) 16:46:31見本刷りが到着。
0940デフォルトの名無しさん
2008/03/07(金) 18:01:09> if
#<procedure:if>
> x
#<procedure:if>
> (eq? if x)
#t
> !
#<procedure:force>
> force
#<procedure:force>
> (eq? ! force)
#f
ここらへんが臭い
0941932
2008/03/07(金) 21:09:37>>933
ここか、blog立ち上げて分からないところ書き込めば?
誰かヒントをくれるよ、きっと。
整理して書くとずっと理解が深まるしね。
それからインタプリタはやった方がいいよ。
やっぱり評価器はLisp/Schemeの目玉の一つだから。
0942デフォルトの名無しさん
2008/03/07(金) 21:24:39気持ちリセットして再トライしますわ
とりあえず章を戻ってやり直す。
0943938
2008/03/07(金) 21:27:56> (tarai (force (tarai 1000 500 0)))
は
> (time (force (tarai 1000 500 0)))
ね
0945デフォルトの名無しさん
2008/03/08(土) 10:23:02よろしくおねがいします。
0946デフォルトの名無しさん
2008/03/08(土) 10:31:260947デフォルトの名無しさん
2008/03/08(土) 10:41:09http://www.amazon.co.jp/o/ASIN/4873113482/
URL違った
0948デフォルトの名無しさん
2008/03/08(土) 11:18:46冗談抜きで、buffer local variableってEmacs Lisp最大の特色だと思う。
あれのおかげで、動的なgeneric programmingの性格が濃いCLOSより、
Emacs Lispの方が原始的ながらオブジェクト指向の本筋に近くなっている。
0949デフォルトの名無しさん
2008/03/08(土) 11:53:54結構売れてるのかな。ということはScheme人口も多い?
0950デフォルトの名無しさん
2008/03/08(土) 11:55:35テキスト?動画?
0951デフォルトの名無しさん
2008/03/08(土) 12:07:510952811
2008/03/08(土) 14:39:52wilikiをそのままコピーしただけではgettextがうまく機能しないと思います。
(メッセージが英語のままだったりしませんか?)
そのへんを>>811,845では小細工して解決してるんですが、微妙にきれいな方法ではないです。
localeがへんなところにインストールされているのはそのためです。
今のGaucheではWindowsではgauche.configモジュールがちゃんと機能しないので、
何かと不便な感じではあります。
gauche-config.cをそのまま拡張モジュールとして使えるようにできればいいんですけどね。
0953デフォルトの名無しさん
2008/03/08(土) 18:17:360954デフォルトの名無しさん
2008/03/08(土) 18:28:440955デフォルトの名無しさん
2008/03/08(土) 18:34:150956841
2008/03/08(土) 23:02:07うん、たしかに英語のままだった。
shareの下に置いてgettextさせて読み込ませるのには一応成功した。
だけどoperaやfirefoxだとwiliki見ることが出来ないんだよね。
なんかまだ設定がおかしいのかな?
俺が使ってるAnhttpdが悪いのかもしれんが。
0957811(齊藤) ◆3.JjF77I26
2008/03/08(土) 23:54:23Windowsでは改行の問題がある。
詳しいことはここに書いてある。
http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aWishList#H-qawvzn
www.cgiモジュールをちょっと書き換えてあるので、
そこもコピーしてくれれば大丈夫だと思う。
0958841
2008/03/09(日) 00:22:08情報THXです。
0959デフォルトの名無しさん
2008/03/09(日) 00:31:12システム運用中にダイナミックにクラス定義を変更できる言語って
何がある?
# スレチだったら適当にルーティングしてほしい
0960デフォルトの名無しさん
2008/03/09(日) 00:40:44Scheme系のオブジェクト指向システム
その他はくだ質スレで。
0961デフォルトの名無しさん
2008/03/09(日) 00:42:11クラス定義の履歴を持つシステムをLispで開発していたような。
クラス定義だけじゃなくて、オブジェクトやスタックの履歴も全部w
0962デフォルトの名無しさん
2008/03/09(日) 01:33:50まぁ俺は何もしてないけど。
0963デフォルトの名無しさん
2008/03/09(日) 06:19:14ttp://user.ecc.u-tokyo.ac.jp/~tt076524/onlispjhtml/
0964デフォルトの名無しさん
2008/03/09(日) 10:36:20つttp://pc11.2ch.net/test/read.cgi/tech/1205021786/
0965デフォルトの名無しさん
2008/03/09(日) 15:14:15P153 下から4段目以降ですが何を云わんとしているのか分かりません。
Q.
Is there something else that changes about...(省略)
align関数への引数と再帰の使用に関して、変更するものは
他に何かありますか?
A.
Yes, there is ...(省略)
はい、あります。二番目の要素はより複雑になるが、
ペアの一番目の要素はもっと簡単になる。
Q.In what way ...(省略)
どういう方法を使えば一番目の要素は簡単になりますか?
A.It is only a part ...(省略)
元のペアの一番目の要素の一部を切り出すことによって。
(日本語が変ですが、P103 Sevens Commandment に従うという意味だと思います)
Q.Doesn't this mean ...(省略)
引数の長さを決定するlength*関数が間違っていることを意味
しませんか?(→意味不明)よりよい関数を見つけられますか?
A.あります。その関数は一番目の要素にもっと注意を払わなければいけない。
Q. How much ...(省略)
一番目の要素にどのくらい注意すべきですか?
A. At least twice as much
少なくとも二倍以上。(→意味不明)
この後weight*という新しい関数が紹介されますが意図がわかりません。
このくだりは、align関数がpartial functionかどうかを判断
するために存在しているはずですが、weight*関数導入後は最終的に
partial functionではないと結論づけられています。
みなさん、どのように理解されましたか?
0966デフォルトの名無しさん
2008/03/09(日) 20:15:040967デフォルトの名無しさん
2008/03/09(日) 20:18:40読んでるけど、書くほどのことがないんだよ。
0968デフォルトの名無しさん
2008/03/09(日) 20:25:25疑問に思うほどのことじゃないということですか?
length*とweight*のくだりはどう理解すればいいんですか?
0969デフォルトの名無しさん
2008/03/09(日) 22:29:120970デフォルトの名無しさん
2008/03/09(日) 23:18:23The seventh commandmentは、手続き型言語のループカウンターのように、再帰関数では何かを減らして逝くことでしょ。
>引数の長さを決定するlength*関数が間違っていることを意味 しませんか?(→意味不明)
それ誤訳。『length*関数が間違っているわけじゃないですよね?もっといい関数があるんですか?』という意味。
>元のペアの一番目の要素の一部を切り出すことによって。
>(日本語が変ですが、P103 Sevens Commandment に従うという意味だと思います)
これがThe seventh commandmentの言うようにgoalに向かって何かが減るように変更すること。このsimplerにする例がP.154のweight*。
>A. At least twice as much
>少なくとも二倍以上。(→意味不明)
P154のweight*をよく見ると、(× weight* (first pora)) 2)、というのがあって2倍している。
ネタばればけど、このように再帰関数では何かを減らして逝くことで計算がどこかで止まるようにする(The seventh commandment)。
そうでないものはPartial function。
The seventh commandmentの内容を突き詰めていくとP172のYコンビネータに行き着く。(コンビネータでのループ結合子)
あー説明下手でごめん。
0971デフォルトの名無しさん
2008/03/09(日) 23:40:51レスありがとうございます。
>P154のweight*をよく見ると、(× weight* (first pora)) 2)、というのがあって2倍している。
説明不足でした。意味不明と書いたのは、以下のとおりです。
何かを減らしていくことでgoalに近づくというのは理解できます。
ただ、align関数とは何の関係も無いと思えるweight*関数の説明を
持ち出すことが、align関数のtotal function性(無限ループにはならない関数)
の証明になっているのかがピンときません。
align関数の中でlength*関数やweight*関数を使っているわけではないので。
(もちろん、length*関数、weight*関数それぞれの動作は理解できます。)
0972デフォルトの名無しさん
2008/03/10(月) 00:23:03weight*関数で何故一番目のコンポーネントを二倍する
必要があるのかは分かっていません。
alignの再帰が進むにつれて何かが減っていくということを定量的に
示すためにweight*を持ち出しているとは予想できるのですが、
weight* pora
1 (a)
3 (a b)
5 (a (b c))
7 ((a b) c)
例えば((a b) c)にshiftを実行すると、(a (b c)) になる。
このときweight*は7から5に減る。つまりゴールに向かっている。
ということは感覚では分かるのですが、何故weight*という関数
なんだろうか?ということなんですよね。
0973デフォルトの名無しさん
2008/03/10(月) 00:27:46weight*はtotal functionになってるけど、alignとlength*はそうじゃない。どういう場合にtotal functionといえるのか?
それはもう少し先まで読んでみるとわかる。
>align関数のtotal function性(無限ループにはならない関数)
>の証明になっているのかがピンときません。
この本は発見的に自分で違いを見つけさせる方針だから証明はしてない。
alignはtotal functionになってないことを理解しよう。
そして先を読んでみると他のtotal functionにならない例が出てくる。
典型的な例を知っておくと計算が終了しないバグに対する免疫ができる。
それがこの辺のねらい。とにかく先に進んでみる。
0974デフォルトの名無しさん
2008/03/10(月) 00:46:38>必要があるのかは分かっていません。
一番目のコンポーネントがsimplerになっているかどうかを定量的に評価するため。
例えば2ではない数でやってみるとどうなるかやってみるといい。3とか5とか7ではどうか?
>alignの再帰が進むにつれて何かが減っていくということを定量的に
>示すためにweight*を持ち出しているとは予想できるのですが、
これについては予想で終わらせずに、実際計算してみるほうがいい。
length*のようなsimplerになっているかどうかの定量的評価と、
weight*のようなsimplerになっているかどうかの定量的評価では
どちらが再帰関数のThe seventh commandmentを確認できるか?
0975デフォルトの名無しさん
2008/03/10(月) 11:05:05>>973
alignはpartial functionではないと書いてあるのですが、これは
alignがtotal functionであるという意味ではないんんでしょうか?
length*もatomの数を必ず返してくるのでtotal functionだと思ってる
のですが。
>典型的な例を知っておくと計算が終了しないバグに対する免疫ができる。
>それがこの辺のねらい。
なるほど。先に進んで見ます。
>>974
alignのtotal性の判断を難しくしているのは(align (shift pora))の部分ということで
、ここを考察しているわけですよね。else節では、second poraに対してalignが
再帰していますが、ここはsecondを適用しているので必ず元のリストより小さくなります。
つまり The seventh commandmentを満たしているのでtotal性の条件を満たしている。
問題の(align (shift pora))については、poraの性質を考えるとshiftを適用していけば
いつかは(atom? pora)が真になるか(a-pair? (first pora))が偽になることは明白です。
つまり、total性が分かっているelse節がいつかは実行される。これを定量的に表すために
length*を導入しても判断できなかった。何故なら、poraにshiftを適用し続けると
一番目のコンポーネントは徐々に短くなっていくのに、length*はそれを考慮していない。
そこで、一番目のコンポーネントを2倍(2以上なら可)していく重みを付けることが
必要だったということかなと思えました。
0976デフォルトの名無しさん
2008/03/10(月) 13:55:53英文の意味がわからないので教えてください。
What if we didn't have (define ...)
anymore? Could we still define length.
(予想)define文を何も持たなかった場合はどうですか?
それでもlengthを定義できますか?
Without (define...) nothing, and especially
not the body of length, could refer to length.
ここがわかりません。
0977デフォルトの名無しさん
2008/03/10(月) 14:17:49予想はそれでいい。
> Without (define...)
defineがなければ、
> nothing could refer to length.
誰もlengthを参照することができない。
> and especially not the body of length
lengthのボディからさえ参照することができないのだ。
and以下はnothingに付けられた修飾節。
誰も参照することはできないし、
今特に問題にしている再帰的定義のための、
λ式本体からの自分自身への参照も出来ない。
0978デフォルトの名無しさん
2008/03/10(月) 15:53:43ご丁寧にありがとうございました。
nothingが主語だということを気づけませんでした。
and especially...の文節は、倒置されていますか?
つまり、the body of lengthが主語。
省略しないで書くと
(予想)
and especially the body of length (could) not (refer to) length
特にlengthのボディ(定義部)が、lengthを参照できない。
>今特に問題にしている再帰的定義のための、
>λ式本体からの自分自身への参照も出来ない。
結局、lengthを定義する際に、λ式にdefineで名前を与えてやらないと、
λ式本体(lambda文の定義部)で、無限にλ式がネストしてしまう、
つまり定義不可能と理解しました。
0979デフォルトの名無しさん
2008/03/10(月) 17:36:330980デフォルトの名無しさん
2008/03/10(月) 17:40:40ご教示ありがとうございました。
0981デフォルトの名無しさん
2008/03/10(月) 17:46:34順番に展開してみたところ、明らかに文法上不正にも
関わらず、その部分が実行されないかぎりエラーとは
みなされないようですが、Schemeはそういう文化なのでしょうか?
(C++のテンプレートにもSFINAEというルールがありますが)
;length(<=1)
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l))))))))
;展開 第一段階
((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))))
)
続く
0982デフォルトの名無しさん
2008/03/10(月) 17:58:06(lambda (l)
(cond
((null? l) 0) ; -----�@
(else (add1 (((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0) ; -----�A
(else (add1 ((mk-length eternity) (cdr l))))))) eternity) (cdr l)))))) ;-----�B
ここで、nullリストかatomを一つだけ持つリストを渡してやると、それぞれ
上に示しました�@、�Aで処理が終了するので、正しい長さである0と1が返って
きます。疑問はありません。
ただ、定義上与えてはいけない二つのatomを持つリスト '(a b) などを
渡した場合を考えると、�Bの部分が実行されることになりますが、
add1の引数にlambda関数を渡すことになるので、引数として数字を一つだけ
とる仕様のadd1関数の文法に違反します。nullリストかatomを一つだけ持つ
リストを渡している限り�Bの部分は評価されないので、それはOKということに
なるのでしょうか?
0983デフォルトの名無しさん
2008/03/10(月) 18:12:04>>981 >>982 はeternityを使ってるのでadd1の文法違反ではなく
リスト(a b)に対しては無限ループになります。
;length0
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l))))))))
;展開 第一段階
((lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l)))))))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l)))))))
)
0984デフォルトの名無しさん
2008/03/10(月) 18:12:42;展開 最終形
(lambda (l)
(cond
((null? l) 0)
(else (add1 ((lambda (mk-length) -----�B
(lambda (l)
(cond
((null? l) 0)
(else (add1 (mk-length (cdr l))))))) (cdr l))))))
本関数に atomを一つ持つリストを渡すと�Bの部分が評価されることになりますが
結果的に関数を渡すことになるためadd1の仕様に反し文法エラーになるはず。
nullリストだけを渡す限り�Bは実行されないのでエラーにはならず正しく0
が返ってきます。
0985デフォルトの名無しさん
2008/03/10(月) 20:15:35Y combinator の説明は展開が複雑すぎ。。
0986デフォルトの名無しさん
2008/03/10(月) 20:34:41λ式って本当におもしろい。
0987デフォルトの名無しさん
2008/03/10(月) 20:36:49Little Lisper には演習問題があるのでひとつ紹介しよう。
演習9.4:
With the Y-combinator we can reduce the number of arguments on which a function has to recur.
For example, member can be rewritten as:
(define member-Y
(lambda (a l)
((Y (lambda (recfun)
(lambda (l)
(cond
((null? l) nil)
(t (or
(eq? (car l) a)
(recfun (cdr l))))))))
l)))
Step through the application (member-Y a l) where a is x and l is (y x).
Rewrite the functions rember, insertR, and subst2 in a similar mannar.
0988デフォルトの名無しさん
2008/03/10(月) 20:40:090989デフォルトの名無しさん
2008/03/10(月) 20:43:30(Y
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1
(recfun (cdr l)))))))))
0990デフォルトの名無しさん
2008/03/10(月) 21:10:32In the chapter we have derived a Y-combinator that allows us to write recursive functions of one argument without using define.
Here is the Y-combinator for functions of two arguments:
(define Y2
(lambda (M)
((lambda (future)
(M (lambda (arg1 arg2)
((future future) arg1 arg2))))
(lambda (future)
(M (lambda (arg1 arg2)
((future future) arg1 arg2)))))))
Write the functions =, rempick, and pick using Y2.
Note: There is a version of (lambda ...) for defining a function of an arbitrary number of arguments, and an apply function for applying such a function to a list of arguments.
With this you can write a single Y-combinator for all functions.
0991デフォルトの名無しさん
2008/03/10(月) 21:25:05理屈を追っただけなので、まだ何がメリットなのかよくわからんです。
lengthならストレートに書いたほうが短くて全然わかりやすいし。
それとも普通の言語でいうアルゴリズム的存在で、
例えばスタックとかの理屈を理解したというレベルでしょうかね。
で、使っているうちにY-combinator自体がライブラリのような感覚
になっていって。。
気長にやります。
>>987
ありがとうございます。
やってみます。
0992デフォルトの名無しさん
2008/03/10(月) 21:26:58いただきます。
何で演習問題なくなってしまったんだろうか。
0993デフォルトの名無しさん
2008/03/10(月) 21:31:35>結局、lengthを定義する際に、λ式にdefineで名前を与えてやらないと、
>λ式本体(lambda文の定義部)で、無限にλ式がネストしてしまう、
>つまり定義不可能と理解しました。
ところが>>989をよくみるとY-combinatorのご利益がわかる。
これでdefineで名前空間を汚さなくて済むようになる。
0994デフォルトの名無しさん
2008/03/10(月) 21:36:49でも>>993で言ったように定義出来ることが確認できた。
>理屈を追っただけなので、まだ何がメリットなのかよくわからんです。
>lengthならストレートに書いたほうが短くて全然わかりやすいし。
もはや名前空間を汚さずに出来る。
コンビネーターの世界へようこそ!
0995デフォルトの名無しさん
2008/03/10(月) 21:39:470996デフォルトの名無しさん
2008/03/10(月) 21:41:17でもプログラムの中に毎回
(Y
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1
(recfun (cdr l))))))))
と記述するのは面倒です。インタラクティブに実行するときも
メンドイ。名前が無いととても扱いにくいです。
上の式自体にlengthって名前付けてしまうと、名前空間を汚さない
メリットが無いような。
0997デフォルトの名無しさん
2008/03/10(月) 21:42:33Daniel P. Friedman先生のHPにPSファイルがあります。
http://www.ccs.neu.edu/home/matthias/BTLS/
Exercises: TLL/3rdのリンクがそうかも。
0998デフォルトの名無しさん
2008/03/10(月) 21:46:56define名が無くても出来るってことですね。とは言っても名前空間を汚さない以外に
何かメリットはないものでしょうか、という疑問が。
修行します。
0999デフォルトの名無しさん
2008/03/10(月) 21:50:29(((lambda (M)
((lambda (future)
(M (lambda (arg)
((future future) arg))))
(lambda (future)
(M (lambda (arg)
(future future) arg))))))
(lambda (recfun)
(lambda (l)
(cond
((null? l) 0)
(t (add1 (recfun (cdr l))))))))
(quote (a b c)))
Whew, names may not be necessary, but they sure can be useful!
<<from Little Lisper P173>>
1000デフォルトの名無しさん
2008/03/10(月) 21:52:34Perhaps not after such a mind stretcher.
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。