Common Lisp, Scheme Part 14
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/11/18(金) 10:02:06Part1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part3: http://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part4: http://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part5: http://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part6: http://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part7: http://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part8: http://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part9: http://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part10: http://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part11: http://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part12: http://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part13: http://pc8.2ch.net/test/read.cgi/tech/1115901841/
0002デフォルトの名無しさん
2005/11/18(金) 10:03:26日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削ると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の入門サイト。
0003デフォルトの名無しさん
2005/11/18(金) 10:04:13http://buri.sfc.keio.ac.jp/lisp/menu.html
Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)
Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど
John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。
Association of Lisp Users
http://www.alu.org/alu/home
米国のLispユーザ会
0004デフォルトの名無しさん
2005/11/18(金) 10:04:59SICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。
計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/
SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/
0005デフォルトの名無しさん
2005/11/18(金) 10:05:49Schemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html
幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める
各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/
Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系
Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装
Cliki
http://www.cliki.net/index
CommonLispのプログラムがたくさん紹介されているのでここを当たるべし。
0006デフォルトの名無しさん
2005/11/18(金) 10:06:37http://www.isr.ist.utl.pt/library/docs/encycmuclopedia/doc/
cmucl以外でも有益なはず
CMUのLisp Repository
ftp://ftp.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/0.html
新旧様々なプログラムが置いてある
Tiny CLOS Tutorial
http://home.adelphi.edu/~sbloch/class/272/tclos/tutorial.shtml
Schemix
http://www.abstractnonsense.com/schemix/
Linuxのkernelへのパッチで、/dev/として扱えるTinyScheme
Bibliography of Scheme-related Research
http://library.readscheme.org/
Scheme関連の論文リンク集
0007デフォルトの名無しさん
2005/11/18(金) 10:15:34awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
ttp://www.accesscom.com/~darius/
Emacs Lisp 2
http://pc2.2ch.net/test/read.cgi/tech/1068467385/
* Hotdog Scheme http://rover.cs.nwu.edu/~scheme/
MS が金出してたみたい
* Bigloo http://www-sop.inria.fr/mimosa/fp/Bigloo/
CLR 用のコードを吐けるようになったらしい
継続
なんでも継続
ttp://www.shiro.dreamhost.com/scheme/docs/cont-j.html
Schemeへの道:継続
http://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/continuation.html
継続の使い方
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#continuation
継続の使用法
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/block.html
CPS(継続渡しスタイル)の説明
http://www.csl.sony.co.jp/person/masui/Forum/data/20011215023622/
Kahua: 継続ベースのアプリケーションサーバー
ttp://www.kahua.org/
0008デフォルトの名無しさん
2005/11/18(金) 10:18:06CLtL2: Common Lisp the Language 2nd edition
http://www-2.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html
CLHS: Common Lisp Hyper Spec
http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/FrontMatter/Chapter-Index.html
R5RS: Revised(5) Scheme(ja)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj.html
便利な情報リソース)
The Common Lisp Cookbook: いわゆる Cookbook
http://cl-cookbook.sourceforge.net/
小さい実装)
SECDR-Scheme: SECD machine model に基づく実装
ttp://lily.fan.gr.jp/~kmd/adhoc/view.rhtml?n=SECDR-Scheme_woyomu
Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz
TinyScheme: Minischeme を色々弄ったもの
http://tinyscheme.sourceforge.net/
KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
http://www.lispme.de/lispme/
0009デフォルトの名無しさん
2005/11/18(金) 10:20:35http://ruku.qp.tc/dat2ch/0403/01/1069594582.html
独習 Scheme 三週間
http://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-1.html
Schemeの教科書
よろずや
http://www.geocities.co.jp/SiliconValley-SanJose/7474/
lispの実用的な情報が色々。
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/
0010デフォルトの名無しさん
2005/11/18(金) 14:16:17どうでもいいけどなんでスレタイ"Common" Lisp, Schemeなの?
Lisp Schemeじゃだめなの?
ちょっと前までLisp Schemeだったよね。
Common付けないといけない理由でもできた?
あと>>7の
>CPS(継続渡しスタイル)の説明
>http://www.csl.sony.co.jp/person/masui/Forum/data/20011215023622/
が404になってた。
0011デフォルトの名無しさん
2005/11/18(金) 14:24:25Emacs Lisp とか xyzzy はスレ違いだと明示するためかな。
0012デフォルトの名無しさん
2005/11/18(金) 15:16:52そのページの内容はWilikiに転載されてます。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3aCPS
0013デフォルトの名無しさん
2005/11/18(金) 15:50:52そういうのはスレが立つ前、900 過ぎで言わないと。
前スレの 980 が言ってるように、981 過ぎたらスレが落ちる前に次スレを
立てるのが先決。それまでにテンプレ議論ができてないと前スレそのままに
なってもしょうがない。
0014デフォルトの名無しさん
2005/11/18(金) 23:00:330015デフォルトの名無しさん
2005/11/18(金) 23:31:22つまんない理由で
キャンセルしちゃった
残念
0016デフォルトの名無しさん
2005/11/19(土) 21:33:580017デフォルトの名無しさん
2005/11/19(土) 21:51:06結局どういう話だったの?
フランツのセミナー行った人詳報頼む。
0018デフォルトの名無しさん
2005/11/19(土) 22:33:110019デフォルトの名無しさん
2005/11/19(土) 22:34:09現在査読中。
発売は来年。値段は\4000-を超えないようにしたい。
0020デフォルトの名無しさん
2005/11/20(日) 02:39:30マクロ文字でシンボルに意味を持たせるという手もあるみたい。
http://lambda.s55.xrea.com/20040325.html
つか、このサイト Google から消えてるな?
0021デフォルトの名無しさん
2005/11/20(日) 11:46:50してくれるとよかったんだけど。XMLパーサとかjLinkerとかドキュメント読めば
書いてある内容をわざわざ改めて聴かされてもこちらとしては嬉しくないんだが。
あと両日とも会場が窮屈なのはどうにかならないのかなぁ。変な姿勢でスライド眺めてたら
首が痛くなっちゃったよ。
遠方からこのセミナーの為に自費で上京してくる学生さんとかが現れたのはあれかな、
Lispが年寄りの懐古趣味ではなくなりつつあるっていうことなのかな。
0022デフォルトの名無しさん
2005/11/20(日) 13:43:28懐古趣味だけどな。
0023デフォルトの名無しさん
2005/11/20(日) 15:02:06いってきたものです。昨年度同様資料は掲載予定とのこと。
** SemanticWeb
迷って新宿御苑一周して遅刻して逃した。翌日ネタにしてたくらいなので何かしゃべったはずだが、このため不明。
誰か知ってたら補完よろしく。
** Lisp とゲーム
子供向けゲーム開発プラットフォームを作った話。以降の OpenGL+SWIG とあわせて15分の
セッションなので超簡単に終わる。ものとしてはSqueakとかでデモってる子供から使える
ビジュアルプログラミング環境とかと似たようなもんなのかな。ベースエンジンは25KLOC,
40class 程の規模。Agent Cubes とかいう名前でオープンソース化予定。
このプラットフォームの一環としてOpenGL/GLUTや外部のフリーの物理演算ライブラリをACLから
使えるようにして、ゲーム記述のためのDSLを作った。SWIGがACLに対応したのでC/C++ライブラリを
簡単に組み込めるようになったとのこと。
libusbのSWIG化してるときにLisp/Scheme対応もやっとこうかと思ったんだけど、その時はどの実装向けにしたら
いいかよくわからんかったので、Lisp界はACLとGCLで大体カバーできて、できはACL>>>>GCLらしいとわかったのが収穫。
** On Lisp 翻訳
高校の時Lispに関心を持って、PaulGrahamのCL本の続刊OnLispが未訳なことを知って勉強をかねて翻訳に着手。
二年後2chでの協力などにより完成。CL本と違い、Macroの徹底応用本で、現在LispHackerな人の突っ込みを受けつつ
大幅改善+出版準備中。値段は<4000円予定。ちなみに、実は本人はあんまりLispでは書いてないらしい。
内容紹介の中ではMacroとMultimethodについて解説してた。Multimethodはトップレベルのレシーバが構成上ない
だけと思ってたので、レシーバを消滅させることで匿名のアドホックなクラスに対してメソッド定義できると
いうのはなるほどと思った(あまりに初心者ですまん。自分はLisp歴0年なんで)。
続く…(技術的に見てLisperな人にとっては既知の話が多かったと思う)
0024デフォルトの名無しさん
2005/11/25(金) 03:11:00例えば+をマクロと関数に分けて作って、
(+ 1 2 3 ...) という直接使用のときはマクロとして可能な限り簡約してしまい、
((if test + -) 1 2 3 ...) みたいなときは関数を選択、という風に使い分けたいのですが、
こういう文脈によって切り分ける事はできるでしょうか?
CommonLisp、Schemeどっちでもいいです。
(CommonLispのシンボルが変数と関数別スロットにあるように、)
マクロと関数が別スロットにあるような処理系ならできそうな気がしますが、
実際のところそういった処理系はあるでしょうか。
0025デフォルトの名無しさん
2005/11/25(金) 04:21:45つ http://www.ai.mit.edu/projects/iiip/doc/CommonLISP/HyperSpec/Body/sec_3-2-2-1.html
0026デフォルトの名無しさん
2005/11/25(金) 21:40:11ありがとうございます。
えーと、つまりそのリンクの説明によると、関数とマクロは切り分けられる
ということらしいのですが、
シンボルに対応するマクロ定義用スロットというのがどこか別に存在する、
という解釈で合ってますでしょうか?
第一引数を評価するときにmacroexpandフックが呼び出されるということは
そのフックの中でマクロシンボルの管理をしているということでしょうか。
0027デフォルトの名無しさん
2005/11/25(金) 22:17:32この特殊フォームの機能を成立させるには、正確にシンボルを置き換えるために
bodyで生成されるかもしれないフレームの変数について全て知っていないと
いけないはずで、そのためにはマクロで書かれた未知の構文に対応するために、
bodyのシーケンスに対してmacroexpandしていかなくてはいけない、
延いてはその処理系の変数生成フォームのパターンを全て把握している必要がある、
ということだと思うのですが、
やはりそういう複雑なことをやっているのでしょうか?
0028デフォルトの名無しさん
2005/11/26(土) 02:55:59LISP Scheme hierarchy図
http://dreamsongs.com/NewFiles/Hopl2Slides.pdf
0029デフォルトの名無しさん
2005/11/26(土) 03:27:08なかなか面白いね。
0030デフォルトの名無しさん
2005/11/26(土) 03:55:52つまりはシンボルマクロの名前がシャドウイングされたときの話?
逐次展開して行くってのはまあそれでいいし、
シャドウイングが発生するような式の中では
ちゃんと展開しないようにしなきゃいけないのも確かだけれど。
でもマクロ展開しちゃったら出てくるのはアトムか、
式だったら特殊形式か関数適用かなわけで、
しかもシャドウイングするような特殊形式の数なんて高が知れている気がするけれど。
少なくとも macrolet と比べてとりわけ複雑だとは思えないなあ。
0031デフォルトの名無しさん
2005/11/26(土) 06:54:37一般的に「関数とマクロは切り分けられる」って話じゃなくて、>>24 で
言ってたように「直接適用する時だけマクロみたいな処理をしたい」という
まさにその要求を実現するために、compiler-macroっていう特殊なマクロが
CLでは規格化されてるってこと。だからANSI準拠なCL処理系だったら 24 の
やりたいことはできるよ。
実装上はシンボルにfunctionスロットとcompiler-macroスロットを持っとく
のが素直だろうけど、そうではない実装だってあり得る。
0032デフォルトの名無しさん
2005/11/26(土) 08:10:24凄い調べようだな…
0033デフォルトの名無しさん
2005/11/26(土) 08:57:14ありがとうございます。
マクロとシンボルの関係について謎だったのですが、これで理解できた気がします。
マクロはシンボルの値として必ずしも参照できなくても良いみたいですね。
0034デフォルトの名無しさん
2005/11/26(土) 09:45:32話の筋としてはマクロは first class object じゃない、
つまり言語に於いて値となり得る対象ではないので
値として参照できちゃいけないといった方がいい。
マクロ定義・展開関数を、なにかタグをつけるとかして
関数スロットに突っ込んでおくような実装もあるだろうけれど、
というか xyzzy がそんな感じなんだけれど、
それが何かマクロ型とでもいうべき値として意味を持っているわけじゃない。
0035デフォルトの名無しさん
2005/11/26(土) 16:16:37Lispでは、ボトムアップスタイルでコードが
書ける、とよく言われておりますが、
イメージ的には関数を個別に書いてゆき
後でそれを統合し易いといったような
意味なのでしょうか?
0036デフォルトの名無しさん
2005/11/26(土) 17:17:31設計の時間を殆ど要しない。
ネックは実行速度のみ と 開発&コーディングスタイルの違いだけである。
頭悪いとできないかもしれんね。
0037デフォルトの名無しさん
2005/11/26(土) 17:22:20とりあえずプログラム数千行も書けばわかるよ。
素養のない人に説明するのは難しい。
0038デフォルトの名無しさん
2005/11/26(土) 18:22:530039デフォルトの名無しさん
2005/11/26(土) 22:17:490040デフォルトの名無しさん
2005/11/27(日) 02:19:07プロジェクトを回すだけのLisperを揃えるのが困難とか開発したプロダクトを
投げて保守させるのが困難とか、環境とか政治的な要因の方がネックだな。
0041デフォルトの名無しさん
2005/11/27(日) 02:30:36一度やってみたいなぁ。いつもLisperは俺一人か、良くてあと一人くらいだよ。orz
0042デフォルトの名無しさん
2005/11/27(日) 06:30:58> Lisperが揃ったプロジェクト!
> 一度やってみたいなぁ。いつもLisperは俺一人か、良くてあと一人くらいだよ。orz
履歴書と、職務経歴書もって、苫米地英人博士のコグニティリサーチラボ行ってみれば?
苫米地博士はCommonLisp大好きで、Lispハッカー募集してるから。
0043デフォルトの名無しさん
2005/11/27(日) 10:44:16一時期会社が傾いて、新規の技術者募集は今はやってないんでない?
0044デフォルトの名無しさん
2005/11/27(日) 11:44:570045デフォルトの名無しさん
2005/11/27(日) 13:53:59>投げて保守させるのが困難とか、環境とか政治的な要因の方がネックだな。
誰でも使える言語で一人で開発してる自分には無縁だな。
さらに、EVALに近い機能を使ってカリー化とかしてるし。
何の言語使おうが、生産性を1/10に下げて誰でも使えるようにするか、
そうでないかの違いな気がする。
0046デフォルトの名無しさん
2005/11/27(日) 13:58:48> >プロジェクトを回すだけのLisperを揃えるのが困難とか開発したプロダクトを
> >投げて保守させるのが困難とか、環境とか政治的な要因の方がネックだな。
>
> 誰でも使える言語で一人で開発してる自分には無縁だな。
> さらに、EVALに近い機能を使ってカリー化とかしてるし。
>
> 何の言語使おうが、生産性を1/10に下げて誰でも使えるようにするか、
> そうでないかの違いな気がする。
そこでMatz Lispですよ!(Rubyのことなので検索しないように)
誰でも使えるかどうかは…
0047デフォルトの名無しさん
2005/11/27(日) 14:00:27パフォーマンスが……
0048デフォルトの名無しさん
2005/11/27(日) 14:05:440049デフォルトの名無しさん
2005/11/27(日) 14:34:47言語なんか適材適所で使い分けるもんだと思っていたよ。
0050デフォルトの名無しさん
2005/11/27(日) 16:15:470051デフォルトの名無しさん
2005/11/27(日) 18:03:07RubyやJavaScriptはLisp方言だと思ってる。
0052デフォルトの名無しさん
2005/11/27(日) 18:10:41その言い回しはパラダイム論争になるわえ。
0053デフォルトの名無しさん
2005/11/27(日) 18:23:18プログラムを(文字列ではなく)リストとして扱えなくちゃLispとは呼べないだろ。
RubyやJavaScriptでできるんだっけ?
0054デフォルトの名無しさん
2005/11/27(日) 18:34:060055デフォルトの名無しさん
2005/11/27(日) 21:37:44んなことない。プログラムが S 式なのは Lisp のある方言群の特徴でしかない。
dynamic typing で call by reference な言語は全部 Lisp。
0056デフォルトの名無しさん
2005/11/27(日) 22:40:03リスト処理できなくてもLispなのか。おまえの友達は少ないだろうな。w
0057デフォルトの名無しさん
2005/11/27(日) 22:55:51私は>>55に賛成。
プログラムがオブジェクト(ラムダ)であることに意義があると考える。
その形がリストであることにこだわるのは意味的に重要でない。
0058デフォルトの名無しさん
2005/11/27(日) 23:00:16>>55 >>57 の言うような言語はスレ違い。どっか他でやってくれや。
0059デフォルトの名無しさん
2005/11/27(日) 23:00:490060デフォルトの名無しさん
2005/11/27(日) 23:01:310061デフォルトの名無しさん
2005/11/27(日) 23:22:300062デフォルトの名無しさん
2005/11/28(月) 00:15:140063デフォルトの名無しさん
2005/11/28(月) 00:34:090064デフォルトの名無しさん
2005/11/28(月) 02:27:43「プログラムをリストとして扱えること」は関係無いだろ
0065デフォルトの名無しさん
2005/11/28(月) 03:34:04実際CommonLISPは組み込みの特殊フォームが25程度で、
後は全て関数かマクロによるリスト処理で成り立ってる。
ただしリストじゃないとLISPのマクロのようなものが書けない、
ということではない、ということかな?
ほんとはシーケンスのような抽象化をしたいとこなんだけど、
たまたまリスト操作と「見なす」表現が理解に都合良かったということ。
中身が実はベクタだったりするLISPも実際あるだろう。
初心者や表層だけ見て判断する馬鹿には最初は単なる「リスト処理言語」としての
側面しか見えないかもしれないが、その側面はまさに初心者や馬鹿でも
わかるように設置した受け皿なので、それでかまわないのだろう。
0066デフォルトの名無しさん
2005/11/28(月) 03:43:030067デフォルトの名無しさん
2005/11/28(月) 04:04:36そう。無関係。
だけどそれら両方を備えている言語以外は一般にはLispとは呼ばない。
DylanやJavaScriptは「Lispと似た特徴を備えている」がLispではないでしょ?
0068デフォルトの名無しさん
2005/11/28(月) 20:09:32あくまでこれはイメージですが、
(hoge ムッチャ複雑な処理の中に
(poge まぁ複雑な処理の中に(moge 単純な処理))
(jo まぁ複雑な処理の中に(jojo 単純な処理)))
このようなLispのプログラムにおける
ボトムアップ開発とは
1.まず単純なmoge,jojoを作り
2.次にまぁ複雑なpoge,joを作り
3.最後にムッチャ複雑なhogeを完成させる。
ってことですよね?
カプセル化無しのスッポンポン。
確かに全体の透明性は高い、が一目では
何をやってるのかさっぱり分からんって
ことはないのでしょうか?
ことで…
0069デフォルトの名無しさん
2005/11/28(月) 20:37:23全然Lisp知らないでしょ。おはなしにならないよ。
0070デフォルトの名無しさん
2005/11/28(月) 20:43:50>>35じゃないですが。
それって、他の言語でも普通にできますよね?Lispとどう関係あるのかいまいちわからないです。
0071デフォルトの名無しさん
2005/11/28(月) 22:51:20>>70
他の言語でも出来るけど、mainとか何とか書かなきゃ実行もできない。
面倒っしょ?対話的環境最高。
そもそも単純な処理から複雑な処理を作るって何か違和感…
単純な処理の組み合わせにするんじゃね?
0072デフォルトの名無しさん
2005/11/28(月) 23:06:50Lispに戻ってくればわかる。
0073デフォルトの名無しさん
2005/11/28(月) 23:15:54シーケンスとか言っても
(map (lambda (x) (* 2 x)) (cons 3 (make-array 10 1)))
=> (3 . [2 2 2 2 2 2 2 2 2 2])
とかできないんじゃ意味ないし。
リストこそが抽象である。
0074デフォルトの名無しさん
2005/11/28(月) 23:56:11それは思考停止というものだよ。
確かにリストの形に抽象化されたスタイルは素晴らしいものだが、
逆に言えばそれはリストでしかないということだ。
0075デフォルトの名無しさん
2005/11/29(火) 00:03:53万能と抽象は違うと思うが。
(vector 1 (vector 1 (vector 1)))
これはまさしくリストの構造だ。
0076デフォルトの名無しさん
2005/11/29(火) 00:08:30オブジェクト指向的な言い方をすれば、先にクラスを設計しなくても、必要に
応じてメソッドをぽちぽち作っていけば、気が付いたらクラス(的なもの)が
出来ているって感じだな。
0077デフォルトの名無しさん
2005/11/29(火) 05:20:47インスタンスベースのオブジェクト指向言語に対して
それではあんましメリット無いような…
javascriptとかrubyとかでも出来るんじゃないの?
もっとlispらしい話を!
というとデータ構造と制御構造がリストと渾然一体なことと
マクロとかマクロとかマクロとかしかないのかな…
#個人的にはそれで十分というかそれこそが全てなんですけど
短くてわかりやすい例を示したいといつも思っているんだけど
なんか表現力がたらんくていつも挫折。orz
0078デフォルトの名無しさん
2005/11/29(火) 06:21:30car cdr consとかでやってると、データの並び順が変わったとき、car cdrとかやってる部分は全部書き換えになっちゃうんじゃない?その辺がlispって面倒そうなイメージなんですが、どうやって回避するんですか?
>>71
なるほど。mainを書かないでいいのは楽チンでいいですね。コンパイルとかも、関数単位でできるみたいですし。只、lispだけじゃないですが、うっかり既にある関数を上書きしてしまいそうなのが恐いイメージがあります。
0079デフォルトの名無しさん
2005/11/29(火) 06:42:31ラッパ書けばいいんじゃない?
あるいはハッシュとかdefstractとかdefclassとか。
0080デフォルトの名無しさん
2005/11/29(火) 07:13:14言ってみれば構文木を first class object として扱えるところかなあ。
他の言語の eval だと大抵受け取るのがパース前の文字列なんで、
それを使ってごにょごにょしようとした場合構文木をいじるんじゃなくて
文字列・ソースコードをいじることになるのが面倒くさい。
マクロも同じで、文字列→文字列変換だと、無いよりはいいかもしれないけれど、
lisp のマクロと比べてあんまり魅力的ではない。
まあ、そこはどうにか構文木を直に触れるようになったとしても、
構文木オブジェクト周りで内部表現と外部表現が齟齬をきたす可能性が高い気がする。
つまりソースコードを read して print したら何が表示されるか、
という話で、lisp であるなら元の S 式が表示されるわけだけれど。
そこで表示されるのは構文木の外部表現なのか、元のソースコードなのか。
或いは構文木を write して read したらどうなるのか。
そこで read/write Invariance は保障するのは S 式を採用しないと結構面倒そう。
個人的には read と eval が分かれていて、
read/write Invariance が保障されるなら別にリストじゃなくてもいいかなあとは思う。
ただ、せっかく手軽に切ったり貼ったりできるのにリストじゃなくする理由もあんまりない気がする。
リストって言うか cons,car,cdr で弄れる対象と言った方がいいか。
内部的に対になったメモリ領域じゃなくて匿名関数でもいいけれど、
そりゃ効率が悪い、という話でしかない。
措いてしかし、構文木の内部表現がベクタで、なおかつそれをいじることを前提とした言語であったら、
ベクタを弄り回すライブラリが充実していることだろうから、あまり問題にならないかもしれない。
scheme の syntax-rules みたいなパターンマッチベースのマクロだったら
それなりに他の言語でも上手くいく可能性はあるかもなあと思わなくもないけれど。
少なくとも symbol 型のデータ型は必要になるんじゃないかなあ。
識別子が first class object じゃないと困るって言うか。
0081デフォルトの名無しさん
2005/11/29(火) 07:14:350082デフォルトの名無しさん
2005/11/29(火) 09:38:08本当に複雑な問題っていうのは、まず (hoge ムッチャ複雑な処理)
の中身をどうすべきか、っていうのが事前にわからない。
問題の本質自体が見えていない。そこが出発点。
とりあえず手元には生のデータがある。その生のデータをいじくりながら、
まず問題を記述するための単語にあたるパターンを見つけ出す。もちろん
最初はそれが正しいかどうかはわからないが、仮説を立てて、生データを
単語にまとめるルーチンを書いてみる。それがmogeやjojo。
その単語を色々組み立てて、問題を記述できる句が構成できないどうかを
調べてみる。句できたらそれを色々組み合わせて文ができないか調べてみる。
その途中で、最初のパターン化が間違ってたことがわかり、下に戻る
こともある。ときには、多少間違っていてもそれを使って無理矢理全体を
組んで様子を見てみると、どこがおかしいかわかる場合もある。そうやって
粘土をこねたりLegoを組み立てるみたいに作っていくと、最後に
「(hoge ムッチャ複雑な処理の中に
(poge まぁ複雑な処理の中に(moge 単純な処理))
(jo まぁ複雑な処理の中に(jojo 単純な処理)))」
と書けば問題がきちんと記述できることがわかる。これがわかれば後は簡単だ。
君の言うように、どんな言語にだって落とせる。もっともこれが分かった時点で
Lispの場合は既に動くプログラムが手元にあるわけだが。
まあ、大抵はこのあとリファクタリングして整理してゆくがね。
君は、答えが分かった後どうするかって話をしている。難しいのはその前だ。
0083デフォルトの名無しさん
2005/11/29(火) 10:30:030084デフォルトの名無しさん
2005/11/29(火) 21:03:03懇切丁寧なる解説<−深謝。
いよいよLispらしいことを伺いますが、
))) このカッコのネストは人間にとって、どこまでの
深さが理解出来る限度なのでしょうか?
ワインバーグがPL/Iの例ですがプログラマに
とって基本は三段まで、五段以上は理解不能と
書いています。
ところがLispの場合,setqで関数内部を隠蔽するのを
良しとしない気風?もあってか))))))六段〜七段!
なんて普通に見かけますよね?
(まぁインデント無しで読むのはチト苦しいが…)
Lisperの素質ってネストにどれだけ耐えられるか?
もっと言えば、頭がよじれそうな複雑なネスト構造に
「被虐的な快感!」を覚えるかどうか、
これがポイントでは?
0085デフォルトの名無しさん
2005/11/29(火) 21:11:56> もっと言えば、頭がよじれそうな複雑なネスト構造に
> 「被虐的な快感!」を覚えるかどうか、
> これがポイントでは?
実際に読むのには全く使っていない。
書き方に作法があるので支援環境で組まれたソースを読むのは
pythonと同じスタックしかいらない。(基本はぶら下げで全部表現)
0086デフォルトの名無しさん
2005/11/29(火) 21:14:51並みよりは深いネストに耐えなきゃなんないが、
画面の幅を超えるほどの深さになることはまれ。
要するに問題の深さを抑えられるかどうかがポイント。
つまり、効率的に分割できる能力のこと。
0087デフォルトの名無しさん
2005/11/29(火) 21:40:03Webに転がっているコードを良く見るとわかるが、
開き括弧'('がネストしているケースはそれほどないはずだ。
Lisperがコードを読むときはリスト先頭の名前と
インデントの仕方で判断してると思ってよい。
名前で始まらないリストが現れる場合は何かの構文の中か、
インライン関数の呼び出しぐらいしかない。
Lisperでも
((lambda (a b c) body) x y z)
より
(let ((a x)(b y)(c z)) body)
の様に名前が先頭にある方が読みやすいと考えている。
また、Lispはコードがデータであるが故、
専用エディタが無くてもコードをreadしてpretty printすることで
適切にインデントされたコードを得ることができ、
そのインデント具合から間違いがわかったりする。
0088デフォルトの名無しさん
2005/11/29(火) 21:46:16開き括弧とその直後とインデントで、全体の「かたち」は9割くらい把握できません?
0089デフォルトの名無しさん
2005/11/29(火) 21:47:59[
[
[
[
0090デフォルトの名無しさん
2005/11/30(水) 00:02:42S式単位での編集に慣れたら括弧がない言語の編集がめんどくさくてかなわん。
0091デフォルトの名無しさん
2005/11/30(水) 00:13:34カッコは(特に閉じカッコは)見えなくなるよ。
意識の上ではまさに>>89のような感じ。
009291
2005/11/30(水) 00:42:191関数が長すぎるのもリファクタリング不足って気がする。
高階関数とマクロでいくらでも短くできるはず。
0093デフォルトの名無しさん
2005/11/30(水) 00:42:59Emacs様をちゃんと使いこなしてますか。
0094デフォルトの名無しさん
2005/11/30(水) 00:54:19. . . only try to realize the truth.
Neo: What truth?
Spoon Boy: There is no list.
Neo: There is no list?
Spoon Boy: Then you'll see that it is not the list that bends; it is
only yourself.
0095デフォルトの名無しさん
2005/11/30(水) 01:40:39dabbrevに慣れたせいで別のエディタやIDE(Javaとか使うとき)が使えません。
0096デフォルトの名無しさん
2005/11/30(水) 17:02:47一定だそうです。WEBの発展とプログラマの
増加を考えれば相対的には減少傾向にあります。
しかしながら、少なくとも、このLisp言語には
逆風のなかでも、「しつこく」Lisperは存在する
訳です。この「極」東、日本にさえ…
何故か?
やはり(((())))の魅力にはまるのではないで
しょうか?
それ以外にもう、他の言語に対して差異化するもの
は何もない、と言い切って過言ではないからです。
ネストによる複雑さは初心者にとって確かにLispへの
障壁かもしれませんが、逆に言えばLispに残された
唯一の魅力なんです。
異様な(((())))が気にならない、これこそ既に
Lispにはまっている証ではないでしょうか?
スタック構造って本来、人間の記憶機能に最も近い。
(何とか(何とか(何とか 最後に)))
この(カッコを越えるたびに頭脳負荷がかかりますよね?
各々の機能を理解してスタックに積みこんで行く訳ですから。
解放されるのは)))の後でしかない。
これを楽だって言っちゃ駄目なんです。
この頭脳負荷そのものが快感なんだって言わなければ。
0097デフォルトの名無しさん
2005/11/30(水) 17:19:280098デフォルトの名無しさん
2005/11/30(水) 17:27:02ところで、
LispWorksって結構評判良さげ?
Personal Editionを使用された
経験のある方ぁ!
道誉?
0099デフォルトの名無しさん
2005/11/30(水) 21:50:37> 一定だそうです。
> WEBの発展とプログラマの
> 増加を考えれば相対的には減少傾向にあります。
> しかしながら、少なくとも、このLisp言語には
> 逆風のなかでも、「しつこく」Lisperは存在する
> 訳です。この「極」東、日本にさえ…
> 何故か?
> やはり(((())))の魅力にはまるのではないで
> しょうか?
> ************************************************************
> それ以外にもう、他の言語に対して差異化するもの
> は何もない、と言い切って過言ではないからです。
> ************************************************************
0100デフォルトの名無しさん
2005/11/30(水) 21:51:25> ネストによる複雑さは初心者にとって確かにLispへの
> 障壁かもしれませんが、逆に言えばLispに残された
> 唯一の魅力なんです。
> ************************************************************
> 異様な(((())))が気にならない、これこそ既に
> Lispにはまっている証ではないでしょうか?
> ************************************************************
> スタック構造って本来、人間の記憶機能に最も近い。
> ************************************************************
> (何とか(何とか(何とか 最後に)))
> この(カッコを越えるたびに頭脳負荷がかかりますよね?
> 各々の機能を理解してスタックに積みこんで行く訳ですから。
> 解放されるのは)))の後でしかない。
> これを楽だって言っちゃ駄目なんです。
> この頭脳負荷そのものが快感なんだって言わなければ。
0101デフォルトの名無しさん
2005/11/30(水) 22:11:37書いてしばらくして気付いた。
関数でいいのにマクロがいっぱい...。
0102デフォルトの名無しさん
2005/11/30(水) 22:49:29詳しく
0103デフォルトの名無しさん
2005/12/01(木) 15:23:32簡単なスクリプト
と言い切ってしまう101は天才
0104デフォルトの名無しさん
2005/12/01(木) 16:40:29何があるのでしょうか?
0105デフォルトの名無しさん
2005/12/01(木) 17:19:22>そうやって
>粘土をこねたりLegoを組み立てるみたいに作っていくと、最後に
>「(hoge ムッチャ複雑な処理の中に
>(poge まぁ複雑な処理の中に(moge 単純な処理))
>(jo まぁ複雑な処理の中に(jojo 単純な処理)))」
>と書けば問題がきちんと記述できることがわかる。
どうなんでしょう?これをもっと敷衍すると
pogeやjoから作り始めるのがLisp流の開発
スタイルかと。
まずアイデアはpogeから考え始める。そして
(moge 単純な処理)を考えてモリッとpogeの中に
注入するイメージで組み込んで行く。
どんどんモリッ、モリッてpogeの機能が具体化し
拡大すると同時に発想が膨らむ。
そこで並行するjoが生まれる。それもモリッ、モリッて
関数を注入して膨らます。
そこである瞬間、統合するイメージが湧く訳です。
で、今度はマルッて全体をhogeが閉包する。
またさらに、それをマルッて包含するhoが生まれるかも。
ポイントはモリッの下方関数注入とマルッの上位関数閉包で、
その都度当初のpogeやjo自体が変質変容するところです。
またこのようにコーディングが進むにつれて、
全体プログラムや構想自体もダイナミックに
変質変容を繰り返しますよね?
勿論、この発生順は不定です。
ただ変質変容だけが本質かと。
それは「決して簡単でも単純でもない。極めて頭脳負荷の
高い作業」です。
が、面白い。ってところでしょうか。
0106デフォルトの名無しさん
2005/12/01(木) 19:29:580107デフォルトの名無しさん
2005/12/01(木) 19:31:390108デフォルトの名無しさん
2005/12/01(木) 20:12:360109デフォルトの名無しさん
2005/12/01(木) 22:11:14必要ならば。
0110デフォルトの名無しさん
2005/12/01(木) 22:17:570111デフォルトの名無しさん
2005/12/01(木) 22:17:59最適化の基本だね。
0112デフォルトの名無しさん
2005/12/01(木) 22:58:00それ以上最適化をしたがらないオレはヘタレorz
0113デフォルトの名無しさん
2005/12/02(金) 11:29:320114デフォルトの名無しさん
2005/12/03(土) 12:38:48CLOSって使い物になるの?
たとえ同じパッケージの中でも、他のクラスで引数の数が違う
メソッドが定義されていないかなんて気にしたくないんだけど。
0115デフォルトの名無しさん
2005/12/03(土) 12:48:560116デフォルトの名無しさん
2005/12/03(土) 13:04:34自分にとってなってるの?
どうにか使えるだけじゃなく、快適で柔軟だと思える?
複数の引数でディスパッチできることと引き換えに
他のクラスのメソッドの名前を気にするのって割に合わない気がする。
gaucheなら全然そんな制限ないのに。
仕事とかでCLOS使ってる人はどう思ってるんだろう。
もっと制限の緩いオブジェクトシステムの移植性のある実装とか無い?
なんであんなのが標準なんだ。
0117デフォルトの名無しさん
2005/12/03(土) 14:22:50ものの考え方が違うから。
0118デフォルトの名無しさん
2005/12/03(土) 14:29:59考え方が馴染めないなら、普通の OO 言語使ったほうがいいよ。Java とかとは
設計方針がかなり違うから「メソッドはオブジェクトに属する」みたいな考え
を切り替えて設計しないとそう思うだろうね。
オブジェクトシステム自体はいろいろあるけど、標準でもなくサポートもない
のは仕事ではちょっと使えないな…
0119デフォルトの名無しさん
2005/12/03(土) 14:38:07そういう意味ではCLOSには隠蔽機構も欠けている。
「普通の」オブジェクト指向言語風に使いたいのであれば「クラス」ごとに
パッケージを分けるという方法もある。ここでの「クラス」は隠蔽単位で
あって、CLOSのclassと一致する必要はない。つまり、より自由度が高い
と考えることもできる。
要するに「普通の」オブジェクト指向言語は置いといて、よりCLOS的な発想
でクラスやパッケージのデザインをやりなおすのが吉。
0120デフォルトの名無しさん
2005/12/03(土) 15:15:42わかってるんじゃない? CLOSの、同じジェネリックファンクションに
属するメソッドのlambda listが合同じゃないとだめって制限に
ついて言ってるんでしょ。TinyCLOS派生のstklos, gauche,
goops (guile) なんかはそういう制限が無いし。
個人的には、メソッドのシグネチャを変えてreloadした時に
エラーが出るのがうざいけど、不自由だと思ったことはないなあ。
もともと名前をあんまり覚えられないたちなんで、ジェネリック
ファンクションがやるべきことを名前を見ただけでわかるように
特徴的につけてるから、全然関係ないメソッドの名前が偶然
重なっちゃうってことはほとんどない。
でも、何でそういう制限があるのかは不思議。
0121デフォルトの名無しさん
2005/12/03(土) 15:29:150122デフォルトの名無しさん
2005/12/03(土) 15:35:10generic functionを機能としては理解していてもCLOSとしてはわかってなさげ、
という話だと思うが。
0123120
2005/12/03(土) 17:35:22そうなのか? なら俺もCLOSわかってないなあ。
この制限があって嬉しいことって何?
確かにAMOPに書かれているように実装したらそういう制限が必要そうだけど、
それって実装上の制限であって、言語としてのメリットじゃないような気がする。
0124114
2005/12/03(土) 17:50:46実際、仕事で使ってるような人が気になってるか、なってないかを知りたかった。
CLOSみたいな制限があると、機能的に、メソッドがクラスに属している言語の
スーパーセットとしてみなすことはできないじゃない。
(hoge (x <A>))を書いてるときに、全然関係ない(hoge (x <B>) y)の
ことなんか考えたくない。存在する可能性すら気にしたくない。
>>119
だからパッケージに分けるのがめんどくさいときの話をしてんの。
あるいは一つの複雑な問題を解くために、いくつかのクラスが必要で、
しかし、パッケージ外にさらしたいインタフェースは単純にしたい場合、
そういうクラスは一つのパッケージに詰め込みたいことが多いと思う。
そのなかで、(hoge x)と(hoge x y)を共存させたかったら、
結局、片方を書くためにもう片方を意識させられる分けで・・・
まあ、120が言うように、まれだろうとは思うけど。
>>119>>122
そのCLOS的な発送とやらを教えてくれ。
その方針に従えば、名前付けるときに悩まなくてすむわけか?
たいていのメソッドは動詞+目的語みたいなシンプルな名前を付けて
来たけど、なんだか、関係ないメソッドが被っちゃって、
不自然だけどパッケージ分けるか、A-hoge B-hogeみたいな名前つけるか、
どうにか別の同意語をこね繰り出すか?仕様書で使ってる用語と違うけど。
みたいなことを後からしないといけなくなるような、
そういう手間を回避できるノウハウがあるなら教えて欲しい。
0125デフォルトの名無しさん
2005/12/03(土) 18:14:41まぁそんなにムキになりなさんな。w
(hoge x) と (hoge x y) はそもそも操作の対象は違えども同じ意味の操作である
はずなので、あまりそういうことが起きないのかもしれないという気がしてきた。
CLOSに慣れてるとhogeにあまり一般的な名前を使わない癖は付くかもしれん。
別の言い方をすると、オーバーライドの意味でgenericは使うけど、オーバーロード
の意味ではあまり使わない(別の名前を付ける)って感じかな。
0126デフォルトの名無しさん
2005/12/03(土) 20:12:02言いたい事はわかってるって。だから考え方を切り替える必要があるってゆっ
てるじゃん。CLOS ではインターフェースが凄く重視される。クラス毎に同じ名
前のメソッドが違う仕様というわけにはいかない。逆にマルチメソッドディス
パッチを利用したシンプルなインターフェースが要求される。C++/Java からき
た時は最初とまどったけどね。切り替えができれば同じメソッドなのに異なる
インターフェースがある事なんか考えたくないってーか。
> CLOSみたいな制限
> メソッドがクラスに属している言語のスーパーセット
> (hoge x)と(hoge x y)を共存
このへんからは多分、CLOS に合わない人だろうなとは思う。
総称関数という考え方での設計ができてない。
0127デフォルトの名無しさん
2005/12/03(土) 20:35:50結局、そうなの?でもSchemeでは使えるよね。
結構、Common LisperとSchemerではスタイル違ったりするのかな。
0128デフォルトの名無しさん
2005/12/03(土) 21:07:01具体的にどんなプログラムでどんな設計をしてるわけ?
0129デフォルトの名無しさん
2005/12/03(土) 23:16:43つまりオブジェクト・セントリックなOOPモデルでメソッドで名前空間
がクラスごとに分割されていることの代替機構だとしか認識できないから
114みたいに思うんだろう。
でもこういう認識ってのは、わかってない人、特に自分で頭を切り替える
つもりのない人に2chで何万言費してもわかってもらえる望みは薄い。
それが出来る人は、114みたいにすぐに他罰的な結論に飛び付くことなく、
まずモデルの違いやその理由を把握すべく知識を増やしたりするから。
0130デフォルトの名無しさん
2005/12/03(土) 23:52:49少しは役に立つこと書ける奴がこう述べるならいいんだけどさ。
0131デフォルトの名無しさん
2005/12/04(日) 01:40:020132デフォルトの名無しさん
2005/12/04(日) 01:59:33してるし、もはや見たいものしか見えないんだろうね…
0133デフォルトの名無しさん
2005/12/04(日) 07:58:15cl 使ってる人たちが皆 120 みたいならどうしようもないな
0134デフォルトの名無しさん
2005/12/04(日) 08:11:41パッケージで隠蔽っていうのはものすごく辛くないか。
一つのモジュールになっているものをパッケージにして隠蔽するのは簡単だけど
二つの関係あるクラス同士を連係させつつ名前を分離したりするのはどうするんだ。
lisp 最近はじめたんだけど、正直使ってる人はどうやってるのか知りたい。
0135デフォルトの名無しさん
2005/12/04(日) 08:15:20仕様がなぜそうなったかという辺りは知らないけど、
単にCLOSの制限が嫌だと言うなら、それを直接使っていく必要性もない。
例えば可変個の引数を扱いたいならば、&restを使って引数の数から
該当するメソッドへディスパッチを行う宣言や構文でも追加すればいい。
ディスパッチをコンパイルタイムで解決する工夫をすれば効率も変わらない。
とりあえずLispでJavaなどの機能を実現したいという事なら、まずは
意味的に同じになるようにシステムを構築した上で試行すべきじゃないかな。
Lispではそれが可能なんだし。
違う概念を無理に既成の物へ当てはめようとして、それがダメだった、
とここで癇癪起こされても、それはただの白痴だろう。
もうちょっと広い視野を持ったり、理知的に考えてみたらどうだろうか。
0136デフォルトの名無しさん
2005/12/04(日) 08:51:24Lispのいいところは、言語による不条理な制限がもとからほとんど無いため、
他の言語だと制限を回避するために手間をかけなきゃならないところを
ストレートに書けるところだと思ってる。だから>>135の主張には同意できない。
CLOSの仕様の制限が言語の自由度と表現力を増しているという説得力のある
議論がない限り、その仕様は「非Lisp的」だと感じるな。
完璧な仕様なんて無いから、仕様に穴があること自体をとやかく言うつもりは
ないけれど、「これは仕様の穴なんじゃない?」って意見に対して「それは
こういうまっとうな理由があるんだよ」と答える代わりに発言者の考えを
とやかく言うのは健全ではない。
ちなみに俺個人の体験では、メソッドの必須引数を変えて再読み込みした
場合に、必須引数の数が違うメソッドが残っているとはまることがある
(ちょっといい具体例が出せないけれど、例えば foo ((a string) &rest z)
があって、後で foo ((a string) (b string)) に変えた時に、
(foo "abc" 3) がエラーになると思い込んでたら古い定義に捕まってた、とか)
だからインタフェースを変えた時にリセットしてくれるのは有難いかな。
0137デフォルトの名無しさん
2005/12/04(日) 09:37:28UNIXとかX Window Systemが主流になれなかったのと同じで、
柔軟に作ったとしてもかえって複雑になりすぎて誰も使{わ|え}なくなった。
CLOSを全て把握して使うのが得なのか、それとも1から自分に合った
オブジェクト指向システムを構築するのが良いのか、お前ら判断できないだろ。
GLSもJavaに逃げちゃったし。
結論:
CLOSは不条理でできています。
0138デフォルトの名無しさん
2005/12/04(日) 11:14:550139デフォルトの名無しさん
2005/12/04(日) 11:38:48その論調だとCLOSを全てLISPで置き換えても成り立ちそうだな。
LISPにとって今風でないことはどうでもいいことだし、LISPから柔軟性を取ったら何が残らないじゃん。
だからその論調は、少なくともLISPスレでは違うんじゃないの?
0140デフォルトの名無しさん
2005/12/04(日) 11:45:04>LISPにとって今風でないことはどうでもいいことだし
そんなことないだろ。
今風と言ったら、前から出てきてるメソッドがクラスにぶら下がる
シングルメソッドディスパッチ方式なんじゃね?
CLOS視点でのオブジェクト指向設計という側面はかなり古臭いものと思うが。
これはLISP自体の概念とはまた別のものだよ。
0141デフォルトの名無しさん
2005/12/04(日) 11:50:140142140
2005/12/04(日) 12:08:52S式で記述したものと見なすことができる。
以下の式をLISPに変換するとして
object.a.b.c(1 2);
この各演算子をS式の構文木として素直に変換するなら
(method-call (member-ref (member-ref object :a) :b) :c 1 2)
のようになると思う。
これをCLOSの流儀に従って
(c (slot-ref (slot-ref object :a) :b) 1 2)
というように、cを総称関数としてわざわざ定義する必然性は無い。
むしろcは単にメソッド呼び出しである、という標識があれば良いので、
前者と同様にslot-refと同じ形式でmethod-callを定義しても良いだろう。
こういった流儀ならば114からの流れで出てきた制限はなくなるかもしれない。
0143デフォルトの名無しさん
2005/12/04(日) 13:08:57別に (method-call (member-ref (member-ref object :a) :b) :c 1 2)
の流儀にしなくても>>114の言う制限はなくせると思う。
gauche ではなくなってるでしょ?
0144140
2005/12/04(日) 13:22:33俺が言いたいのはCLOSもgeneric-functionもあってかまわないが、
今風のOO設計もできた方が良いはずだということ。
今風とは>>119で出てきた「「普通の」オブジェクト指向言語」
で実現されている事がまさにそれだと言える。
するとCLOSは普通ではないということになる。
これを古臭いと表現した。
CLOSが一般的だった時代もあったのかもしれないが、
もはや外の常識は引っ繰り返っている。
119は「CLOS的な発想〜やりなおすのが吉。」と言っているが、
吉とは限らない。
そもそもCLOS的な発想とは何か?119は説明できるだろうか?
ほとんどの人間はCLOS的な発想をしろと言ったところで、
異質である、時代を退行しているかもしれない、他でつぶしが利かない
と判断した時点で学習を止め、より主流の言語へ流れて行くだろう。
これではCLOSのグルーは育たない。
グルーを集めるには、今風のデザインを追いかけていき、
より魅力的な物にしていく流れみたいなものが必要だろう。
CLOSを捨てるのも選択枝に入るかもしれない。
今風のデザインを用意しておけば、少なくとも他のOO言語の
経験者であればとっつきやすいと感じるだろうし、
今風のOO設計手法について共通の話題にも参加することができる。
LISPのOOはCLOSだからと盲目的にCLOSを薦めるのは
止めるべきじゃないかと思う。
0145デフォルトの名無しさん
2005/12/04(日) 13:35:54メソッドがオブジェクトに属するべきだ、という考え方をやめろってことじゃない?
144は、メソッドがオブジェクトに属さなきゃいけない言語を使ってて、
違和感を感じることはない?
0146デフォルトの名無しさん
2005/12/04(日) 13:38:38別に最初CLOSみたいなオブジェクト指向があって、それが発展してSmalltalk的なオブジェクト指向になったというわけではない。
両者は別々に生れたもので、どっちが古いとか新しいとかじゃないよ。
0147140
2005/12/04(日) 14:00:28>〜をやめろってことじゃない?
これの言い回しの意図が不明だけど
今風の考え方で素直に理解できるデザインにした方が
混乱が少ないですよ、CLOSに固執するメリットは不明ですよ、
としか言えない。
違和感については、今風の思考をしていれば全くないんじゃないかと。
ただ、CLOSの考え方の押し付けは、
あまり実にならない気がするなあ、といった所。
>146
>別に〜なったというわけではない。
そんな話はしてないよ。
単にこれだけCLOS、CLOSと話がされているからには
CLOSが流行した時代でもあるのかと思っただけ。
歴史的価値があったかどうかより、
今それがほんとに有効なのかどうか、
再度考えた方が良いんじゃないの、と言う事。
0148114
2005/12/04(日) 14:06:28俺はgeneric functionではなく変な制限のあるCLOSが嫌なだけだけど。
>>128
特に何も。単にCLOSを使い込んでる人がどう思ってるのか知りたいだけ。
>>132
ずっと2chに貼り付いてすぐにレスするのは無理。
>>135
前半と同じようなことは少し考えたことがある。
「CLOSを使い続けるしかない状況」で折り合いを付けるひとつの方法として。
でも、それって結局CLOSの世話のために考慮したり労力を割くってことでしょ?
>>136
restって書いてるけど、それは制限の緩いSchemeの方ではまったってこと?
Common Lispみたいな制限があったほうが間違いが少なくなる例ってことでいいのかな。
そういうはまり方をするのはgeneric functionとrest引数という概念の
相性の悪さがでてる気がする。
単一のリストを渡すか、可変長引数にするかっていう選択の余地があるところが
裏目にでてるんじゃないかな。
それは他の関数型言語には無いものだよね。
generic functionの引数を可変長にするとはまりやすい・・・なんて法則は無いのかな?
0149デフォルトの名無しさん
2005/12/04(日) 14:25:48汎用なオーバロードが便利なのは同意するけど、単なるシンタックスシュガーでしょ。
極端な話、メソッド名はクラス名をプレフィックスするなりして一意にすればいい。
generic functionはあくまでポリモーフィズムを実現するために存在する気がする。
genericを高機能化する方向へ行けば、最終的にはfunctionとgenericの統合だろう
し、そういう言語も面白いとは思う。だけど、それはCommon Lispではないよね。
0150145
2005/12/04(日) 14:44:53>> 〜をやめろってことじゃない?
> これの言い回しの意図が不明だけど
これは
> CLOS的な発想とは何か?
の話ね。
これが全部じゃないけど。
> 違和感
シミュレーションか何かで「磁石と鉄がくっつく」を表現したいとき、
「くっつく」メソッドは磁石と鉄とどちらに属するべきか、とか。
addメソッドは数値オブジェクトに属するべきなのか?とか。
0151デフォルトの名無しさん
2005/12/04(日) 14:56:52なんで原型にこだわるのかわからない。
マクロ嫌いですか?
0152デフォルトの名無しさん
2005/12/04(日) 16:22:09やっぱり、こういう疑問は「メソッドがクラスに属してる」って考えから
抜け出せてないんだろうと思う。
それは、“普通の”言語からLispに移った時にやった考え方のシフトを
もう一度してくださいってことなんじゃないかと。
もっというと、引数の数とかを変えたいって言うのは、それはJavaとかの
シンタックスシュガーにどっぷり寄りかかっているだけで、Java的にも、
あんまり引数をガラっと変えるならメソッド名を変えるべきじゃないかと
思うけど(一部の、本当に汎用的な、半分言語仕様になってるようなメソッドは
除く)。Javaではデフォルト引数が使えないから、そのためにオーバーロードを
使うべきかと。
(例えば、この引数は必要なければnullでいいよ、とか)
なんかJavaの話になったけど、つまり、引数をガラっと変えたいなら
メソッド名を変えれば良いし、多少省略したいなら&optionalを使えば?
ってこと。
0153114
2005/12/04(日) 16:25:53俺もそれしか無い気がしたが、Common Lisperの間でそういうスタイルが
一般的だとかいう話は聞いたことがないので。
あと、一番俺にとって重要なのはタイプするのが面倒だとかいうくだらないこと。
>>151
マクロがあるからLispに興味あるんだが、
ありふれたことをするのにも、例えば、大抵の問題を扱うのに
メッセージ伝達モデルのほうがタイプ量減るからといって、
マイ言語の世界に突入しなきゃならんのはどうかと。
共通プロトコルが安定してないとJavaみたいな大規模なライブラリなんて
作れないでしょ。
総称関数で書かれたライブラリと
メッセージ伝達モデルのオブジェクトシステムで書かれたライブラリが
平気で混在してるのがある意味、理想的な状況にも思えるけど、どうかな?
そんなのおぞましいって思うかな?
0154152
2005/12/04(日) 16:46:45パッケージ内で偶然バッティングするケースもあると思うけど、
「同じパッケージ内でも気にしたくない」ってのは、ちょっと
どうかと思うけど。気にしろよ、とか思う。
ってか、プログラマが「気にできる」範囲に分割するのがパッケージの
役割なんだから、「気にしたくない」なら、さらに分割すべき
だけど、その制限が「仕様として」どうか、ときかれれば、まぁ、
ちょっと恣意的な制限ではあると思う。
0155149
2005/12/04(日) 19:08:31だから>>149で「メソッド名はクラス名をプレフィックスするなりして一意に」という
のはあくまで「極端な話」だってばさ。基本的には>>152氏も言っているように
同じ名称のメソッドは対象となるクラスが異なっても同じ機能を持つはずであって
同じパターンで引数を取るはずであるというのが設計思想の根底にあると思う。
あとは昔のbit別冊に載ってた記憶があるが効率の問題もあるかもしれん。
0156デフォルトの名無しさん
2005/12/04(日) 21:44:51メッセージという特定のクラス系統に特定の意味を持つものにgenericな
名前をつけてしまうのがオブジェクト・セントリックな世界から頭を
切り替えられない人の敗因。
C++やJavaのメソッドの名前というのはあくまである対象固有の操作に
つける名前であるから、その一面を切り取って命名しているに過ぎない
(または名前がもつ意味の一面しかその操作が表していないとも言える)。
だから対象となる系統が変われば同じ名前の操作でも引数の数から何から
変わるということがおこりえる。それはメリットでもあれば統一した意味論で
全てのクラスを語れないというデメリットでもある。
generic functionは例えばC++のコンテナでpush_backというメンバ関数の
形式と意味論が共通に約束されているとか(イテレータの++や*演算子もそうだ)、
Ruby方面でいうduck typingに近い。
だから特定のクラス系統にのみ意味を持つものなら、それ相応に特定的な動詞が
思い付かないならそれを示すプレフィクスを付けるのが一番安全。
でなきゃパッケージで区切る。
あくまでbruteにメッセージ形式を持ち込みたいなら、メッセージと対応する処理を
定義するマクロを作って、あとはメッセージをsendする関数を作ってしまうのが
いいんじゃないか。
全体で合意できるのはレシーバとなる第一引数の存在くらいしかないのだろうから。
個人的にはC++にも(最近ではJava方面も?)Generic Programmingという概念は
入っているだろうに、なぜそっちからLispにくる人はそれを理解の一助とせず
無視するのかが理解に苦しむところ。
0157デフォルトの名無しさん
2005/12/04(日) 21:48:46> 入っているだろうに、なぜそっちからLispにくる人はそれを理解の一助とせず
> 無視するのかが理解に苦しむところ。
自分もC++やJavaからLispに入ってきた人なのだった。
なぜ114のような文句垂れる人は、にしておこう。
0158デフォルトの名無しさん
2005/12/04(日) 23:46:20>だから特定のクラス系統にのみ意味を持つものなら、それ相応に特定的な動詞が
>思い付かないならそれを示すプレフィクスを付けるのが一番安全。
それじゃCに逆戻りなんだよね……名前空間の便利さを知ると、とてもじゃないけど
やってらんない。関連性の高い関数とオブジェクトはセットで管理したいですな。
LISPでも名前空間の実装無いの?
0159デフォルトの名無しさん
2005/12/05(月) 00:15:11その引用部分の直後に書いてあるけど、パッケージ。
0160デフォルトの名無しさん
2005/12/05(月) 00:18:03だから、そのためのパッケージだべさ。
0161デフォルトの名無しさん
2005/12/05(月) 00:26:14(defun hoge (&rest args) ...)
で受けて手動ディスパッチすりゃいいんじゃねーの?
処理系によっては defmethod するより typecase で分岐の方が速かったりするし。
0162デフォルトの名無しさん
2005/12/05(月) 01:03:32で、それを実装してみればいいじゃないか。
0163158
2005/12/05(月) 01:40:41なるほど。
パッケージの名前解決ってどんな感じ?(C++みたいに)引数の型の定義に近い
メソッドを検索して持ってくるの?それともやっぱりパッケージ名で修飾しないとダメ?
0164デフォルトの名無しさん
2005/12/05(月) 02:30:38>入っているだろうに、なぜそっちからLispにくる人はそれを理解の一助とせず
>無視するのかが理解に苦しむところ。
そんなの簡単。そっちも理解できないから。
そして自分の頭に既にある図面(しかも半端な)にあてはめることでしかものを理解できない・しようとしないわけさ。
0165デフォルトの名無しさん
2005/12/05(月) 02:37:52あるんだが、BOOSTとか見ると何であんな複雑怪奇なことをしてGeneric Programmingに
取り組んでいるのか理解に苦しむ。素直にLisp/Scheme使えばいいのに・・・
アレは理解できない・というよりしたくない。エラーメッセージもわけわからんし、
修正→コンパイル→デバッグのサイクルに費やす時間が異常に長いしで不毛なことこの上なし。
0166デフォルトの名無しさん
2005/12/05(月) 03:40:22確かに boost の lambda は笑った。すべてをコンパイル時にやろうという
C++ の執念は凄いが、実用性は?だよね。
0167デフォルトの名無しさん
2005/12/05(月) 10:04:030168デフォルトの名無しさん
2005/12/05(月) 11:55:300169デフォルトの名無しさん
2005/12/05(月) 16:38:190170デフォルトの名無しさん
2005/12/05(月) 17:40:020171114
2005/12/05(月) 21:41:42>>だから特定のクラス系統にのみ意味を持つものなら、それ相応に特定的な動詞が
>>思い付かないならそれを示すプレフィクスを付けるのが一番安全。
>>でなきゃパッケージで区切る。
だから、そうするしかないねえ、という話をすぐ上でしている。
そして、俺はそれすら 面倒 だという下らない話をしてるんだよ。
タイプ量が増えるからな。
CLOSのモデルに合わせてプログラムを書けないなんて話は
俺の最初の書き込み以降、誰一人していない。
逆にgeneric functionも必要/有用だと認める意見が多かった気がするがな。
ただ、多重ディスパッチを必要としないプログラムを書いてる限り、それは
タイプ量と考慮すべきことを増やすだけで、それが他のOO言語に慣れた人間には
納得のいくトレードオフに思えないことは結構多いんじゃないか?
そもそも、Gaucheに無い制限を持つCLOSの話題から始まったことも忘れるなよ。
RubyやPythonから今のオブジェクトシステムを除いて、
CLOSだけを加えたらどうなるか考えてみろよ。
俺の普段の仕事には多重ディスパッチなんかより、
Rubyみたいな属性アクセスの抽象化と実際のアクセスを
少ないタイプ量で(マイ言語の世界も構築せずに)できる機能のほうが全然重要だったりする。
っつーか、たまにそういう要求に出会ったら、それこそ
自分でディスパッチの仕組みを作ったっていいんじゃないかと思ったりもする。
そういう場合、対象の集合が持つ性質は多分、かなり予期・コントロールできると想像する。
つまり、その集合、その問題に特化したディスパッチシステムを作るのは容易な可能性が高い。
だけど、無引数のget-hogeを定義したあとで、なんらかのキーを引数に要求する
get-hogeを継承関係にすらない異クラスに追加したくならないか、
なんて予期できないんだよ。
0172114
2005/12/05(月) 21:42:56統計的情報(?)を聞けた時点で、ほとんど満足なわけだが、156みたいなアホがいるから
反論したくなる。
メッセージ伝達モデルを欲しがる人間をあからさまに馬鹿にする態度が気に食わない。
CLOSなんて唯のライブラリでLispの本質じゃないのにさ。
Paul Grahamのエッセイを読んでみろよ。
クロージャ詰め込んだハッシュなんて、まんまメッセージのレシーバじゃないか。
0173デフォルトの名無しさん
2005/12/05(月) 21:46:02ごめんね。暇になったら必ず読むよ。
0174デフォルトの名無しさん
2005/12/05(月) 22:51:00あんまり重要じゃないところに突っ込むけどさ、Paul Grahamも、
Common Lispが、"タイプ量"的にまずいってことは認めてるし、
まぁ、欠点は欠点として認めるとして、
タイプ量をケチるなら、それなりのエディタを使うとか、
そもそもCommonLispは使わないとか、そういう方向になるんじゃ
ないのかな?
タイプ量からCLOS批判するのは少し納得がいかない希ガス。
0175デフォルトの名無しさん
2005/12/05(月) 23:55:51dispatch だけだったら CLOS なしでも大差ないだろ。
それとも optimize とかが何か違うのか。
0176デフォルトの名無しさん
2005/12/05(月) 23:59:47>>114、>>116 あたりの自分の態度を見直したほうがいいよ…。
同じ Gauche 使ってる身としては、Common な人々は心が広いなーと思た。
残念だろうけど、どっちかというとアホなのは 156 じゃなくて 114 だと思うよ…
0177デフォルトの名無しさん
2005/12/06(火) 00:28:03http://www.functionalobjects.com/resources/beyond-java.phtml
0178デフォルトの名無しさん
2005/12/06(火) 01:17:37自分のやり方が実現できないと文句言ってるだけの人だったね。
Haskellは変数を破壊的に変更できないから使い物にならん、というのと同レベル。
ついでにいうとgeneric functionのlambda listが合同なのはgeneric function
っつーくらいだから本来当たり前の話で、
Tiny CLOSでlambda listが違っても使えるってのの方が単なる余録。
0179158
2005/12/06(火) 02:26:00いくらパッケージで分割できるつうても、自動的に名前解決してくれないんだったら
プリフィックスと同じで不便なことには変わりないなぁ。
というか、おまいら名前空間・generic programming・メッセージングその他もろもろを
ごっちゃにしとらんか?傍目からは疑似問題起こしとるような気がしてならんが……
0180デフォルトの名無しさん
2005/12/06(火) 03:02:09156を理解せずにかろうじて食いつけるところだけ食いついてみた
という感じだけど、元々理解できてないから完全に見当外れ。
だからコメントもつかない、つまり相手にされてない。
0181デフォルトの名無しさん
2005/12/06(火) 05:35:510182デフォルトの名無しさん
2005/12/06(火) 05:59:260183デフォルトの名無しさん
2005/12/06(火) 06:48:14ttp://user.ecc.u-tokyo.ac.jp/~t50473/onlispjhtml/packages.html
検索くらいしる。
・Lispの型は値に、C++の型は変数名にくっついている
・CLOSのgenricは実行時、C++のgenericはコンパイル時にメソッドが選ばれる
・CLOSのmethodはオブジェクトに属さない
この辺ちゃんと理解してる?
0184デフォルトの名無しさん
2005/12/06(火) 08:14:38レシーバを規定する method は鎖で繋がれたペットみたいなイメージ。
0185デフォルトの名無しさん
2005/12/06(火) 20:26:20使ってたのを思い出して、ググってみたら今でもあるんですね。
ttp://www.yuasa.kuis.kyoto-u.ac.jp/~komiya/tus_intro.html
UNIX版を落として使ってみたら、テラナツカス
ちょっと遅いけど、いろんなプラットフォームで動くし、
エディタついてるし、お勉強用には良いかも。
tusとかmtusとか、cmtusとかstusとか作れるみたいだけど
違いはなんだろ?
0186デフォルトの名無しさん
2005/12/08(木) 10:57:59しれないという話。
http://www.rubyist.net/~matz/20051205.html#p02
0187デフォルトの名無しさん
2005/12/08(木) 11:13:420188デフォルトの名無しさん
2005/12/08(木) 11:14:31Lisperから見ると、良い点の大半を捨てたように見えるんだけどな。
0189デフォルトの名無しさん
2005/12/08(木) 11:38:16かけ離れすぎてて無理があると思う。
Lispにない利点もあり、Lisperにも(どの言語にもあるような機能の範囲では)
ストレス少ないので、
more acceptable (かつ、いくつかの面ではmore comfortable) than Lisp
ではあると思う。
関数型的な利用にはあんまり向かないよね。
思考の枠組みとしてはLispより狭いけど、まあそれで十分なことも多い。
0190デフォルトの名無しさん
2005/12/08(木) 23:24:14…と思ったけどmatz氏が良い指摘をしてるね。
一般人(悪い意味じゃないよ)ってのは抽象化になれてないんだろうな。
0191デフォルトの名無しさん
2005/12/09(金) 06:10:21アルゴリズムの抽象化なんかは関数型言語をやったりLispを使い慣れたりしないと、
あまり理解できないか、少しわかっても難しく感じるだけで
有り難みやかっこよさを感じるところまでいかないと思う。
せいぜい高階関数いいね、止まりじゃないかな。
0192デフォルトの名無しさん
2005/12/09(金) 06:14:09先の見えない世界が延々と続いているような恐ろしいものを想像してる人が
たまにいるが、それは違うと思う。
0193デフォルトの名無しさん
2005/12/09(金) 06:53:070194デフォルトの名無しさん
2005/12/09(金) 10:11:000195デフォルトの名無しさん
2005/12/09(金) 10:25:020196デフォルトの名無しさん
2005/12/09(金) 23:04:24Lisperにとっても誰にとっても抽象的なものってのは
難しいものだと思う。
だけど、一旦分かると格好良い!とか美しい!
と思うのがLisperや数学好きな奴だな。
0197デフォルトの名無しさん
2005/12/09(金) 23:23:30少なくて楽なんだよね。Perlなんて一見楽そうだけど、覚えておかなきゃいけないこと、
注意しなくちゃいけないことが不規則に多すぎて神経衰弱しちゃう。
0198デフォルトの名無しさん
2005/12/10(土) 00:45:140199デフォルトの名無しさん
2005/12/10(土) 14:11:550200デフォルトの名無しさん
2005/12/11(日) 06:03:27…
以下、何事もなかったよーにLispの話題ドゾー↓
0201デフォルトの名無しさん
2005/12/11(日) 14:59:41(foo)
r)
を楽に書けるマクロってあったりする?
0202デフォルトの名無しさん
2005/12/11(日) 15:05:220203デフォルトの名無しさん
2005/12/11(日) 15:12:450204デフォルトの名無しさん
2005/12/11(日) 15:22:330205デフォルトの名無しさん
2005/12/11(日) 19:39:50現状が素晴らしく思えてきます。
0206デフォルトの名無しさん
2005/12/12(月) 03:11:35SBCL on Windows
進展があったみたい
0207デフォルトの名無しさん
2005/12/13(火) 00:33:56で、どうやって動かすんだい?
C:\sbcl-win32-0.9.6-binaries>sbcl
fatal error encountered in SBCL pid 4032:
can't find core file
coreファイルあるのに読んでくれないや。
と思ったら
環境変数SBCL_HOMEを設定したら動いたよ
set SBCL_HOME=C:\sbcl-win32-0.9.6-binaries\
C:\sbcl-win32-0.9.6-binaries>sbcl
This is SBCL 0.9.6, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
os_map: 3, 0x1000, 01000000, 0x1000.
os_map: 3, 0x2000, 05000000, 0x1000.
os_map: 3, 0x3000, 09000000, 0x17ce000.
Your Kitten of Death awaits!
*
これでいいのかい?
0208デフォルトの名無しさん
2005/12/13(火) 01:00:27sbcl --core sbcl.coreで逝けたよ
すげー
ちょー速い
こりゃネイティブコンパイルだね
Windowsでこんだけ速いのってフリーじゃなくね?
0209デフォルトの名無しさん
2005/12/13(火) 23:33:33以前(ずっと昔)このスレで速さ比べが載ってて
CLISPのコンパイル後より
Petie Chez Scheme のVMが速いとあったが
SBCL ON Windows には足元にも及ばないぞ。
シェル上で動いてる、って事はVMじゃないのか?
0210デフォルトの名無しさん
2005/12/14(水) 01:01:40JITじゃね? と、いいかげんなことを言ってみるテスト。
0211デフォルトの名無しさん
2005/12/14(水) 01:14:490212デフォルトの名無しさん
2005/12/14(水) 05:47:04http://www.sbcl.org/manual/Compiler-only-Implementation.html
0213デフォルトの名無しさん
2005/12/14(水) 06:37:06今までは実行せずに「リスト遊び」と「SICP」を読んでただけ。
で、「コマンドライン引数に指定されたファイルを印字する」スクリプト
書いてみた。(関数名変かもしれんが気にしないでくれ)
(define ret_data (lambda (fname)
(port->string-list (open-input-file fname))))
(define print_forlist
(lambda (x)
(if (not (null? x))
(and
(print (car x))
(print_forlist (cdr x))
))))
(define main
(lambda (env)
(if (not (null? (cdr env)))
(and
(print_forlist (ret_data (car (cdr env))))
(main (cdr env))
))))
gauche使いな偉い人達はどういう風に書くの?
0214デフォルトの名無しさん
2005/12/14(水) 07:00:41(for-each (lambda (f)
(call-with-input-file f
(lambda (p)
(display (port->string p)))))
(cdr args))
0)
かな?
0215デフォルトの名無しさん
2005/12/14(水) 07:02:51(define (print-file f) (print (file->string f)))
(define (main args) (for-each print-file args))
0216213
2005/12/14(水) 07:15:55す すげー
displayとかfile.utilとか気になりまくりだ
さっそく調べてみよう。ありがとう。
0217215
2005/12/14(水) 08:09:52これは
(define (main args) (for-each print-file (cdr args)))
か。すまそ。
0218デフォルトの名無しさん
2005/12/14(水) 08:28:560219デフォルトの名無しさん
2005/12/14(水) 09:23:29(define (main args)
(for-each (cut file-filter copy-port :input <>)
(cdr args))
0)
0220デフォルトの名無しさん
2005/12/14(水) 14:46:080221デフォルトの名無しさん
2005/12/14(水) 16:48:560222デフォルトの名無しさん
2005/12/14(水) 17:30:090223デフォルトの名無しさん
2005/12/14(水) 18:10:46こんなの決まってたんだね。
ttp://members.at.infoseek.co.jp/zzyyb/srfi/ja/srfi-22/srfi-22.html
#!は先頭行以外では別の意味に使っていいのかな。
0224デフォルトの名無しさん
2005/12/16(金) 01:09:16叩き台をGaucheに含めると書いてあったと思うのですが、該当するコードが含まれて
いるのはどのリリースですか?CVS HEADも覗いているのですが見当たらないので
ご存知の方いましたら教えて下さい。
0225デフォルトの名無しさん
2005/12/16(金) 01:15:59Gauche-devel-jp ML あたりで聞くほうが良いと思う。
0226デフォルトの名無しさん
2005/12/22(木) 08:27:26これが 300 系統で最初の正式リリースってことになるのかな。
win 版だと msvcr71.dll が必要になるそうなので注意。
http://download.plt-scheme.org/drscheme/
0227& ◆Q5hc3/kNG.
2005/12/23(金) 07:41:44DrScheme(PLT)のエディタで書いて、
Petite Chez で動かすのが一番かな?
・・・OSがWindowsですから。
0228デフォルトの名無しさん
2005/12/23(金) 08:32:57(define a '(1 + 2))
として、
((car (cdr a)) 1 2)
として、3 が出力されるようにしたいのですが、(quote +) を
primitive の+に変換する方法はありますか?
little schemer のソースでは、全部 cond でスイッチケースしてた
んだけど・・・
0229デフォルトの名無しさん
2005/12/23(金) 08:49:540231デフォルトの名無しさん
2005/12/23(金) 20:07:33実用面ではどんな風に応用されてるのかさぱーりわからん
0232デフォルトの名無しさん
2005/12/23(金) 20:29:380233デフォルトの名無しさん
2005/12/23(金) 21:42:59たまには意味あるんじゃないか?
名前空間を汚さずにラムダ式だけで計算できるから
実例は知らないけど…
0234デフォルトの名無しさん
2005/12/23(金) 22:51:17for-eachとかcall-with-*とかに再帰的な手続きを渡せたりとか。
0235デフォルトの名無しさん
2005/12/24(土) 04:58:280236デフォルトの名無しさん
2005/12/24(土) 12:45:41コンパイラ作る時に使うとか
0237デフォルトの名無しさん
2005/12/25(日) 02:45:47ちょwwwww LISPwwwww
0238デフォルトの名無しさん
2005/12/25(日) 03:19:10何を表現してるのかさっぱりわからんwwwww
0239デフォルトの名無しさん
2005/12/25(日) 12:52:44ここの2.6に書いてある、ダイナミックヒープ中の一時的なビットベクタを使う
とはどういう意味なんでしょうか。
どこがマークされたか保存しておいて、スイープの時に照し合わせるんでしょうか?
だとしたら滅茶苦茶時間かかると思うんですけど。
リストにネイティブなポインタを使うと下位2ビットしか使えないんですが
そこをGCのフラグに使うのが一般的なんでしょうか?
それともポインタの代わりに配列のインデックスを使った方がいいんでしょうか?
これのやり方がいまいち良く分かりません。
0240デフォルトの名無しさん
2005/12/25(日) 13:12:05dirtyになるから、incremental gcとかが面倒にならんかな。
まあ、write barrierの実装方法にもよるし、ケースバイケースだね。
0241デフォルトの名無しさん
2005/12/25(日) 21:45:08とりあえずBASICは前科者
あとFORTRANは怒らせないほうがいい
0242デフォルトの名無しさん
2005/12/25(日) 22:11:06src/store.c読め。
markBitという変数がビットベクタ。
わざわざLispMeのソース持ってきて調べちゃったじゃないか。
ちなみにセルはインデックスになっていた。
これのメリットはフラグビットが多く取れる事、永続化する際に
アドレス変換しなくて良い(そのままfwrite/fread可)といった点。
0243デフォルトの名無しさん
2005/12/25(日) 23:22:53読まずに質問してすいません。
マークビットにインデックスで直接アクセスするので、余計な時間はかからないんですね。
フラグビットが多く取れることやダンプが簡単なことはとっても魅力的なんですけど
メモリの無駄が多いことと、いっぱいになったときに reallocするのが重そうなので
なんだかためらってしまいます。
reallocしない方法も考えられますが、生きてるセルの間が大きくなったりしたら
困る気がします。
0244デフォルトの名無しさん
2005/12/25(日) 23:30:150245デフォルトの名無しさん
2005/12/25(日) 23:43:29それは Palmの場合ですよね。
LispMeではヒープのサイズは固定ですが、一般にはヒープサイズを可変にした方が
いいと思ったので。
言葉足らずですいません。
0246デフォルトの名無しさん
2005/12/30(金) 06:23:00http://www.kohgakusha.co.jp/books/detail/4-7775-1180-4
0247デフォルトの名無しさん
2005/12/30(金) 13:45:12あってない)人の入門向けってとこかな。高校生くらいには丁度いいのかも。
まぁ、せっかくここまで揃えた Lisp 本コレクションが欠けるのも悔しいので
買ってしまうんだけどね…。
0248デフォルトの名無しさん
2005/12/30(金) 18:50:02「計算機科学の方面では『λ算法』とかいうものがあると聞きますが、
詳しいことは筆者もよく知りません」
という記述はどうかと思いました。
0249デフォルトの名無しさん
2005/12/30(金) 18:57:45計算モデルを知らなくても使えるからいいじゃん。
無意味にしったかぶりするよりは好印象。
0250デフォルトの名無しさん
2005/12/30(金) 22:46:190251デフォルトの名無しさん
2005/12/31(土) 01:51:57あそこパソ通時代のノリそのままの半可通本が多いわけだし
0252デフォルトの名無しさん
2005/12/31(土) 09:59:500253デフォルトの名無しさん
2005/12/31(土) 10:58:520254デフォルトの名無しさん
2005/12/31(土) 12:41:460255デフォルトの名無しさん
2005/12/31(土) 13:28:20トボトボ
0256デフォルトの名無しさん
2005/12/31(土) 15:05:05「無知の知」という言葉もある。
知らないことを自覚しているのはただ知らないよりもマシではあるまいか。
無論、知っている方がよりよいが。
0257253
2005/12/31(土) 15:27:33今検索して初めて知った。
0258デフォルトの名無しさん
2005/12/31(土) 15:28:320259デフォルトの名無しさん
2005/12/31(土) 15:34:170260デフォルトの名無しさん
2005/12/31(土) 17:29:130261デフォルトの名無しさん
2005/12/31(土) 22:30:19# ま、数学基礎論専攻だったので知ってるのは当たり前なんですが
0262デフォルトの名無しさん
2005/12/31(土) 23:05:56そんな事はどうでも良いから、Lisp の話題を振ってくれ。
0263デフォルトの名無しさん
2005/12/31(土) 23:24:400264デフォルトの名無しさん
2005/12/31(土) 23:56:350265デフォルトの名無しさん
2006/01/01(日) 00:42:310266デフォルトの名無しさん
2006/01/01(日) 01:23:58けどがんがってほしい.原理主義者ではない俺は気にしない.
0268デフォルトの名無しさん
2006/01/01(日) 11:53:300270デフォルトの名無しさん
2006/01/01(日) 14:14:36そりゃ「名前くらいなら聞いたことが」って人間は大半だろうがその数学的な概念をきちんと理解している人間が
どれくらいいるってんだよ。
0271デフォルトの名無しさん
2006/01/01(日) 15:17:36ここもレベルが下がったな。
0273デフォルトの名無しさん
2006/01/01(日) 15:50:13http://en.wikipedia.org/wiki/Lisp_programming_language
http://en.wikipedia.org/wiki/Scheme_programming_language
http://en.wikipedia.org/wiki/Programming_paradigm
http://en.wikipedia.org/wiki/Foundations_of_mathematics
http://en.wikipedia.org/wiki/Lambda_calculus
0274 【小吉】 【988円】
2006/01/01(日) 16:28:23ム板でも指折りの高レベルスレ
0275デフォルトの名無しさん
2006/01/01(日) 17:23:18一応わかっている(つもりの者)だが、
Lisp Scheme のどの辺の知識を知るのに
わかっていないとありえないとおっしゃるのかな
0276デフォルトの名無しさん
2006/01/02(月) 03:23:53(car . ((quote . ((20 . (10 . NIL)) . NIL)) . NIL))
これを評価する場合、
→(quote . ((20 . (10 . NIL)) . NIL))
→(20 . (10 . NIL))
ときて、なぜ
→((20 . (10 . NIL)) . nil)
となって
答え:(20 . (10 . NIL))
にならないんですか?
??(・∀・)何か勘違いしてる...?
0277デフォルトの名無しさん
2006/01/02(月) 03:37:11どういう式を評価してみたのか、自分が入力したものをそのまま載せてみ。
0278276
2006/01/02(月) 03:50:46(car . ((quote . ((20 . (10 . NIL)) . NIL)) . NIL))
これです
(car '(20 10))
これをドット対に直してみて
(car . ((quote . ((20 . (10 . NIL)) . NIL)) . NIL))
となったんですけど
頭で考えると>>276で書いた手順で答えが
(20 . (10 . NIL))
になっちゃうんですけど実際に評価してみると
20
となります。
根本的なところで勘違いしてる悪寒です。。。
0279!omikuji !dama
2006/01/02(月) 04:15:51最初に言っておくと、評価プロセスを学ぶ上では、
データ構造としてのリストのドット対表記は使う意味が無い。
(car '(20 10)) を順に辿っていくと、
まず評価のはじめとして、関数とその引数が全て評価される。
特殊形式のquoteもこの時に取れる。
car => #<function car>
'(20 10) => (20 10)
#<function car>とは、シンボルcarに束縛された関数そのものを指す。
そして、ここまでの評価の中間結果として以下が得られる。
(#<function car> (20 10))
最後に、リスト先頭の#<primitive car>が(20 10)を引数として関数適用され、
その結果として20が返却される。
0280!omikuji !dama
2006/01/02(月) 04:26:55この#<〜>という表記の仕方は処理系によって変化する。
例えば#<primitive car>だったり#<closure 00abcdef>など。
ちなみに評価器で#<〜>と出力されるオブジェクトは基本的にreadできない。
0282デフォルトの名無しさん
2006/01/02(月) 18:21:23(cons 1 ()) -> (1)
(cons 1 '()) -> (1)
どちらも一緒ですよね
だから構文解析するときどちらも nil として
返すようにしているのですが、問題でしょうか?
0283デフォルトの名無しさん
2006/01/02(月) 18:32:10悲しいと俺は思う
0284デフォルトの名無しさん
2006/01/02(月) 18:42:15(consp ()) => NIL
(consp '()) => NIL
(consp ''()) => T
'()と()が同じになるってことは''()と'()が同じってことで、
つまり''()と()は同じってことになる?
やっぱ問題あるような気がするけど。
0285デフォルトの名無しさん
2006/01/02(月) 18:57:42なるほど、''() は pair ですよね、(eval ()) と (eval '()) が
ともに () だからといって、一緒くたにしちゃだめですね、なんか
ぼけてました。
0286デフォルトの名無しさん
2006/01/02(月) 21:29:20同じではなく NIL というシンボルの変数としての値が NIL だというだけ。
0287デフォルトの名無しさん
2006/01/02(月) 22:58:47URL 変わってた。次にスレ立てする人は気をつけてちょ。
慶應の授業のページ・記号処理プログラミング 2005
http://web.sfc.keio.ac.jp/~t02064si/lisp2005/
;; GCL 使ってんのね。2006 の講義では SBCL の Windows 版が使える頃じゃないかな。
0288デフォルトの名無しさん
2006/01/03(火) 15:47:24(concatenate "foo" "bar") や (concatenate-string "foo" "bar")
じゃないんだろう。実際は誤差の範囲だとしても、パフォーマンスペナルティ
が気になる。マクロでもないみたいだし。歴史的な理由かな?
0289デフォルトの名無しさん
2006/01/03(火) 18:00:44処理系によってはcompiler macro定義してるから、typeが定数なら
パフォーマンスは気にしなくていいんじゃね? Allegroで試したら
string専用の内部関数の呼び出しにコンパイルされてたよ。
仕様としては、中途半端にジェネリックなところが気持ち悪いと思うが。
0290デフォルトの名無しさん
2006/01/04(水) 00:15:400291デフォルトの名無しさん
2006/01/04(水) 03:30:07ありがとうございます。Allegro ではマクロになってるんですね。
自分が使ってるコンパイラをもう少し調べてみます。
0292デフォルトの名無しさん
2006/01/07(土) 01:38:010293デフォルトの名無しさん
2006/01/07(土) 01:51:00SussmanとSteeleが1975年頃に最初の処理系を作ったと言われている。
当初"Schemer"という名前で計画されていたが、そのとき使用したITSというOSの
ファイル名が6文字までだったために"Scheme"という名前になった。
0294デフォルトの名無しさん
2006/01/07(土) 05:21:28SussmanとSteeleの論文(MIT AI-memo 349, 1975)に全ソースコードが
載ってるよ。実装言語はLISP。今のSchemeとはちょっと趣が違う。
で、たぶん2番目に古い処理系はSteeleによる最適化コンパイラRABBIT。
その後SteeleはSchemeチップの設計もやってる。
全部オンラインで読めるよ。
http://library.readscheme.org/page1.html
0295デフォルトの名無しさん
2006/01/08(日) 01:18:51すごい人だなー。
0296デフォルトの名無しさん
2006/01/08(日) 01:22:07CL は勿論、ECMAScript とか C とか。Java の後は Sun で Fortran の研究してたような。
0298デフォルトの名無しさん
2006/01/08(日) 08:14:33今のお仕事は Fortress だね。
http://research.sun.com/projects/plrg/fortress0785.pdf
って lisp に関係ないけどな。
0299デフォルトの名無しさん
2006/01/08(日) 14:48:03院生?
0300GLS
2006/01/08(日) 17:28:000301デフォルトの名無しさん
2006/01/08(日) 23:23:09自然言語にも精通していらっしゃるのですね。
0302デフォルトの名無しさん
2006/01/09(月) 11:30:53さすがに SBCL Win32 port がそんなにはやく安定するとは思えん.つか
CLISP でいいじゃんな.どうせなら ANSI CL 準拠のほうがいいと思うがなぁ.
GCL は配布物でかいし,本家の配布物ってまだ ANSI 互換モードがデフォじゃ
なかったような.
0303デェフォルトの名無しさん
2006/01/09(月) 22:05:20CLISPよりPetite Chez Schemeのほうが・・・
エディタならDrSchemeあるし。
あくまでWindows環境なら、って話ね。
WindowsでLISPでとなればSBCLははずせないんじゃないの?
0304デフォルトの名無しさん
2006/01/09(月) 23:13:25Allegro CL のがいいような.インストールメチャかんたんだし,統合開発環境
こみだし.LispWorks Personal なんか授業で使うならいいと思うけどねー.
SBCL Win32 port は現段階,マージがはじまった段階で,そのあと残りの
ToDo を片づけていくっつーレベルなんで SBCL Win32 は Lisp マニア以外には
敷居高杉.すくなくとも 0.9.8.x のうちは授業で使う環境の選択肢には入れちゃ
ダメ.だから開発者もまだ実用は無理とゆってるのわけで…
0305デフォルトの名無しさん
2006/01/09(月) 23:17:47まだ sbcl-devel #lisp 参加者以外が使ってもしょうがないだろ。
0306デフォルトの名無しさん
2006/01/12(木) 11:35:45不勉強なもので、よくわかりません。
gaucheのソースとか見てみたのですが、さっぱりで、、、。
macro.cあたりにまとまって書いてあるようなのですが。
パターン言語とかいうらしいのですが。
よい参考資料などありましたら教えてください。
0307デフォルトの名無しさん
2006/01/12(木) 14:48:48syntax-rulesで難しいのはむしろ健全性の方だと思うが、
パターンマッチが知りたいんだよね?
繰り返し (...) を除けばパターンマッチはそんなに難しくない。
アルゴリズムの入門書あたりに出てないかな。
健全性の方はWill Clingerの論文Macros That Workがいいよ。
0308デフォルトの名無しさん
2006/01/12(木) 16:24:270309306
2006/01/12(木) 16:58:39ありがとうございます。
まずは、パターンマッチから知りたいところです。
自分で調べてみて、xyzzy lisp programmingの
common lisp入門を読んでみてます。
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp22.html
SICPにも書いてあるようなのですが、難しく感じてしまって、、、。
健全性の方はWill Clingerの論文Macros That Workがいいんですね。
探してみます。きっと英語なんでしょうねぇ。先は長い。。。
0310デフォルトの名無しさん
2006/01/12(木) 17:14:18ttp://user.ecc.u-tokyo.ac.jp/~t50473/
0311デフォルトの名無しさん
2006/01/12(木) 17:17:36効率良くするのは難しいが、原理は簡単なんで、
入門書のアルゴリズムの練習問題にありそうだと思っただけ。
ざっと説明すると、パターン言語は(1)入力とパターンのマッチをかけて、
パターン中のパターン変数と入力との対応づけをつくる、(2)成功したら
テンプレートを走査してパターン変数を入力に置き換える、ということを
やってるだけだ。(続く)
0312デフォルトの名無しさん
2006/01/12(木) 17:19:29後は好きに拡張してくれ。シンボルは全てパターン変数として扱い、
シンボル以外のものは考慮してない。
(define (match template input)
(define (walk template input binding succ)
(cond
((null? template) (and (null? input) (succ binding)))
((symbol? template) (succ (acons template input binding)))
((pair? template)
(and (pair? input)
(walk (car template) (car input) binding
(cut walk (cdr template) (cdr input) <> succ))))))
(walk template input '() values))
(define (subst tree binding)
(cond
((pair? tree)
(cons (subst (car tree) binding) (subst (cdr tree) binding)))
((and (symbol? tree) (assq tree binding)) => (cut cdr <>))
(else tree)))
gosh> (subst '(d c b a) (match '((a b) (c . d)) '((1 2) (3 4 5))))
((4 5) 3 2 1)
0313デフォルトの名無しさん
2006/01/12(木) 21:24:55こないだC#で実装した(我流で)。
(define-syntax m (syntax-rules () ( (_ "constant" a (b (c ...)) ...) (a x (1 b ...) (c ...) ...))) というマクロがあり、
(m 1 (2 (3 4 5)) (a (b)) (x ())) というパラメータが渡されたとする。
マクロを解析すると、
パターン部は
((const "constant") (param a) (... (param b) (... (param c)))) というツリー構造になり、
テンプレート部は同じく
((param a) (var x) ((const 1) (... (param b)) (... (... (param c)))) となる。
パターンマッチはパターン部とマクロのパラメータを再帰的に比較すればよい。
適合するパターンが見つかったら、パラメータとパターンから
a:level0 data:1
b:level1 data:(2 a x)
c:level2 data:((3 4 5) (b) ())
という表を作り(このへんはGaucheのコメントを参考にしたような)、それをTemplate部に適用する
(param a) → テーブルからaの値を引いてくる。1を生成
(... (param b)) → ...(これの正式名称なんだっけ?)が出現したら、前述の表から……どうするんだっけ?
いま手元にソースがないので忘れたが、
b:level0 data:2
b:level0 data:a
b:level0 data:x
という3つの表を順番に生成して(param b)部に適用。
ネストした...も同様に再帰的処理して生成。
0314306
2006/01/12(木) 21:32:01ほー。すごい。
schemeは素人なので、すぐわからないのですが、参考にさせてもらいます。
(subst '(d c b a) (match '((a b) (c . d)) '((1 2) (3 4 5))))
の意味は
((1 2) (3 4 5))を((a b) (c . d))にマッチさせて(d c b a)に変換するってことですよね。
((1 2) (3 4 5))は((4 5) 3 2 1)に変換されてると。
matchがマッチしたものを返して、substはmatchした結果を使って置き換えしてると。
ありがとうございました。
0315313
2006/01/12(木) 21:33:16(m1 a) → (m2 a x)
(m2 a b) → (let ((a 100)) b)
というマクロにおいて、
(m1 x) → (m2-1 x-0 x-1) → (let ((x-0 100)) x-1)
0316デフォルトの名無しさん
2006/01/13(金) 02:06:46Common Lisp の cl-unification ライブラリのマニュアルと実装も参考になるお.
0317デフォルトの名無しさん
2006/01/13(金) 10:11:280318デフォルトの名無しさん
2006/01/13(金) 11:30:540319306
2006/01/13(金) 11:50:09いろいろ、具体的な解説ありがとうございます。
まだ、わかっていないのですが、参考にさせてもらいます。
>>315
その説明は考えてみても、よくわかりません。
(m1 a)を(m1 a x)と展開するマクロなのであれば、xは外のスコープから
データを持ってくるものなのじゃないかと思うので、
(m1 x)→(m2 x x)って変換されていい気がするのですが、、、。
(m1 b)→(m2 b x)なのですよねぇ。
はいじにっくのほうは、
マクロを呼んでいるスコープ内で使われている変数や関数名と
名前がぶつかった場合は、例えばxがぶつかったのであれば、
x-0などと言った風に名前をユニークにしてあげればいいって考えてました。
>>316 >>317
Unificationはとても面白そうなのですが、
マクロを作るのにはそこまで必要ではなさそうなので、
後で挑戦してみようと思います。
0320デフォルトの名無しさん
2006/01/13(金) 20:22:32ファイル読んで実行する場合、トップレベルの defineはあらかじめ分かるので
全体が letrecに入っている風に解釈してもいいでしょうか?
検索が必要なくなりますし、set!が無ければもっと最適化できそうな予感がするので。
0321デフォルトの名無しさん
2006/01/13(金) 20:41:43Stalinはそれを前提にプログラム全部を読み込んで最適化をかけるので
出てくるコードは激速らしい。
0322320
2006/01/13(金) 20:55:04(define (f a b) (+ (g a) b))
なんて行があったとして、gがこの行以前に束縛されていて
この後変更されないことが保証されていれば最適化ができると思うのです。
(define (a f) (lambda (b) (f (+ 1 b))))
(map (a func) l)
なんて時は(a func)の返り値は実行時にコンパイルするんでしょうか?
手続きを束縛するシンボルを破壊的に操作することって
ほぼない上に最適化の邪魔になるからとても嫌なんですが。
0323デフォルトの名無しさん
2006/01/13(金) 21:04:17そうなんですか、あんまり一般的な最適化じゃないんですね。
loadは...手続きなんですね。#includeみたくマクロだったら良かったのに。
(eval '(define a e) (interaction-environment))
なんてしたらトップレベルが汚れちゃうんですね。こんなの使わないのに。
Schemeのなんでもありって仕様が最適化の邪魔になってる気がしてます。
>>322の「実行時にコンパイル」は「実行時に最適化」の間違いです。
0324デフォルトの名無しさん
2006/01/13(金) 21:36:05ありなんじゃないかな。動作さえ明確に定義できれば。
0325デフォルトの名無しさん
2006/01/14(土) 01:16:58あれは組み込みでは…
でも Prolog はバックトラックも組み込みだしちょっと面白みがねー.
もっと別の探索手法がつかいたいとか,そーゆうレベルでいじりたいと
結局 Lisp で作っちゃうんだよな
0326315
2006/01/14(土) 02:05:27(m1 a) → (m2 x a)
(m2 a b) → (let ((a 100)) b)
とゆうマクロがあったときに、(m1 x) → (m2 x x)と展開するとどうなるか。
(define x 200)
(define y 200)
(m1 x) → (m2 x x) → (let ((x 100)) x) → 100
(m1 y) → (m2 x y) → (let ((x 100)) y) → 200
はいじにっくじゃない!!!!!!ひどい!!!!
というわけで、「外から渡されたもの」と「自分のテンプレートにより生成されたもの」は区別しなきゃいけないのよ。
0327デフォルトの名無しさん
2006/01/14(土) 02:21:07>なんて時は(a func)の返り値は実行時にコンパイルするんでしょうか?
んなわけない。グローバル最適化とか考える以前にクロージャを含む言語の
コンパイルについて勉強すべし。
>手続きを束縛するシンボルを破壊的に操作することって
>ほぼない上に最適化の邪魔になるからとても嫌なんですが。
目的による。Lisp系言語の場合、インタラクティブな開発時には
ひとつの関数定義を修正してリロードして、というのを繰り返すから、
グローバルな手続きが再定義できるのは便利でもある。
デバッグが済んだ段階で「全部constantと考えて最適化」という
オプションはあってもいい。
ただ、歴史がある商用のLisp処理系でさえそういうことを重視してないのは
何故だかは考えて見る必要はあるだろうね。
単なるインライニングくらいじゃそんなに速くならないんよ。
型推論して実行時型チェックを減らせるとかなり効果があるけどね。
0328デフォルトの名無しさん
2006/01/14(土) 11:51:22>>327
>んなわけない。グローバル最適化とか考える以前にクロージャを含む言語の
>コンパイルについて勉強すべし。
内部でクロージャを生成し、それを返す、又は set!する手続きの場合
一般的に環境をスタックからヒープにコピーする必要があると思うんですが
あらかじめ以降の引数などをヒープにつくれば後の環境のコピーが省けるかなあ
と思いました。
リストが与えられた時に先頭がどういう手続きかあらかじめ分かっていれば
その条件分岐もいらないですし、組込みの手続きとの条件分岐もいらない気がします。
動的にクロージャが生成され((a func)みたいに)、変更されないことが保証された上で
何度も使われる((map (a func) l)みたいに)前にコード化すれば実行中の条件分岐が
なくなっていいかなあと思いました。妄想ですが。
SECDマシーンみたいのを想像しているので間違っているかもしれません。
0329デフォルトの名無しさん
2006/01/14(土) 11:59:45>ただ、歴史がある商用のLisp処理系でさえそういうことを重視してないのは
>何故だかは考えて見る必要はあるだろうね。
>単なるインライニングくらいじゃそんなに速くならないんよ。
>型推論して実行時型チェックを減らせるとかなり効果があるけどね。
単なるインライニングならトップレベルを letrecに入れるだけなので
ほとんど変わらないでしょうね。
型推論は全体が letrecに入っていると思えばできるのかも。もしくは Scheme->Ocamlとか。
Ocamlの場合、関数定義のなかに未知のシンボルが現われるとエラーなので
インタラクティブに型推論ができるのかもしれませんが、Schemeだと難しそう。
また、
# let f x = x;;
# let g x y = x + y;;
# let h = ref f;;
# !h = g;;
This expression has type int -> int -> int but is here used with type
int -> int
となりますし。開発中とはいえ手続きの型まで変えることはあまりないと思いますが。
開発言語と実行言語に分けて、実行言語は制限つけて高速コードにコンパイルと
いう風にすれば Schemeが天下とれませんかね?
0330306
2006/01/14(土) 13:15:34うー、わかったようなわからないような。
(m1 x) → (m2-1 x-0 x-1) → (let ((x-0 100)) x-1)
これが、
(m1 x) → (m2 x-0 x) → (let ((x-0 100)) x)
って話ならわかるような気がするんですが、、、。
scheme理解できてないからかなぁ。。。
例がよくわからないので、すいませんがcで書きますと
#define swap(a,b) {int tmp=a;a=b;b=tmp;}
int x = 1, y = 2; swap(x,y);
=> {int tmp=x;x=y;y=tmp;} OK
int a = 1, tmp = 2; swap(a,tmp);
=> {int tmp=a;a=tmp;tmp=tmp;} だめ
となって、うれしくないのがはいじにっくでないと
で、その場合は
{int tmp1=a;a=tmp1;tmp=tmp1;}
として解決してくれれば、はいじにっくだとそういう話
以外に何かありそうなのですが、わからなくて、、、。すいません。
0331デフォルトの名無しさん
2006/01/15(日) 02:46:37> 開発言語と実行言語に分けて、実行言語は制限つけて高速コードにコンパイルと
> いう風にすれば Schemeが天下とれませんかね?
それは CL っぽく色々 declare とかコンパイラマクロをぶち込むってのじゃ駄目なのん?
0332デフォルトの名無しさん
2006/01/15(日) 06:17:52gclでウィンドウを生成して線を描くようなプログラム
をどなたか教えていただけませんか?
お願いします。
0333デフォルトの名無しさん
2006/01/15(日) 06:42:440334デフォルトの名無しさん
2006/01/15(日) 08:39:41開発はインタラクティブな処理系でやって、実行バージョンを
Stalinでコンパイルするとかやってる人はいるよね。
ただ、実行コードの速さってそれだけじゃあんまり訴求力が無いんだよね。
CPUのクロックだのキャッシュミスだのを削るような世界の連中は
大抵CかC++、時にアセンブラで仕事してて、Schemeなんて眼中にない。
流行のLLで抽象力を楽しんでる連中は、自分の言語がもう少し速く
なってくれたらとは思ってるけれど、実行速度だけが乗り換えの動機には
ならない(そもそも実行速度をあまり気にしないからその言語を選んだわけで)。
どっちのグループにも、少数ながら相手のグループの(速度|言語機能)を
横目で見ながらもなんらかの事情で自グループの言語を使わざるを得ない
連中がいる。めっさ速いScheme処理系を持ってけば、そういう連中は飛びつく
かもしれない。でも残り大多数は動かないだろう。
ひとつ突破口があるとすれば、めっさ速いScheme処理系をつくって、それで
流行のLLを実装することだ。結果がそのLLのデファクトの処理系より速ければ、
十分な乗り換えのインセンティブになる。乗り換えさせてから、「実は裏では
S式が動いててマクロだってほら自由自在〜」のように洗脳してゆくのだ。
0335デフォルトの名無しさん
2006/01/15(日) 10:56:19チョムスキーが初めて生成文法を定式化したとき
まで読んだ。
0336デフォルトの名無しさん
2006/01/15(日) 11:11:480337デフォルトの名無しさん
2006/01/15(日) 11:48:250338デフォルトの名無しさん
2006/01/15(日) 11:52:13VHLL: Very High Level Language
LL 発祥の地ってここ?
https://lists.csail.mit.edu/pipermail/ll-discuss/
0339デフォルトの名無しさん
2006/01/15(日) 11:56:35http://ll1.ai.mit.edu/
ll1-discuss には Guy Steele も顔を出してたよね。
0340デフォルトの名無しさん
2006/01/15(日) 12:12:070341デフォルトの名無しさん
2006/01/15(日) 12:22:54Schemeでも C並に速くなるんじゃないかなあと思ったのです。
本当に速度を重視している人は「最速」以外には興味がないと思うので
Cとアセンブラ以外は眼中にないんでしょうが。
機能的には全ての LLは Lispの劣化版の様に思えるのです(Haskellなんかは別として)。
Rubyが Lispに近づけば近づくほど Lispでいいじゃんと思います。
しかし Lispより Rubyが流行る理由も分ります。
Schemeで字句上、リストに従わないものは ' ` , ,@ くらいだと思いますが
ここら辺を拡張する、もしくは拡張できるようにすると Object.method(arg)を
(method Object arg) や (Object 'method arg) みたいに変換できるんじゃないかと
思います。それに Packageがあれば最強じゃないですか。
まあ他の言語を構文木をいじれるようにしても同じですけど。
Ocaml は不動点演算子を定義できない気がしてたんですが、できるみたいですし
Lispにできて Ocamlにできないことがよく分からないです。
Ocaml のマクロ(camlp4)は全然知らないですが。
0342デフォルトの名無しさん
2006/01/15(日) 12:42:01今年はコレが来ます
0343デフォルトの名無しさん
2006/01/15(日) 13:22:07Openコンパイラって知ってるか?
流行らなかったなー。
0345デフォルトの名無しさん
2006/01/15(日) 14:10:04捨て捨て
0346デフォルトの名無しさん
2006/01/15(日) 15:15:53いくつかのSchemeコンパイラは既にC並に速いと主張してるよ。
object.methodを特別に解釈するようなことはCommon Lispで
やったことがあるが、良し悪しだね。埋め込みの領域特定言語
の中でなら結構使える。全てのコードで使うと、どうも言語の
他の部分とのバランスが悪くて。慣れの問題かもしれんが。
packageもなー。read時の動的環境に左右されるってとこでたまに
はまるんだよね。外部とS式をやりとりするような場面で。
でも、Schemeで天下取ろうって気概はいいね。処理系が公開
できた暁には是非教えてくれ。応援するぜ。
0347デフォルトの名無しさん
2006/01/15(日) 15:46:120348デフォルトの名無しさん
2006/01/15(日) 16:13:28フットプリントも小さくなるかな?
リソース制限が多少緩和されてきてるとはいえ組み込み系の非リアルタイム部分をインタラクティブに作れるだけで幸せになれそうなんだけどな。
0349デフォルトの名無しさん
2006/01/17(火) 08:51:33コマンドラインからの入力は、なんていう変数に格納されてるんですか?
あと、lispを起動した際、自動的にこちらの指定したlispのコードを実行するように
するには、どこにコードを書けばいいでしょうか?
0350デフォルトの名無しさん
2006/01/17(火) 11:59:59弄ろうと思うのですが。
main関数はどこにあるのでしょうか?
0351デフォルトの名無しさん
2006/01/17(火) 13:07:430352デフォルトの名無しさん
2006/01/17(火) 21:31:21つgrep
0353デフォルトの名無しさん
2006/01/17(火) 22:41:43とetags
0354デフォルトの名無しさん
2006/01/19(木) 11:51:04大域変数用のクロージャってソースのどこにありますか?
0355デフォルトの名無しさん
2006/01/19(木) 12:21:120356デフォルトの名無しさん
2006/01/19(木) 16:12:51「つ」ってよくみるけど何のこと?
手でなんかをサッと出すようなイメージ?
0357デフォルトの名無しさん
2006/01/19(木) 16:18:33つ http://members.at.infoseek.co.jp/maruheso/aadic/ta.html#tu
0358デフォルトの名無しさん
2006/01/19(木) 16:21:020359デフォルトの名無しさん
2006/01/19(木) 17:00:000360デフォルトの名無しさん
2006/01/22(日) 18:00:18みなさんどうしてますか。
今のところ scheme-mode + run-scheme なのですが、
- 関数のeldocぽい表示 and/or info参照
- 動的補完
が欲しいなあと。
Common Lisp用のSLIME並に快適便利なのがあると言うことなしですけど。
0361デフォルトの名無しさん
2006/01/22(日) 21:05:48http://lambda.s55.xrea.com/Scheme.html
0362デフォルトの名無しさん
2006/01/24(火) 22:19:53どっかに continuation の各種実装方式あたりを集めてあるサイト
ありませんかぁ???
0363デフォルトの名無しさん
2006/01/24(火) 23:01:400364デフォルトの名無しさん
2006/01/24(火) 23:29:07こことか。
http://library.readscheme.org/page6.html
Smalltalk にも継続があるのは知らなかった...
http://en.wikipedia.org/wiki/Continuation
0365デフォルトの名無しさん
2006/01/25(水) 01:36:43実装に興味あるならこことか。
http://www.shiro.dreamhost.com/scheme/stack-j.html
0366デフォルトの名無しさん
2006/01/25(水) 03:49:44http://www.franz.com/products/allegrocl/
常々思うのですがパンピーに買える値段なんですかね。
Lispworks 5.0が2Qにでるってことだったがあてになんないよなぁ...
0367デフォルトの名無しさん
2006/01/25(水) 08:12:49ありがと.
0368デフォルトの名無しさん
2006/01/27(金) 00:53:11知らなかった。
わかりやすいページでつね。THX
0369デフォルトの名無しさん
2006/01/28(土) 23:33:10会社を騙して買わせる。これ。
0370デフォルトの名無しさん
2006/01/29(日) 10:47:530371デフォルトの名無しさん
2006/01/29(日) 11:38:570372デフォルトの名無しさん
2006/01/29(日) 11:50:570.10.0 が出る頃には Linux 以外でもネイティブスレッドが使えるようになると良いね。
0373デフォルトの名無しさん
2006/02/01(水) 21:21:34http://alcor.concordia.ca/~smw/home/telnet_song.html
0374デフォルトの名無しさん
2006/02/01(水) 21:44:33曲のタイトル見てRMSを彷彿とさせる物を感じた俺はチキンかもしれない。
0375デフォルトの名無しさん
2006/02/04(土) 17:05:46(define (new-counter)
(let ((count 0))
(lambda ()
(begin
(set! count (+ count 1))
count))))
この(new-counter)手続きは評価されるたびにその回数を返すらしいのですが、それはどうしてですか?
0376デフォルトの名無しさん
2006/02/04(土) 17:21:420377デフォルトの名無しさん
2006/02/04(土) 17:27:46詳しく言うと、
(define counter (new-counter))
(counter) ; 1が返ってくる
(counter) ; 2が返ってくる
ということ。
countという変数(正確にはcountの束縛)はnew-counterが呼ばれるごとに新しい物が作られる。しかし内側の(lambda () ...)が参照する限り削除されない。
0378デフォルトの名無しさん
2006/02/05(日) 03:45:48>375-377 を読んで感動しました。
関数を作る関数を書けるなんて!
0379デフォルトの名無しさん
2006/02/05(日) 07:46:43実装レイヤでは関数を毎回コンパイルして機械語にしている訳ではないからね.
「環境」だけが毎回新しく作られる.
環境ってのは,naiveに言えば変数名をキーとしたハッシュ表ね.
まぁSICPでも嫁.
0380378
2006/02/05(日) 09:43:310381デフォルトの名無しさん
2006/02/05(日) 12:17:34環境(少なくともローカル)はハッシュじゃないんじゃないの?
引数フレームのリンクリストみたいな感じで。
SECDマシンの LD命令みたいに深さとインデックスでアクセスできる。
トップレベルはハッシュでもいいけど。
勉強でScheme の処理系を作ってるんですが、GCについてよい論文はあるでしょうか?
全オブジェクトの数に比例する Mark and sweepよりも
生きているオブジェクトの数だけに比例する Copyingの方がいいとか
Mark and sweepはインクリメンタルにできるからいいとか
Generational GCで新世代は Copying、旧世代は Mark and sweepがいいとか
そこら辺が知りたいです。
0382デフォルトの名無しさん
2006/02/05(日) 13:45:49画面で読んで分かるほど短い本ではないんだなこれが.
>>381
まぅまぅ,難しいことは抜きで.
http://www.logos.t.u-tokyo.ac.jp/~endo/gc/ で物足りないなら挙げられてる参考文献を.
Wilsonのものは無料で読める:
http://citeseer.ist.psu.edu/wilson92uniprocessor.html
0383デフォルトの名無しさん
2006/02/06(月) 11:19:490384デフォルトの名無しさん
2006/02/06(月) 23:02:02Hello, world が 20MB...
% ./src/runtime/sbcl --core output/sbcl.core
This is SBCL 0.9.9.16, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.
SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses. See the CREDITS and COPYING files in the
distribution for more information.
* (save-lisp-and-die "hello" :executable t
:toplevel (lambda ()
(princ "Hello, world!") (terpri) (quit)))
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into /path/to/sbcl/hello:
writing 1584 bytes from the read-only space at 0x10000000
writing 1328 bytes from the static space at 0x30000000
writing 22577152 bytes from the dynamic space at 0x48000000
done]
% ./hello --noinform
Hello, world!
% ls -l hello
-rwxr-xr-x 1 nobody nobody 22921228 2 6 22:51 hello
0385デフォルトの名無しさん
2006/02/07(火) 02:13:590386デフォルトの名無しさん
2006/02/07(火) 02:43:46| 実装レイヤでは関数を毎回コンパイルして機械語にしている訳ではないからね.
それってSchemeだから?
手元のAllegroだとコンパイル済みの函数ジェネレータが返してくるのは
やはりコンパイル済みの函数オブジェクトになってるけど。compiled-function-pでtね。
詳細知ってる人の降臨希望。
0387デフォルトの名無しさん
2006/02/07(火) 02:55:55コンパイル済みの函数ジェネレータならコンパイル済みの函数を返すのが普通。
Schemeの場合、lambda式を評価した時点で中間コードなどにコンパイルする処理系が
多いが、このとき中にネストしたlambda式があればこれも含めてコンパイルする。
Common Lispの場合はリストのまま持っていてコンパイルしたときに中の関数も含めて
コンパイルする処理系が多いと思う。
0388デフォルトの名無しさん
2006/02/07(火) 03:25:01機械語コードはクロージャを生成するごとに変化するわけではない。
0389デフォルトの名無しさん
2006/02/07(火) 07:49:34typedef struct { 何かの関数 func; 何かの構造体 *env; } lambda_t;
typedef struct { int count; } new_counter_t;
#define FUNCALL(lambda) (lambda->func(lambda->env))
static int counter ( new_counter_t *up ) {
up->counter += 1;
return up->counter;
}
lambda_t *new_counter () {
lambda_t lambda;
new_counter_t *nc = GC_malloc ( sizeof(new_counter_t) );
nc->count = 0;
lambda.func = counter;
lambda.env = nc;
return lambda;
}
void func () {
lambda_t lambda = new_counter ();
FUNCALL(lambda); /* => 1 */
FUNCALL(lambda); /* => 2 */
}
GC_mallocで返されてるのがいわゆる環境というやつ。
0390デフォルトの名無しさん
2006/02/07(火) 14:06:03Mac と Win もできると思う。
他の OS でも os_get_runtime_executable_path() を実装するだけでいけるはず。
0391デフォルトの名無しさん
2006/02/07(火) 22:30:23many thanks!!
Mach-O だから Mac は後回しかなぁと思ってたけど、ソース見たらちゃんと有るね。
リリースされたら試してみます。
0392デフォルトの名無しさん
2006/02/08(水) 01:39:49EUC/JIS/SJIS/Unicodeなどを相互変換する
ライブラリはどこで見つかりますか?
Googleしてみても、見つけられなかったのです。
0393デフォルトの名無しさん
2006/02/08(水) 02:34:11CLISP.
ライブラリってより処理系そのものだけど。SchemeならGauche.
金持ちならAllegroCL. これもライブラリではないな(w
どこで見付かるかって話ならc.l.l.読むとかCLikiとかcommon-lisp.netとか。
0394392
2006/02/08(水) 03:07:14CLISPだと
http://clisp.cons.org/impnotes/encoding.html#charset
に使えるエンコーディングの一覧がありました。
また、ライブラリとしてはGNU iconvが使えるようです。
http://www.cliki.net/iconv
これで日本語処理もなんとかなりそうです。
ありがとうございました。
0395393
2006/02/08(水) 03:18:45直接iconvを叩かないで済むからエンコーディングまわりいじるには便利だよ。
0396デフォルトの名無しさん
2006/02/08(水) 03:29:510397デフォルトの名無しさん
2006/02/08(水) 23:55:09SBCL のエンコーディングサポートはほぼ Common Lisp だよ。
0398デフォルトの名無しさん
2006/02/09(木) 00:24:29条件を絞れば難しいもんじゃないし、練習がてら自分で書いてみては?
0399デフォルトの名無しさん
2006/02/09(木) 11:24:07LISPとかFortranだったら、C言語では実現できないアルゴリズムとかもあるのでしょうか?
Javaはアルゴリズムのライブラリがあるらしいですけど
0400デフォルトの名無しさん
2006/02/09(木) 11:48:10ヒント:チューリング完全
0401デフォルトの名無しさん
2006/02/09(木) 11:54:46日本語でおk
0402デフォルトの名無しさん
2006/02/09(木) 11:55:39http://pc8.2ch.net/test/read.cgi/tech/1104066264/l50
0403デフォルトの名無しさん
2006/02/09(木) 11:57:34http://pc8.2ch.net/test/read.cgi/tech/1104066264/648
http://pc8.2ch.net/test/read.cgi/tech/1104066264/649
0404デフォルトの名無しさん
2006/02/09(木) 12:01:18プログラミングなんてちょっと頑張りゃ誰でも出来る
設計は馴れるしかない
ソフトウェア工学みたいな変なのもあるしな
0405デフォルトの名無しさん
2006/02/10(金) 08:16:150406デフォルトの名無しさん
2006/02/10(金) 11:08:46CやFORTRANでもできなくはないだろうけど、苦労するんじゃないか?
>400 も言ってるように、チューリングマシン的にはどの言語も等価だから
「Aに書けてBに書けないもの」はなさげ。
0407デフォルトの名無しさん
2006/02/10(金) 11:13:30アセンブラよりCが使いやすいように、
Lisp使ってる人にはCよかLispのが使いやすい。
0408デフォルトの名無しさん
2006/02/10(金) 12:22:01Lisp初心者は、まず「グリーンスパンの第10法則」を知っておきましょう。
Greenspun's Tenth Rule of Programming
http://www.practical-scheme.net/wiliki/wiliki.cgi/Lisp:GreenspunsTenthRule
"Any sufficiently complicated C or Fortran program contains
an ad-hoc, informally-specified bug-ridden slow implementation
of half of Common Lisp."
0409デフォルトの名無しさん
2006/02/10(金) 20:39:36訳してみた
「クンニの時間はフェラの時間の半分とすべし」
0410デフォルトの名無しさん
2006/02/10(金) 21:06:55>>406-408
皆さん。レス有難うございます。
とても為になりましたです。
>>408
リンク先をお気に入りへ追加させて頂きました。
0411デフォルトの名無しさん
2006/02/11(土) 00:22:49http://list.cs.brown.edu/pipermail/plt-scheme/2006-January/011364.html
JITのschemeって初かな?
0412デフォルトの名無しさん
2006/02/11(土) 01:40:13ちょっと良いかも。ベンチマークきぼんぬ。
0413デフォルトの名無しさん
2006/02/11(土) 01:57:33リンクしたら著作権表示が必要とかなって、
調べるといろんなライセンスのライブラリ使ってて
わけわからなくなるし。
まあ、GPLで公開しちゃえば楽なんだが。
0414デフォルトの名無しさん
2006/02/11(土) 03:17:20本当は Scheme 版の CMUCL みたいなのがあると良いんだけどね。
チョッパヤのコンパイラで、リベラルなライセンスで、クロスプラットフォームなのが。
0415デフォルトの名無しさん
2006/02/11(土) 03:38:00怪しいとは思ってたけど、最初にスーフィーって読んじゃってからはスーフィズムのイメージ
と相まってずっとスーフィーと読んでたよ...
CL 版 SRFI の CLRFI はクラリファイ (clarify) って読んでるけど、こっちは寂れてるなぁ。
0416デフォルトの名無しさん
2006/02/11(土) 03:45:37SRFIはサーフィと読んでたが、CLRFIのほうは知らなかった。w
サンクス。というわけでリンク貼っとく。 http://clrfi.alu.org/
0417デフォルトの名無しさん
2006/02/11(土) 08:49:51ところでなんでPerforceのバナーがはってあるんだろ
0418デフォルトの名無しさん
2006/02/11(土) 22:34:18Editor の趣味だろう。Nick Levine とか Perforce 用インターフェースを公開
してくらいだしね。
0419デフォルトの名無しさん
2006/02/12(日) 13:07:050420デフォルトの名無しさん
2006/02/12(日) 13:37:10これはこれでよいな。
(define s "abc")
(string-set! s 0 #\A)
s
=> "Abc"
0421デフォルトの名無しさん
2006/02/12(日) 15:12:060422デフォルトの名無しさん
2006/02/13(月) 02:54:190423デフォルトの名無しさん
2006/02/13(月) 03:46:370424デフォルトの名無しさん
2006/02/13(月) 12:03:07また戻ってくるかもしれないけど、
とりあえず、さばらじゃ!
0425デフォルトの名無しさん
2006/02/13(月) 21:42:040426デフォルトの名無しさん
2006/02/13(月) 22:32:420427デフォルトの名無しさん
2006/02/13(月) 22:43:120428デフォルトの名無しさん
2006/02/13(月) 23:35:210429デフォルトの名無しさん
2006/02/14(火) 00:51:58M で終ってるじゃねぇか。やはり Lisp といえばあのお方しかいない。
どうみても McCarthy 先生です。本当にありがとうございます。
アレ Minsky 先生か?
0430デフォルトの名無しさん
2006/02/14(火) 03:59:00リチャード・M・ストールマン
0431デフォルトの名無しさん
2006/02/14(火) 08:05:00松井秀喜?
0432デフォルトの名無しさん
2006/02/14(火) 08:05:460433デフォルトの名無しさん
2006/02/14(火) 13:28:32トップはたぶんrationalize
0434デフォルトの名無しさん
2006/02/14(火) 15:30:150435デフォルトの名無しさん
2006/02/14(火) 20:23:18授業なんかで、前から使ってた。
0436デフォルトの名無しさん
2006/02/14(火) 23:08:070437デフォルトの名無しさん
2006/02/14(火) 23:09:12確かに使ったことない。・・・たぶん
0438デフォルトの名無しさん
2006/02/15(水) 00:40:220439デフォルトの名無しさん
2006/02/15(水) 01:54:020440デフォルトの名無しさん
2006/02/15(水) 17:13:520441デフォルトの名無しさん
2006/02/15(水) 21:27:26別にどうでも良いよな
0442デフォルトの名無しさん
2006/02/15(水) 21:32:550443デフォルトの名無しさん
2006/02/15(水) 22:36:05http://pc8.2ch.net/test/read.cgi/tech/1106587515/
0444デフォルトの名無しさん
2006/02/15(水) 22:55:58何気に良スレだったんで、次スレが立っても良いかなと思った。
Common Lisp だけでも、それなりに一スレ使い尽くせるもんだね。
0445デフォルトの名無しさん
2006/02/16(木) 00:06:27【入門】CommonLispその2【質問よろず】
http://pc8.2ch.net/test/read.cgi/tech/1140012484/
0446デフォルトの名無しさん
2006/02/16(木) 00:11:22ここにちょっとだけ載ってる。
http://en.wikipedia.org/wiki/Continuation
0447デフォルトの名無しさん
2006/02/17(金) 13:28:58ところで継続って作ったスレッドと別のスレッドでも普通に使えるものなの?
0448デフォルトの名無しさん
2006/02/17(金) 16:01:32スレッド自体が継続を使って作られてるならもちろん使える。
スレッド毎にスタックを持ってて、スタックそのままコピーして
保存してるならたぶん無理。
0449デフォルトの名無しさん
2006/02/17(金) 22:30:57外へ戻る脱出はわかるけど、外→内の継続が使えて便利なことってある?
0450デフォルトの名無しさん
2006/02/17(金) 23:09:27まぁ君の人生と違ってやり直しがきくってことだね。
0451デフォルトの名無しさん
2006/02/17(金) 23:35:59コルーチン。
やったことないけど。
0452デフォルトの名無しさん
2006/02/18(土) 03:25:500453デフォルトの名無しさん
2006/02/18(土) 05:49:35普段のプログラミングで多用するものではないが、新しい言語機能を
実験したい時に便利。ユーザレベルスレッドとか、ジェネレータとか、
デバッガとか。
>>452
レキシカル変数の値は復元される、というか、クロージャが環境を
保持するのと同じように、継続もその時点で見えている環境を保持する。
0454デフォルトの名無しさん
2006/02/18(土) 08:34:56call/cc以後の処理をクロージャにして継続として渡してやればいいわけだが、
それにはcall/cc出現までの呼び出し階層が全てCPSで書かれてないとダメかな?
foo -> bar -> baz というように関数を呼び出して、bazの中でcall/ccと同等の
ことをしたい(続く処理をクロージャにして継続渡ししたい)とする。
そうするとfoo, barが末尾呼び出しであるか、それらも継続渡しでbar, bazを
呼んでないとダメだよね?
0455デフォルトの名無しさん
2006/02/18(土) 10:29:430456デフォルトの名無しさん
2006/02/21(火) 18:55:39以下のように書くべきだったのですが
(define hoge
(lambda (a lst)
(cond ((null? lst) #f)
((atom? (car lst))
(cond ((eq? (car lst) a) #t)
(else (hoge a (cdr lst)))))
(else (or (hoge a (car lst)) ;A
(hoge a (cdr lst)))))));B
> (hoge 'a '((a)))
#t
or を思い付くことができず、Aの部分で
(else (hoge ...
と書いてしまい、以下のようになりました。
> (hoge 'a '((a)))
#f
A、Bの再帰をたどった場合、Aの結果は#t、Bの結果は#fに
なると思うのですが、全体の結果が#fとなる理由を教えて
いただいてもよろしいでしょうか。
0457456
2006/02/21(火) 19:01:19すいません。
0458デフォルトの名無しさん
2006/02/21(火) 19:05:450459456
2006/02/21(火) 19:13:24超高速のご回答ありがとうございます。
そういうことだったんですね。理解しました.
0460デフォルトの名無しさん
2006/02/22(水) 22:39:10Schemeはfull continuationを要求するので(C/C++とのインターリーブを
考えると特に)簡単には実装しづらい、というのがLisp系の悲劇だと思う。
Schemeでfull continuationをoptionalにしたような、
内→外への脱出のみ + Scheme的なコンパクト仕様が一つ決まっていれば
今よりも使われてたんじゃないでしょうか。
0461デフォルトの名無しさん
2006/02/22(水) 22:56:34例えばJavaのクラスライブラリとかのほうがずっと大きいと思う。
(もちろんその分高機能だけど)
個人的にはネットワーク、XML等の機能を盛り込んだ最新のより大きい
新Common Lisp (CLtL3?)の制定が必要だと思う。
0462デフォルトの名無しさん
2006/02/22(水) 23:22:120463デフォルトの名無しさん
2006/02/22(水) 23:32:00大きさについては、組込みにするには、って書いたのでそこを汲んでくださいな。
Javaのライブラリの方がはるかに大きいのは同意です。
1.1の頃は(それでもでかかったけど)まだあんなじゃなかったのに。
あとは開発環境と実行環境の分離でしょうかねえ。普及の障害。
0464デフォルトの名無しさん
2006/02/22(水) 23:48:38昔7行スレに(7行じゃないけど)あったよ
0465デフォルトの名無しさん
2006/02/23(木) 00:49:53忘れ去られている ISLISP
0466デフォルトの名無しさん
2006/02/23(木) 03:30:070467デフォルトの名無しさん
2006/02/23(木) 21:37:26「プログラミング言語 Scheme」の p.64、英語版第 3 版だと、
http://www.scheme.com/tspl3/further.html#./further:h4
のあたりです。
(define product
(lambda (ls k)
(let ((break k))
(let f ((ls ls) (k k))
(cond
((null? ls) (k 1))
((= (car ls) 0) (break 0))
(else (f (cdr ls)
(lambda (x)
(k (* (car ls) x))))))))))
(product '(1 2 3 4 5) (lambda (x) x))
=> 120
(product '(1 2 0 3 4 5) (lambda (x) x))
=> 0
となりますが、、、以下続く。
0468467
2006/02/23(木) 21:42:01(define product-b
(lambda (ls)
(let f ((ls ls) (result 1))
(cond
((null? ls) result)
((= (car ls) 0) 0)
(else
(f (cdr ls)
(* (car ls) result)))))))
(product-b '(1 2 3 4 5))
=> 120
(product-b '(1 2 0 3 4 5))
=> 0
で充分じゃないかと思ってしまいました。
実際、リストに 0 が出現するとループからも脱出できているようですし。
どこを勘違いしているのでしょうか?
継続引渡しスタイルの何が嬉しいのでしょうか?
0469デフォルトの名無しさん
2006/02/23(木) 23:50:410470デフォルトの名無しさん
2006/02/24(金) 01:31:30かけ算じゃあまりありがたみがないけど、
もっと重い処理を考えたらうまみがでる?
この文書のセクション5あたりが参考になるかも。
ttp://www.sampou.org/haskell/article/whyfp.html
0471デフォルトの名無しさん
2006/02/24(金) 01:34:03ttp://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3aCPS
0472467
2006/02/25(土) 19:42:32なるほど、ありがとうございます。
>>470
いえまあ、かけ算が例でも >>469 ということであれば利点はわかります。
ところで、セクション 4 で言ってる
g (f input)
を例とした「怠惰(遅延)評価」って、Scheme での継続引渡しスタイルでも
同様の効果が得られるんでしょうか。つまり強力なモジュール化が可能になる?
また、「プログラミング言語Scheme」の索引で「遅延評価」をひくと、(delay)
と (force) を使う旨の説明が出てくる(p.94)んですが、これと継続引渡しスタイルは
関係しているんでしょうか。もう一つの索引参照先(p.199)の
「ヒント:評価を遅らせるには lambda を使用します」
はきっと関係しているんだろうなぁ、と思うのですが。
>> 471
ありがとうございます。
まだちゃんと理解できていませんが、
http://practical-scheme.net/docs/cont-j.html
とあわせて読んでみています。
0473デフォルトの名無しさん
2006/02/25(土) 22:30:23「継続を実装したプロシージャは任意個数の引数を受け取ることができるため、
継続引渡しスタイルを用いて複数の結果を返すプロシージャを定義すること
ができるようになる」
という記述がありますが、これはどういう意味でしょうか?
普通のプロシージャだって任意個数の引数を受け取れますよね?
「複数の結果を返す」と言っていますが、例を見ても戻り値は一つにしか見え
ません。
任意の手続きを渡せて、それに従って結果も変えられる、ってのはわかりますが、
それだけだったら、継続引渡しスタイルなんてわざわざ言わなくても、プロシー
ジャ渡し、などと言った方がすっきりしそうに思えます。
ちなみに例は以下。
(define car&cdr
(lambda (p k)
(k (car p) (cdr p))))
(car&cdr '(a b c)
(lambda (x y)
(list y x))) => ((b c) a)
(car&cdr '(a b c) cons) => (a b c)
(car&cdr '(a b c a d) memv) => (a d)
0474デフォルトの名無しさん
2006/02/25(土) 22:56:00たとえばC言語の関数とかだと引数は複数指定可能なのに
返り値は1つしかだめだよね?(特別の場合として0というのもあるけど)
でもCPSでは,サブルーチンからリターンするというのは,
継続に(返り値であるところの)値を渡す,ということになるから
(ここらへん図が書けないと厳しいな……)
自然と複数の値を渡すことができるようになるの.
ちなみにContinuationはそのときの環境なども含まれるから
単純なプロシージャとは違います.
>>473の例は複数の値を返せる,という継続の特徴の一部を示している
だけのプログラム例なのでこの辺りは実感できないと思いますが.
0475473
2006/02/26(日) 00:05:41ありがとうございます。
しかし >>473 の例、
(car&cdr '(a b c)
(lambda (x y)
(list y x))) => ((b c) a)
(car&cdr '(a b c) cons) => (a b c)
(car&cdr '(a b c a d) memv) => (a d)
これらはいずれも、返り値は複数ではなくて一つだけ(リスト一つ)です
よね。
これがなぜ
> >>473の例は複数の値を返せる,という継続の特徴の一部を示している
> だけのプログラム例
ということになるんでしょうか?
> ちなみにContinuationはそのときの環境なども含まれるから
> 単純なプロシージャとは違います.
では、代わりにクロージャ渡しと言えば、それは CPS と同義なんでしょうか?
0476デフォルトの名無しさん
2006/02/26(日) 00:24:04car&cdr って関数はその名の通り,listをもらってそのcar部とcdr部を
返す関数ってぐらいの意味.
(let (((x y) (car&cdr '(a b c)))) ;; car&cdr が複数(2つ)の値を返している.
(list y x))
っていうプログラムがあったとして(これは疑似コードだけど),
これをCPSに変換したものが
(car&cdr '(a b c)
(lambda (x y)
(list y x)))
というプログラムになる訳.
(当然car&cdrの定義は前者と後者で異なります)
0477デフォルトの名無しさん
2006/02/26(日) 00:29:08という風に見る。この辺ややこしい。
>では、代わりにクロージャ渡しと言えば、それは CPS と同義なんでしょうか?
CPSを実現するための1手法としてクロージャーを渡している。
クロージャーを渡していてもそれが継続でなければCPSではないし、別の方法で継続を渡す実装があるかもしれない。
0478473
2006/02/26(日) 01:15:30ありがとうございます。
ですが、そもそも擬似コードの意味が不明ですし、加えて前者と後者で
当然定義の違う car&cdr、などと言われると、ますます意図を汲めません。
せっかく説明してくださってるのに、申し訳ないです。
>>477
> car&cdrはリターンする代わりに継続のkに2つの値を渡している。
> 1つのリストを返しているのは継続k。という風に見る。この辺ややこしい。
なるほど、納得しました。
> CPSを実現するための1手法としてクロージャーを渡している。
>クロージャーを渡していてもそれが継続でなければCPSではないし、
クロージャと継続は、どう区別するんでしょう?
クロージャを渡していても、それが継続ではない例を挙げてもらっても
良いでしょうか?
> 別の方法で継続を渡す実装があるかもしれない。
これは、Scheme の処理系ごとに方法が違うかもしれないってことですか?
それとも、他の言語では違うかも、という意味?
0479デフォルトの名無しさん
2006/02/26(日) 01:30:070480デフォルトの名無しさん
2006/02/26(日) 01:36:19http://www.shiro.dreamhost.com/scheme/docs/cont-j.html
0481473
2006/02/26(日) 01:54:23では (lambda (x) x) は、クロージャですか、それとも継続ですか?
>>480
ありがとうございます。読みました。
Scheme のコード上、どう区別がつくのかしらん、ってのが疑問なん
です。
0482デフォルトの名無しさん
2006/02/26(日) 02:04:430483デフォルトの名無しさん
2006/02/26(日) 02:04:55クロージャですし、何も計算しない継続を表していると考えることもできます。
その質問は
「我輩は猫である。名前はまだない。…」
は日本語ですか、それとも小説ですか?
と聴いてるようなもの。
0484473
2006/02/26(日) 02:35:05順を追って読んでいますが、じつは理解していないのかもしれませんね。
>>483
なるほど。
継続(小説)はクロージャ(日本語)で表現される、ということでしょうか。
では、質問を変えます。
ある関数の引数にクロージャを渡しているが、それを CPS とは呼ばない
場合というのはありえるのでしょうか? ありえるとして、それはどんな
場合ですか?
0485デフォルトの名無しさん
2006/02/26(日) 02:36:390486デフォルトの名無しさん
2006/02/26(日) 02:44:57もっと実質的な考えをしないと駄目。
0487デフォルトの名無しさん
2006/02/26(日) 02:51:160488デフォルトの名無しさん
2006/02/26(日) 02:55:040489デフォルトの名無しさん
2006/02/26(日) 07:26:15クロージャの生成方法は lambdaだけ。誤解のしようがない。
継続っていうのは内部的にはスタックとレジスタを保存したもの。
継続の生成方法は call-with-current-continuation(なにげに syntaxじゃない)だけ。
これも誤解しようがない。
CPSはクロージャで継続を表現してたらい回しにしていくやり方のこと。
これは意味だから解釈の問題。
(lambda (x) x)だけでクロージャだのCPSだのは言えない。
>>480 はかなり分かりやすいよ。
0490473
2006/02/26(日) 13:57:29> CPSを意図してない場合は全部。
なるほど。
コードの書き手の主観依存であって、客観的にはクロージャ渡しと CPS は区別
できないと。
>>489
> 継続の生成方法は call-with-current-continuation(なにげに syntaxじゃない)だけ。
矛盾してませんか?
たとえば >>473 の例は、call-with-current-continuation を使っていません。
クロージャを渡しているだけですが、渡されたクロージャすなわち lambda 式が
継続なんですよね?
> >>480 はかなり分かりやすいよ。
そうですね。
完成が楽しみです。
0491デフォルトの名無しさん
2006/02/26(日) 14:56:25なんかこの人、すべての質問が奇妙に思える。
0492デフォルトの名無しさん
2006/02/26(日) 16:00:31だから変換前のプログラムを考えなければ
(lambda (x y) (list y x))
が継続である,という主張は意味を持たない.
0493デフォルトの名無しさん
2006/02/26(日) 18:22:11継続が理解できてないから継続渡しなんて言われてもさっぱりだし、
高階関数との区別もつかない。
あきらめて他のことでもしたほうがいいよ。
0494473
2006/02/26(日) 19:32:17うーん、やっぱりよくわからん、と思ったんですが、さかのぼって
>>454
>>455
のやりとりを読んで、疑問が解けました。
ありがとうございました。
0495デフォルトの名無しさん
2006/02/27(月) 00:06:54間違っちゃいないが、ちょっと狭義過ぎるかと。
特に今はもう少し一般的なCPSの話だからbソょっと不適切=B
0496デフォルャgの名無しさん
2006/02/27(月) 19:52:14threaded 1,472KB、non-threaded 4,716KB です。
素人考えでは、スレッド対応してる方がサイズでかくなりそげ
なんですけど、なんででしょう?
0497デフォルトの名無しさん
2006/02/28(火) 05:20:27ついにJITコンパイラでも組み込んだかな。
0498デフォルトの名無しさん
2006/02/28(火) 05:31:35わが暮らし楽にならざり
ぢつと手を見る
0499デフォルトの名無しさん
2006/02/28(火) 23:27:3610
2030
となります。
10
20
30
となるのを期待して書いたのですが、なぜでしょうか?
ちなみにscmでは仮想マシンの入れ子呼び出しをまたいだ継続は使えないのか、
エラーになります。
(define x #f)
(define y #f)
(display
(call-with-current-continuation
(lambda (k)
(set! x k)
10)))
(newline)
(if y
#f
(begin
(set! y #t)
(eval (list x 20) (interaction-environment))))
(display 30)
(newline)
0500デフォルトの名無しさん
2006/02/28(火) 23:38:19(eval '(x 20) (interaction-environment))
としたらscmでも実行でき、やはり
10
2030
と出力されました。
0501デフォルトの名無しさん
2006/02/28(火) 23:47:06(x 20)
でも同じでした。すんません。でもどうして
10
20
30
じゃないんでしょうか。
0502デフォルトの名無しさん
2006/02/28(火) 23:58:02トップレベルは継続も特別?
0503デフォルトの名無しさん
2006/03/01(水) 00:02:28トップレベルを巻き戻さない。
0504デフォルトの名無しさん
2006/03/01(水) 00:12:310505デフォルトの名無しさん
2006/03/01(水) 23:16:55以下のようなリストにおいて、
1 まずcarでsortし、
2 carが同じ値の時はcadr順にならべる
方法を教えていただいてもよろしいでしょうか。
'((1 3) (1 2) (2 4) (2 1))
0506デフォルトの名無しさん
2006/03/01(水) 23:38:55スペースで区切られたデータがならんでいるテキストデータを
読み込んで1列目だけ出力するプログラムってどうかけばいい?
awkでかくとこんな感じなもの
awk '{print $1}' input_file.txt
0507デフォルトの名無しさん
2006/03/01(水) 23:40:110508デフォルトの名無しさん
2006/03/02(木) 00:05:23どの Lisp でどの処理系かによってぜんぜん変わると思うが。
おれの手元には Gauche があるが、それなら1行の文字列データが line に入っているとして
(car (string-split line #/\s/))
とかすれば1列目が取り出せる。読み込んで行を割り振ってこの処理を繰り返
せばおしまい。でも string-split は Gauche の実装でしかないからほかの
scheme 処理系にあるかは知らない。
>505
問題文の意味が取りづらいのだがようするにいわゆる辞書順で並べろってこと?
まず (1 3) と (1 2) の比較関数を考えればいいんじゃね。
0509デフォルトの名無しさん
2006/03/02(木) 00:10:56(use srfi-13)
(define (first-columns port)
(with-input-from-port port
(lambda ()
(port-map
(lambda (line) (car (string-tokenize line)))
read-line))))
(define (main args)
(for-each print (call-with-input-file (cadr args) first-columns))
0)
0510505
2006/03/02(木) 00:33:57出来ましたー!
>>508さん。ありがとうございます。carでだけならsortできるのに。。。と
悩んでいましたが、おかげで出来ました.
(sort
'((1 3) (1 2) (2 4) (2 1))
(lambda (a b) (if (= (car a) (car b))
(< (cadr a) (cadr b))
(< (car a) (car b)))))
((1 2) (1 3) (2 1) (2 4))
0511デフォルトの名無しさん
2006/03/02(木) 00:35:33(use-package :clawk)
(defawk print-col-1-only ()
(t ($print $1)))
もしくはもう少し Lispy に
(use-package :clawk)
(defun print-col1-only (filename)
(do-file-fields (filename)
(format t "~A~%" $1)))
0512デフォルトの名無しさん
2006/03/04(土) 07:22:16学べる書籍、論文を紹介して頂けないでしょうか。
SICPを期待しながら読んだのですが、何だか、はぐらかされたような気分です。
0513デフォルトの名無しさん
2006/03/04(土) 11:31:44まず必要な理解はユーザ側なのか実装側なのかはっきりしる。
0514デフォルトの名無しさん
2006/03/05(日) 04:17:11全部まとめてとなると厳しいけれど、使い方ってんならこれとかどうでしょ。
http://www.cs.indiana.edu/~dfried/appcont.pdf
あと、>>480。
0515デフォルトの名無しさん
2006/03/05(日) 04:39:21http://lists.sourceforge.jp/mailman/archives/gauche-devel-jp/2002-November/000018.html
あえて補足すると
(1)は作成時にスタックを memcpyして setjmp、呼び出し時にスタックが足りなければ
ダミー関数を呼びまくってスタックを伸ばして memcpy, longjmpという感じ。
SCM, guileのソースを見れば分かる。
(2)は普通にVMにコンパイルすると実装できる。
作成時にスタックとその他必要なレジスタの値をコピーして、呼び出し時にレジスタ
の値を復元、スタックは保存しておいた方を使えばいいのでコピーがいらない。
(3)は全然知らない。相当マニアック。
(4)のStack GCのやつは実装してみたことは無いけれど、あまり難しくなさそう。
GCといってもポインタが指しているのが環境なのか継続なのかはっきりしているから。
Stack GC はスタック上の生きているサイズに比べて十分スタックのサイズが大きくないと
explicit popに比べて不利になる。逆に十分スタックのサイズが確保されるなら、
Gaucheみたいな末尾呼び出しの実装には勝てそう。
0516デフォルトの名無しさん
2006/03/06(月) 00:33:01(define (reduce f i l)
(if (equal? '() l)
i
(f (car l) (reduce f i (cdr l)))))
を実行し、次に、
(define (anytrue? l)
(reduce or #f l))
を実行しました。
anytrue?には、
リストlの要素のいずれかが#tなら#t、
そうでないなら、#fを返して欲しいと思っています。
ところが、
;ERROR: Use of keyword as variable or
; in expression: (or #f #@l)
; in scope:
; (l) procedure anytrue?
;STACK TRACE
1; ((#@reduce or #f #@l))
2; (#@anytrue? (#@quote (#f #f #f)))
といわれてしまいます。
何がいけないのでしょうか。
(define (sum l)
(reduce + 0 l))
では、うまくいくのですが...
0517デフォルトの名無しさん
2006/03/06(月) 00:41:54or の代わりに (lambda (x y) (or x y))
にしてみ
0518516
2006/03/06(月) 00:57:43ありがとうございます。うまくいきました。
でも関数じゃないというのは、どういうことなんでしょうか。
defineやlambdaで定義されている規則に従って、
単純に置き換えが行われていくのかと思っていたのですが...
0519デフォルトの名無しさん
2006/03/06(月) 01:04:43引数が評価されない場合があるっしょ?
0520516
2006/03/06(月) 01:16:10ありがとうございます。
R^5RSをよく読んでみます。
0521デフォルトの名無しさん
2006/03/06(月) 04:56:370522デフォルトの名無しさん
2006/03/06(月) 23:52:49mapcarとか引数に関数を取る高階関数って、
マクロは引数に取れないよね?
関数やマクロを定義するとき、
マクロか関数か、名前で判断できるようにすべきなのか?
0523デフォルトの名無しさん
2006/03/06(月) 23:58:31第一の質問の答えばyes。
第二の質問の答えは好きにすればいい。一般的にはno。
0524デフォルトの名無しさん
2006/03/07(火) 01:10:05emacsとか、充分なインテリセンスがある環境ならキーひとつで
定義箇所に飛べるから名前で区別するほどではないんじゃないかな。
0525デフォルトの名無しさん
2006/03/07(火) 01:11:02リンクした Windows 用の CLISP バイナリみつけた。
http://lispuser.net/commonlisp/clisp.html
CLISP って exe の実行形式出力できるんですね。知らなんだー。
0526デフォルトの名無しさん
2006/03/07(火) 01:41:020527デフォルトの名無しさん
2006/03/07(火) 03:12:32それはそうとACL MacOSX PPC 32bit版の投げ売りやってるみたいよ。
Linux x86 64bit版だったら即買いだったのに。intel Macの影響だと
思うけどMacな方は突撃どうぞ。$995でFree Deploymentってマジでうらやましぃ。
0528デフォルトの名無しさん
2006/03/09(木) 04:43:11http://www.cs.indiana.edu/~dyb/r6rs/status.html
あんまりでかい言語にならずに済んでくれるといいなあ。
特にモジュール周辺とかコンパイラ周辺とか、
Common Lisp は有用であるとはいえやや複雑すぎるきらいがあるから。
そこらへんコンパクトに収めてくれるとありがたいなあと思う次第。
ところで [] を実際使ってる人っている?
0529デフォルトの名無しさん
2006/03/09(木) 18:23:49実際のところ、カッコの対応はインデントだけで見てるから、
[]混ぜるの意味なくない?
0530デフォルトの名無しさん
2006/03/09(木) 19:02:020531デフォルトの名無しさん
2006/03/09(木) 19:04:12として規定するのはやめてほしい。有用性も疑問。
0532デフォルトの名無しさん
2006/03/10(金) 00:11:44(define reenter #f)
(define x 0)
(fluid-let ((x 1))
(call/cc (lambda (k) (set! reenter k)))
(set! x (+ x 1))
x)
=> 2
x
=> 0
とここまではその通りなんですが、
(reenter '*)
=> 3
(reenter '*)
=> 4
とはならず、エラーになります。試したのは Gauche と Petite Chez Scheme です。
errata には特に何も書かれていないようなのですが、(reenter '*) ってのは
何をしたいんでしょうか?
0533デフォルトの名無しさん
2006/03/10(金) 00:39:56ちなみにreenterを呼び出すと
(fluid-let ((x 1))
(call/cc (lambda (k) (set! reenter k))) <-- この式から戻ってくる
(set! x (+ x 1))
x)
引数に渡している '* は call/cc の戻り値になるけど、ここでは
捨ててるからあんまり意味はない。
0534デフォルトの名無しさん
2006/03/10(金) 01:17:05ありがとうございます。
(define reenter #f)
(define x 0)
(fluid-let ((x 1))
(call/cc (lambda (k) (set! reenter k)))
(set! x (+ x 1))
x)
までを foo.scm に書いて、その後、
gosh> (load "./foo.scm")
#t
gosh> x
0
gosh> (reenter '*)
*** IO-CLOSED-ERROR: I/O attempted on closed port: #<iport(closed) ./foo.scm 0x102
e7b60>
Stack Trace:
_______________________________________
となったので、つまずいてました。
ファイルに書かずに、全部 gosh> の状態(何ていうんでしょう?)から入力すれば
大丈夫なんですね。気がつきませんでした。でも、なぜ違いが出るのでしょうか?
0535デフォルトの名無しさん
2006/03/10(金) 01:24:00Gauche 0.8.6 でやってみたところ問題なく 3, 4 となりますが。
どういうエラーになったんですか。
0536デフォルトの名無しさん
2006/03/10(金) 01:24:58Schemeの中の人の気持ちになって考えよう。
loadの中の人はfluid-letで始まる式を読んだ後に何をしようとしていたのか。
ちなみにトップレベル絡みの継続は剣呑だから実用的には避けたほうがよいぞ。
0537デフォルトの名無しさん
2006/03/10(金) 12:29:20ありがとうございます。
load 時に開いていた出力ポートがトップレベルでは閉じられているのに、
継続で load 時の出力ポートを使おうとしたのでエラーになった、って
ことでしょうか?
トップレベルと load 時では、デフォルトではどちらも標準入出力を使う
んだろう、と思ってたんですけど、違うってことなのかなぁ。
0538デフォルトの名無しさん
2006/03/10(金) 12:36:36とりあえず、その辺は実装依存だな。
0539デフォルトの名無しさん
2006/03/10(金) 13:19:34Scheme勉強中の私が、何が起こっているのか説明してみて良い?
継続とはつまりその時点からトップレベルに戻るまでに行われる処理の流れであって、
この場合、そのトップレベルに戻るまでの間にはloadによって開かれた、
入力ポートから続きを読むor閉じる処理が含まれている。
よって、既に閉じられているポートに対する処理が行われることになりエラーが発生する。
さらに、既に読み込み終わっていて継続にはそのポートに対する処理が含まれていないとしても、
fluid-letで始まる式の戻り値は破棄されるために望む結果は得られない。
(loadの戻り値は成功/失敗を#t/#fで返す)
ということで良いんでしょうか。
0540デフォルトの名無しさん
2006/03/10(金) 13:45:26quackでは'['と']'はそれぞれ'('と')'に変換される
0541デフォルトの名無しさん
2006/03/11(土) 00:51:17が考えられていた。refはジェネリック関数で
[hash 'key] => value みたいに使えるようなアイデアが
あったらしい。
R6RSから外れなくなかったので、このアイデアを放棄
したみたいだが。
0542デフォルトの名無しさん
2006/03/11(土) 08:50:18インストールしたスクリプトに別のファイルを読ませる場合、どうすればいい?
おおまかに次のような選択肢があるだろうけど。
1. loadにフルパスで書く
2. 環境変数 or gaucheの変数(なんかあるだろ)でパスを指定、loadはファイル名のみ
3. ファイルをgaucheが標準で探すディレクトリのどこかに置く
インストールしない、開発中の都合の良さも考えて一番いいのはどれかなあ。
0543デフォルトの名無しさん
2006/03/11(土) 10:38:56mylib/other.scm
みたいに置いといて、mylib.scmの中で
(load "mylib/other")
インストール前のテスト時には gosh -I. で起動する。
ってやってる。
0544デフォルトの名無しさん
2006/03/11(土) 18:29:00ともあれ、ありがとう。
0545デフォルトの名無しさん
2006/03/11(土) 21:11:40-I. で load-path に . を追加してるんじゃないのか?
0546デフォルトの名無しさん
2006/03/11(土) 22:20:19Schemeを覚えたら、そのプログラムって
defineをdefunにしたりとか、
単純なキーワード置き換えだけでCommon Lisp環境で動いたりするもんなの?
0547デフォルトの名無しさん
2006/03/11(土) 22:36:04名前空間が違う、ライブラリが違う、
末尾再帰の最適化は未保証、とかとかあるから無理じゃね?
ただ簡単なリスト処理くらいのプログラムなら
頭のなかで変換できると思うけど…
0548デフォルトの名無しさん
2006/03/11(土) 23:56:57簡単だな。極端な話、SchemeインタプリタをCommon Lispで書くことさえさほど
難しいことではないし。
0549546
2006/03/12(日) 04:06:43単純な移行はできないんですね。
Schemeのほうがライブラリも含めた言語の規模が小さそうなので勉強が簡単かなと思ったんですが、
とりあえずCommon Lispで行ってみることにします。
ありがとうございました。
0550デフォルトの名無しさん
2006/03/12(日) 09:20:18継続とインタプリタの入れ子呼び出しが絡むと難しくならない?
0551デフォルトの名無しさん
2006/03/12(日) 10:40:51そこは別に難しくはないだろ.Scheme インタプリタに継続を実装すりゃいいだ
けだからな.Scheme 処理系間の互換性と同じ問題にブチあたるほうがキツいと
おもわれ.
0552デフォルトの名無しさん
2006/03/12(日) 10:52:13インタプリタ→Common Lispで書いたメソッド(の中でunwind-protect等)
→インタプリタ
という場合で、中のインタプリタで作った継続を外側のインタプリタで
適用しようとしたときとか、どうするの?
0553デフォルトの名無しさん
2006/03/12(日) 12:02:08トランポリンでやるか、最初にCPS変換かけるかすればいいじゃん。
0554デフォルトの名無しさん
2006/03/12(日) 19:00:46kwsk
0555デフォルトの名無しさん
2006/03/18(土) 12:56:57(define-syntax my-or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e1 e2 e3 ...)
(cond (e1) (e2) (e3) ...
(#t #f)))))
のようにも定義できると思うのですが、
何か見落としている問題点があるでしょうか?
0556デフォルトの名無しさん
2006/03/18(土) 14:05:560557デフォルトの名無しさん
2006/03/18(土) 15:19:24例えば(or (f)) という式を考えると
orが末尾コンテクストにある場合は(f)は、末尾呼び出しにならなきゃならない
my-orの場合は
(let ((temp (f)))
(if temp
temp
(cond (#t #f))))
と展開されるから(f)は末尾呼び出しにならない。という問題点がある
0558デフォルトの名無しさん
2006/03/18(土) 16:28:42とまれ、末尾呼び出しについては失念していました。どうも。
0559デフォルトの名無しさん
2006/03/18(土) 17:28:10ダウンロードしたんですけど、devel.lic
ってファイルが無いって起動出来ないんです。
開発元にはメールアドレスは登録したんだけど、
どのくらい待てばいいんですか?
裏技とかないんですかね?
0560デフォルトの名無しさん
2006/03/18(土) 17:45:060561デフォルトの名無しさん
2006/03/18(土) 17:46:34どこのCOMMON LISPの話だ?
0562デフォルトの名無しさん
2006/03/18(土) 17:50:47どれくらい待つかは中の人じゃないからわからん。
0563デフォルトの名無しさん
2006/03/18(土) 17:55:18(define-syntax my-or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e1 e2 ... en)
(cond (e1) (e2) ... (else en)))))
なんてできそうですが、これはChezの独自拡張ですよね。R6RSに入らないものか。
0564デフォルトの名無しさん
2006/03/18(土) 22:52:22Allegro だな。なつかしい。若い頃ライセンス更新がだるいので CMUCL に走っ
てしまったのを思い出した。まぁ体験版じゃ所有欲をみたせないっつー理由が
おおきかったが。
0565デフォルトの名無しさん
2006/03/19(日) 08:27:410566デフォルトの名無しさん
2006/03/19(日) 08:59:190567デフォルトの名無しさん
2006/03/20(月) 18:36:23ついこの間からは、ファイルも待たずにインストールできるようになったみたい。
http://www.franz.com/downloads/clp/survey
からダウンロード(無償)できる。
0568デフォルトの名無しさん
2006/03/20(月) 22:00:10What prompted today's visit to our Web site?
にはどう答えればよいのかな。other?
0569デフォルトの名無しさん
2006/03/21(火) 06:50:05Newsgroup をチェックしたあと、
隣にhttp://www.2ch.net/ って書けば?
0570デフォルトの名無しさん
2006/03/21(火) 16:48:000571デフォルトの名無しさん
2006/03/21(火) 16:59:450572デフォルトの名無しさん
2006/03/22(水) 09:38:07じゃ、http://www.franz.com/downloads/clp/survey
のOtherをチェックして
隣にhttp://www.2ch.net/ って書くのは?
0573デフォルトの名無しさん
2006/03/22(水) 09:47:29詳細:http://jp.franz.com/base/seminar-2006-03-27.html
開催日時: 2006年03月27日 (月) 13:30〜17:00
*スケーラブルな RDF triple store (セマンティックWeb構築)
*Lispアプリケーションの高速化を計る
*Lispを使ってのポータルサイト構築方法
0574デフォルトの名無しさん
2006/03/23(木) 15:00:190575デフォルトの名無しさん
2006/03/23(木) 15:05:22スキームならチキンやプチチーズも優秀。
コモンリスプならシーリスプとか商用でよければリスプワークスとか。
0576デフォルトの名無しさん
2006/03/23(木) 15:08:19ちょっとした間違いでコア吐いたりする。
0577デフォルトの名無しさん
2006/03/23(木) 15:34:00QSchemeは前コンパイルできなかったんですが、いろいろいじってみます。
GCC拡張を使ってますね。
SCMはマシンスタック、MzSchemeは非マシンスタックですよね。
非マシンスタックでスタック溢れた時、reallocするのとスタックをchunkに分けて
増やしていくのとではどっちがいいでしょうか? オーバーフローの時は後者の方が
いいんでしょうけど、総合的に見たら微妙ですかね。
あと、継続フレームだけマシンスタックにする手もあるかなあと思いました。
0578デフォルトの名無しさん
2006/03/26(日) 19:16:07http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1712.txt
0579デフォルトの名無しさん
2006/03/27(月) 13:43:30なぜ例-Aのほうはfooを変更しても結果が変わらないのに、
例-Bのほうはfooを変更すると結果が変わるのでしょうか?
;;; 例-A
(define foo begin)
(define bar (lambda (a b c) (foo a b c)))
(bar #t 0 1)
;;==> 1
(define foo list)
(bar #t 0 1)
;;==> 1
;;; 例-B
(define foo (lambda (m) (- m 3)))
(define bar (lambda (n) (foo n)))
(bar 10)
;;==> 7
(define foo (lambda (m) (+ m 3)))
(bar 10)
;;==> 13
0580デフォルトの名無しさん
2006/03/27(月) 14:42:16実装依存じゃないかな。
多くの実装がなぜそうなってるかは実装者の気持ちになって考えてみれば
わかると思うが。
0581デフォルトの名無しさん
2006/03/27(月) 14:55:16Bは変わらなきゃだめ、
Aは (define foo begin)が普通はエラー。
0582デフォルトの名無しさん
2006/03/27(月) 15:51:51自分で実装してみればわかる、と書かないと通じないと思われ。
なぜなら実装者の気持ちになるために必要な知識が欠けているだろうから。
>>581
何をもって普通とするのかよくわからんが、
処理系の動作としてはエラーにはならんことが多いでしょ。
0583デフォルトの名無しさん
2006/03/27(月) 16:23:23どんな処理系使ってるのかしらんが。
エラーになる: SCM MzScheme scheme48 csi bigloo ksi
エラーにならない: Gauche guile STk
Aみたく扱うのはマクロ使えばできる。
適当にいじった感じだと guileと STkは一度高階関数に syntaxが渡されると
以降その動作になるっぽい。
0584デフォルトの名無しさん
2006/03/27(月) 22:10:59いろいろご意見をありがとうございます。
Schemeの話ですので、どうしても実装絡みの
話になるとは思いますが、実装から離れて、
「理想的なSchemeマシン」なら、579の二例に
対して論理的にどのような挙動をとるべき
なのでしょうか?
もし明確な規定がないのなら、どのように
振る舞うのがより好ましいのでしょう?
0585デフォルトの名無しさん
2006/03/27(月) 22:20:57必要なら君が定義すればいい。
0586デフォルトの名無しさん
2006/03/27(月) 22:21:01同じスコープの定義は「同時」と考えるべきと思われ。
よって>>579は「未定義」とするのが妥当かと。
0587デフォルトの名無しさん
2006/03/27(月) 23:11:26定義が同時であるという解釈は、この例ならば成立するが、問題の本質はそこ
にないと思う。
二度目の define を set! にしたらどうなるべきだと思う?
0588586
2006/03/27(月) 23:25:30set!で束縛した方が優先されるべきじゃないかな。
defineを「初期化」のイメージで捉えた。
だいぶん主観で言ってることは承知してる。
set!が複数の場合はやっぱり「未定義」
0589デフォルトの名無しさん
2006/03/27(月) 23:49:36の素人です。遅延評価ってUNIXのパイプ処理みたいなもの、
と思っていいですか?
0590デフォルトの名無しさん
2006/03/27(月) 23:55:21どのへんを「みたいなもの」といってるのかよくわからん。
そういういいかげんな連想に頼るのはヤメレ。
どういった点で「みたいなもの」と考えるのかはっきりさせろ。
0591デフォルトの名無しさん
2006/03/28(火) 00:09:46スマソ。
UNIXのパイプ処理って複数のプロセスが同時に走って
少しづつデータを処理するじゃないすか。
で、それぞれのプログラムはstdioだけ気にすりゃいいから簡単。
遅延処理も同時に複数の関数が必要なデータを
同時に処理するもので、普通の関数が全部評価しおわるまで
値が返らないのとは違う、
と思ったんですが全然違ってます?
0592デフォルトの名無しさん
2006/03/28(火) 00:19:06味ではまったく外しているわけではないとも言えると思う。ぐぐってみればわ
かるよ。
なので、「思っていいですか?」と問われればあなたがそうだと思うことにつ
いては禁止する人は少ないと思うが、完全に一致するものでは(当然)ないから、
その理解でストップしてしまうことはおすすめしない。
0593デフォルトの名無しさん
2006/03/28(火) 01:37:21まあ安易な喩えで満足するのではなく自分で学んでくれ。
0594デフォルトの名無しさん
2006/03/28(火) 11:04:43おかげで遅延評価がわかってきたような気がする。
ありがとう。
0595デフォルトの名無しさん
2006/03/28(火) 22:07:49さすらいのLisper登場キボン。
0596デフォルトの名無しさん
2006/03/28(火) 22:59:56(define (gtarai x y z)
(gtarai
(gtarai (- x 1) y z)
(gtarai (- y 1) z x)
(gtarai (- z 1) x y)
))
(define (tarai x y z)
(if (<= (force x) (force y))
(force y)
(tarai (delay (tarai (- (force x) 1) y z))
(delay (tarai (- (force y) 1) z x))
(delay (tarai (- (force z) 1) x y)))))
0597デフォルトの名無しさん
2006/03/29(水) 12:59:46っておい!無限ループじゃねーかyo!!!
0598デフォルトの名無しさん
2006/03/29(水) 13:30:480599デフォルトの名無しさん
2006/03/29(水) 14:34:200600デフォルトの名無しさん
2006/03/30(木) 03:31:150601デフォルトの名無しさん
2006/03/30(木) 20:42:23Gauche, DrScheme, JSchemeでは末尾再帰のが速いのに。
0602デフォルトの名無しさん
2006/03/30(木) 21:56:340603デフォルトの名無しさん
2006/03/30(木) 23:55:470604デフォルトの名無しさん
2006/03/31(金) 00:52:54普通の制御式はCと同じぐらい。
0605デフォルトの名無しさん
2006/03/31(金) 01:21:140606デフォルトの名無しさん
2006/03/31(金) 21:29:57http://hiratch.net/blog/archives/computer/programing/scheme/
Scheme のネイティブコンパイラって殆どないんだよね。
CL は CLISP 以外のメジャー所は全部ネイティブコンパイラなのに。
0607デフォルトの名無しさん
2006/03/31(金) 22:27:06taraiは良く例としてみるけどさ、
関数型言語界隈でしか聞かないんだよな…
贅沢言ってすまんがおれのような
非リスパーが感動するような遅延評価の例って無い?
0608デフォルトの名無しさん
2006/03/31(金) 23:22:41過去スレで遅延評価版たらいまわしのC++コードがあったよ。
#include <iostream>
using namespace std;
class tarai {
const int x, y;
const tarai* tp;
public:
tarai(int y)
: x(y), y(y), tp(NULL) {}
tarai(int x, int y, const tarai& t)
: x(x), y(y), tp(&t) {}
operator int() const {
return (x <= y) ? y :
(int) tarai(tarai(x-1,y,*tp),
tarai(y-1,*tp,x),
tarai(*tp-1,x,y));
}
};
int main(void) {
cout << tarai(192, 96, 0);
return 0;
}
0609デフォルトの名無しさん
2006/03/32(土) 00:14:02同等なコードに最適化していいなら
(defun tarai (x y z)
(if (<= x y) y (if (<= y z) z x)))
になるわけだし。
0610デフォルトの名無しさん
2006/03/32(土) 01:23:57ttp://mono.kmc.gr.jp/~oxy/hiki.cgi?Lazy+Evaluation
このへんとか? 循環的な定義が書けるよ、っていう話。
#ページのタイトルはRubyのある風景だけどHaskellの話です。
0611デフォルトの名無しさん
2006/04/02(日) 18:29:06carとcdrの読み方を知って愕然としたんですが
cadarとかはどう読むんですか?
0612デフォルトの名無しさん
2006/04/02(日) 18:38:56シーエーディーエーアール
0613デフォルトの名無しさん
2006/04/02(日) 20:01:56カダーだろ。
0614デフォルトの名無しさん
2006/04/02(日) 20:52:33cadrは?
0615デフォルトの名無しさん
2006/04/02(日) 20:55:53カダーだろ。
0616デフォルトの名無しさん
2006/04/02(日) 21:53:170617ひらっち
2006/04/03(月) 20:50:05何人かの人にチェックして貰ってるみたいですが、最近はあまり進んでなくて申し訳ないです。
今は参考書や論文を読んでる。
ネイティブコンパイラですが、Kyoto Common Lisp の頃にはすでに Lisp 界隈ではトランスレータが流行ってたみたいですね。低レベルなところの最適化と移植性はCコンパイラに任せて、それより上の実装に専念できるので、処理系の開発者には嬉しいのでしょう。
0618デフォルトの名無しさん
2006/04/03(月) 21:40:02これはIBM 7090のコードを出力するネイティブコンパイラだ。
0619デフォルトの名無しさん
2006/04/04(火) 18:19:46ここで使われている
(define (hello-kahua)
(html/ (head/ (title/ "hello kahua!"))
(body/ (h1/ "Hello Kahua!"))))
みたいなのって、SXMLですか?チュートリアルには特にSXMLに言及はしてなかったのですが、よく似てるので。
あと、Kahuaの場合はタグの属性はどうやって指定するんですか?
0620デフォルトの名無しさん
2006/04/04(火) 18:40:22つ http://www.kahua.org/cgi-bin/kahua.fcgi/kahua-web/show/doc/Modules/kahua.elem#H-vtqime
0621デフォルトの名無しさん
2006/04/05(水) 13:54:15たとえば乱数を生成したい場合、Chez Scheme は random、Gauche では
SRFI-27 の random-integer を使うようなので、トップレベルで
(if random
(define random-integer random)
(use srfi-27))
みたいに書いておければいいのかと思ったんだけど、これではエラーに
なってしまうし。
0622デフォルトの名無しさん
2006/04/05(水) 14:17:56SRFI-0 の cond-expand を使うべし。
0623デフォルトの名無しさん
2006/04/05(水) 14:59:59おおー、さんくす!
、、、でも Chez Scheme には cond-expand がないのでダメぽ。
0624デフォルトの名無しさん
2006/04/05(水) 15:15:44chez 事情はよく判らんけれど、 slib でどうかな?
http://www.swiss.ai.mit.edu/~jaffer/SLIB.html
http://www.swiss.ai.mit.edu/~jaffer/slib_7.html#SEC249
0625デフォルトの名無しさん
2006/04/05(水) 17:45:19それともSQLよりもっと便利なデータベース言語(マクロ?)とか
ライブラリとかがあってそれを使っているんでしょうか?
0626デフォルトの名無しさん
2006/04/05(水) 21:05:48「関係データベース」が必要なときは使うんじゃないですかね。
0627デフォルトの名無しさん
2006/04/06(木) 12:28:07かだああ
0628デフォルトの名無しさん
2006/04/06(木) 15:57:37#1# みたいなのを使うことがあるみたいですが
これの説明をしてるサイトってありませんか?
gensymの代わりってのはなんとなくはわかるんですが、
念のためちゃんとした説明を見たいんです。
0629デフォルトの名無しさん
2006/04/06(木) 16:09:47#n# は #n= でラベル付けされたものを参照する。
[CLtL2日本語版474ページ]
0630デフォルトの名無しさん
2006/04/06(木) 21:20:19さんくす。SXMLとは関係なく、ただの関数だったんですね。
0631デフォルトの名無しさん
2006/04/07(金) 03:13:50これってレジスタマシンなんでしょうか。
それとも Gaucheみたいにグローバル変数をインライン展開してるから速いんでしょうか。
0632デフォルトの名無しさん
2006/04/07(金) 06:48:200633デフォルトの名無しさん
2006/04/07(金) 12:46:04そうですか。ありがとうございます。
direct threaded codeというと GCC拡張の &&を使ってるんでしょうか。
switch-case と比べて結構違うものなんですかね。
あと一般的にスタックマシンよりレジスタマシンの方が速いですよね。
コンパイルは難しそうですが。他にもキューマシンっていうのがあるみたいです。
0634デフォルトの名無しさん
2006/04/08(土) 13:35:24少ししか速くなりませんでした。
petiteは異様に速いので
1. StackGC
2. Register Machine
3. インライン展開
辺りかなあと思いました。
Gaucheは -fno-inline-globalsありと無しとで速度が全然違うのでこれかもしれません。
とりあえず Kent氏の論文を読んでみます。
0635デフォルトの名無しさん
2006/04/08(土) 14:00:450636デフォルトの名無しさん
2006/04/09(日) 13:49:57ネイティブコンパイラ書いても速いインタプリタの10倍速くするのは相当難しいぞ
0637デフォルトの名無しさん
2006/04/09(日) 15:23:21(define loop (lambda (n) (if (= n 0) 0 (loop (- n 1)))))
(loop 2000000)
(define loop2 (lambda (n a b c d e f g h i j k l m r o p q) (if (= n 0) 0 (loop2 (- n 1) a b c d e f g h i j k l m r o p q))))
(loop2 2000000 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)
この二つのベンチマークを比較すると、
SCM: 0.50s 2.67s
MzScheme: 0.63s 1.16s
Gauche: 0.30s 0.91s
Scheme48: 1.09s 1.66s
Guile: 2.99s 9.37s
自作: 0.70s 1.19s
Petite: 0.33s 4.64s
となります。
0638デフォルトの名無しさん
2006/04/09(日) 15:29:55(その割に Gaucheであまり差がないのは不思議です。-fno-inlineを付けるともっと微妙になりますし
今のGaucheは引数シフトじゃないのかも?)
自作のは引数シフトじゃなくオリジナル(誰かがやってるかもしれないけど)のやり方なのであんまり差が
ありません。
petiteは極端に差があるので、引数シフトでもない別のやり方かもしれませんが。
0639デフォルトの名無しさん
2006/04/10(月) 17:50:46shiroさんの昔の日記
ttp://www.lava.net/~shiro/Private/diary/0010.html#001019
>独自のクエリー言語も、ドキュメントを書いてサポートしてさらには布教して
>SQLに対する優位性をアピールするという広報活動が重要になる。
>そこまで手がまわらない。SQLなら「本買って読んどいて」で済むのに。
0640デフォルトの名無しさん
2006/04/12(水) 10:06:37(define cont #f)
(define (bar)
(let ((a 0) (b 0))
(set! b (call-with-current-continuation
(lambda (k) (set! cont k)
0)))
(set! a (+ a b))
a))
(define (print x) (write x)(newline))
(define (foo)
(print (bar))
(print (cont 1)))
(foo)
を実行すると、継続を呼び出すごとにaの値は変わっていくけど、
guileとかのCのスタックをコピーする継続の実装を使ってbarを
SCM cont;
int bar() {
int a=0,b,first;
b = scm_make_continuation(&first);
if (!first) { a = a+SCM_INUM(b); } else { cont = b; }
return a;
}
としたら、何回contに飛んでもaは最初に作ったコピーから書き戻されるから
変わらないよね。どっちが正しいの?
0641デフォルトの名無しさん
2006/04/12(水) 12:22:22未定義。処理系依存。
トップレベル環境での継続の保存は使わないのが吉。
0642デフォルトの名無しさん
2006/04/12(水) 12:28:470643デフォルトの名無しさん
2006/04/12(水) 14:15:280644デフォルトの名無しさん
2006/04/12(水) 14:50:35馬鹿の一つ覚えだな。
0645デフォルトの名無しさん
2006/04/12(水) 15:50:58トップレベルの意味わかってる?
馬鹿はおまえだ。
0646デフォルトの名無しさん
2006/04/12(水) 16:41:000647デフォルトの名無しさん
2006/04/12(水) 16:46:100648デフォルトの名無しさん
2006/04/12(水) 18:08:30前者。
後者では書き戻されて欲しくない変数 a b を SCM_VARIABLE_* を使って
環境に入れないとだめなんじゃない?
0649デフォルトの名無しさん
2006/04/12(水) 21:49:49トップレベルとはトップのレベルということだ。
すなわちサッカーならマラドーナ、ボクシングならマイクタイソン。野球なら王さんと
いうことだ。
0650デフォルトの名無しさん
2006/04/12(水) 22:19:01なんで野球だけアジア限定なのとかおもったらWBCで監督として世界一だったんだね。
僕はモルツでいいからもう一度一本足打法がホームランを打つところを見たいと思う。
0651デフォルトの名無しさん
2006/04/13(木) 04:18:400652デフォルトの名無しさん
2006/04/13(木) 04:53:010653デフォルトの名無しさん
2006/04/13(木) 09:24:46>>640 に真面目に答えると、guileの方のCコードが間違ってる。
>>648 のが正解。環境が変更される場合は変更される変数の実体を
別にヒープアロケートしておく必要がある。SCM_VARIABLE_* を
使わずに自分で何かアロケートしてもいいんだけれども。
さらに詳しく説明すると、本来「全ての」環境は継続スタックとは
別にアロケートされて共有されないとだめ。ただし変更を受けない変数に
ついてはコピーを持っててもいいから、最適化として書き戻される
スタックに直接保持しても構わない。
どのローカル変数が書き換えられるか静的にわかるから、Cへの
トランスレータでSCM/Guile方式の継続を使っている処理系なら
変更を受けるローカル変数だけ特別扱いしてるよ。適当な処理系の
出すコードを読んでみ。
0654デフォルトの名無しさん
2006/04/13(木) 16:12:15またそのサイトを見たいんですけどURLとか処理系の名前とかを忘れてしまいました。
フレームが使ってあってリンクの文字色は黄色だったと思います。背景は若干暗かったです。
そのサイトを知りませんか?
0655640
2006/04/13(木) 17:46:59ありがとうございます。
環境のスナップショットは継続には含んじゃいけないんですね。
> どのローカル変数が書き換えられるか静的にわかるから、Cへの
> トランスレータでSCM/Guile方式の継続を使っている処理系なら
> 変更を受けるローカル変数だけ特別扱いしてるよ。適当な処理系の
> 出すコードを読んでみ。
例えばどの処理系がこれにあたるのでしょうか?
0656デフォルトの名無しさん
2006/04/13(木) 19:20:15まだ手に入るだろうか。R3RSかR4RSの時代のものだったが。
0657デフォルトの名無しさん
2006/04/13(木) 20:46:10http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/scheme/impl/scheme2c/0.html
0658デフォルトの名無しさん
2006/04/13(木) 21:37:41fib, tarai, ack 以外になにがありますか?
0659デフォルトの名無しさん
2006/04/13(木) 21:42:20フレーム構造の性能を計りたい時という意図がいまいちわからんけど、
とりあえず Gabriel の本に載ってるベンチマークは全部やってみたら?
0660デフォルトの名無しさん
2006/04/13(木) 21:59:01>フレーム構造の性能を計りたい時という意図がいまいちわからんけど、
継続や引数を積んでジャンプしたり、末尾呼び出しをしたりといった
基本的な性能を計りたいです。
>とりあえず Gabriel の本に載ってるベンチマークは全部やってみたら?
そんなものがあるとは知りませんでした。
"Performance and Evaluation of Lisp Systems" というやつでしょうか。
ネットでは読めないんでしょうか。図書館で探してみます。
0661デフォルトの名無しさん
2006/04/13(木) 22:03:25http://www.amazon.co.jp/exec/obidos/ASIN/4526024937
Performance and Evaluation of LISP Systems
http://www.amazon.co.jp/exec/obidos/ASIN/0262571935
だね。ちょっと古いけど Lisp ベンチマークの業界標準だ。
0662デフォルトの名無しさん
2006/04/13(木) 23:00:49http://www.roy.hi-ho.ne.jp/pastel/home/Lisp/index.html
これだな。
0663デフォルトの名無しさん
2006/04/14(金) 10:43:00そこでした。ありがとう!
0664デフォルトの名無しさん
2006/04/14(金) 22:30:07OpenMCL for x86-64/Linux のテスター募集してるみたい。
リリースまではまだしばらく時間が掛かる感じだけど。
0665デフォルトの名無しさん
2006/04/15(土) 02:40:530666デフォルトの名無しさん
2006/04/15(土) 06:49:17shiroたん乙
0667デフォルトの名無しさん
2006/04/15(土) 10:26:55--enable-encodingを付けるとよいみたい。
0668デフォルトの名無しさん
2006/04/15(土) 22:55:30http://d.hatena.ne.jp/higepon/19700103/1145105233
0669デフォルトの名無しさん
2006/04/16(日) 05:56:11遅レスですが。
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/bench/gabriel/0.html
0670デフォルトの名無しさん
2006/04/16(日) 10:21:57ありがとうございます。
自作のSchemeはまだ pair型を作ってない状態でして、
納得できるまで速くなってから先に進もうと思ってます。
gabriel benchmarkだとtakぐらいしか使えないみたいでした。
ちなみに左から (fib 33) (tak 18 12 6) (ack 3 9) (loop 2000000) (loop2 2000000)で
5.79s 5.28s 5.25s 0.65s 1.11s original
4.45s 5.36s 6.50s 0.51s 2.68s scm
5.38s 5.37s 6.51s 0.63s 1.20s mzscheme
2.67s 2.91s 4.86s 0.32s 0.91s gosh
2.45s 3.19s 2.66s 0.32s 4.66s petite
という感じです。CPSみたいに closure作りまくるベンチの性能はかなりいいんですが
continuationを実装すると変わる可能性もあるのでなんとも言えないです。
0671デフォルトの名無しさん
2006/04/16(日) 18:25:444.42s 0.05s xxxxx 0.49s 2.44s OpenLisp
0.63s 0.02s 0.54s 0.06s 0.10s SBCL
です。OpenLisp は(ack 3 9)だと stack over flowで (ack 3 8)だと
1.09sでかなり速いです。
特に takとackの速さが圧倒的なのが気になります。
LISP勢の方が速いのは継続がないからできる最適化ですかね。
あと、TISLは今は手に入らないんでしょうか。
0672デフォルトの名無しさん
2006/04/16(日) 18:28:12>It may subsequently alter any such binding by an assignment (see see section 4.1.6 Assignments).
>These operations do not modify the behavior of Scheme's built-in procedures.
>Altering any top-level binding that has not been introduced by a definition has an unspecified
>effect on the behavior of the built-in procedures."
(define + (lambda (n) n))
は未定義としても
(define a +)
(define a (lambda (n) n))
これも未定義なんでしょうか?
0673デフォルトの名無しさん
2006/04/16(日) 19:25:500674デフォルトの名無しさん
2006/04/17(月) 00:08:10| LISP勢の方が速いのは継続がないからできる最適化ですかね。
Scheme の言語仕様はまだコンパイラの事考えてないからねぇ
R7RS あたりを待て。
0675デフォルトの名無しさん
2006/04/17(月) 00:30:32>Scheme の言語仕様はまだコンパイラの事考えてないからねぇ
そうなんですか。コンパイラで思い出したんですが Shiroさんのとこに書いてある
>同じソースファイルを、インタプリトした場合とコンパイルした場合に、
>全く同じ動作を保証するのは見かけほど自明な話ではない。
っていうのにとても興味があるんですが意味よくが分かりません。
一式づつコンパイルすればいいってことじゃないんですかね。
(load)があると駄目とか?(loadの意味を今いち理解してないんですが)
なんか論理学チックな匂いがする気もします。
0676デフォルトの名無しさん
2006/04/17(月) 00:44:11Common Lispのeval-whenに相当するものが必要になるケースもあり得る。
0677デフォルトの名無しさん
2006/04/17(月) 01:06:12なるほど。define-syntaxってトップレベルでしか使えないのにload やevalで使えちゃう
って変じゃないですか?
Schemeのややこしさってほとんどトップレベルに起因すると思うんですよ。
トップレベルは開発環境のためにあるようなものだと思うので、コンパイル時には邪魔なだけっていう。
let, letrec, let-syntax, letrec-syntaxあたりだけで書けばずいぶんすっきり
すると思うんですけどね。
0678デフォルトの名無しさん
2006/04/17(月) 04:07:22ええっ?
むしろ1980年代には、実装の関心はコンパイラになかったっけ。
RabbitとかTとか。PC上でもTIが出してたやつとか。
インタプリタがこんだけ広く使われるようになったのが
最近のような気がする。
仕様としてCLほど厳密にコンパイル時の動作を決めていないってのは
あるけれど、それはThe Right Thingを決めるにはまだ経験が足りないって
ことであって、コンパイラのことを考えてないってんじゃないと思うなあ。
evalがR5RSまで入らなかったのも、モジュールシステムが未だに無いのも、
コンパイラのことを考えて (考え過ぎて?) いるからでしょ。
0679デフォルトの名無しさん
2006/04/17(月) 11:19:310680デフォルトの名無しさん
2006/04/17(月) 13:00:180681デフォルトの名無しさん
2006/04/17(月) 13:26:460682デフォルトの名無しさん
2006/04/17(月) 13:57:470683デフォルトの名無しさん
2006/04/17(月) 17:06:51今日図書館で論文を読んでいたらその話が書いてありました。
"Weak Consを用いたマクロ再定義時の自動再コンパイル"
というやつです。
マクロや関数の依存関係をグラフで持っておいて、マクロが
定義されると依存関係にあるマクロ、関数を再定義、再コンパイル
するというものです。これによってコンパイラでも最新のマクロ
定義が使えます。
思ったんですが変数にも同じことができるんじゃないでしょうか。
定数を埋めこんだり、手続きをインライン展開できたりします。
再コンパイルが起きまくるようなコードを書くことも可能なので
再コンパイルはlazyの方がいいかもしれません。
SBCLで disassembleしてみたところ、そのような最適化はされて
いないようでした。
0684デフォルトの名無しさん
2006/04/17(月) 17:09:22disassembleじゃあるかどうかわからないと思うけど。
そういうグラフがあったとしても、関数のコードの外部に持つから。
0685デフォルトの名無しさん
2006/04/17(月) 17:19:09えっと
(setq a 3)
(defun f (n) (+ n a))
(disassemble 'f)
や
(defun g (n) (+ n 1))
(defun h (n) (+ 2 (g n)))
(disassemble 'h)
とかしてもaが埋めこまれたり、gがインライン展開されたり
していなかったからです。
0686デフォルトの名無しさん
2006/04/17(月) 17:27:55(defmacro test (x) `(+ ,x 1))
(defun f (n) (+ 2 (test n)))
(disassemble 'f)
(defmacro test (x) `(+ ,x 10))
(disassemble 'f)
でも fは変わっていませんでした。
上の論文では変わらなきゃいけないと書いてあったと思うんですが、
Common Lisp的にこれはOKなんですかね?
0687デフォルトの名無しさん
2006/04/17(月) 22:43:57ちょっと古いけど、ベンチ。
http://www.cs.bath.ac.uk/~jap/ak1/youtoo/Bench/
とくに Bigloo の場合、コンパイラ用にコードに型情報を付加できたり、floating point 専用の関数 fl+, fl-, fl< ... のようなものが付いてきたり、かなりアグレッシブな処理系です。
もちろん互換性だとか Scheme のシンプルな美しさは失われますけど。また、今どきの Scheme にしてはややライブラリが少ないです。
ちょっと使った印象としては、Scheme で数値処理などを中心に行いたければチェックしてみてみる価値はあります。
私の場合、そこまでするくらいなら Scheme 使わなくていいやと思って、SBCL を採用しましたが。
0688デフォルトの名無しさん
2006/04/18(火) 02:29:06OK なんじゃない?新しい定義使いたきゃコンパイルしなおせばいいだけでしょ?
0689デフォルトの名無しさん
2006/04/18(火) 03:05:29実用的なプログラムで使っても、プロセスのスタック足りる?
とくにLisp/schemeじゃなくて普通の言語で書いた場合とか。
0690レス分割スマソ
2006/04/18(火) 03:07:460691デフォルトの名無しさん
2006/04/18(火) 03:33:12足りるわけないだろ。
普通はスタックの GC を行う。
0692デフォルトの名無しさん
2006/04/18(火) 09:32:09…って、CPSでスタックにゴミなんて発生するの?普通に全部戻ると思うんだけど。
関数末尾での呼び出しは、ゴミ以前にそもそも最初からスタックに積む必要はなさそうだし。
0693デフォルトの名無しさん
2006/04/18(火) 13:10:53環境をヒープにとるならともかく。
0694デフォルトの名無しさん
2006/04/18(火) 17:58:10OpenLispはコンパイルしなおさなくても新しいマクロが反映して
clispはコンパイルしなおせば反映するんですが SBCLはコンパイルしても古いままです。
>>689
CPSだとスタックの消費がクロージャセル+環境の消費になります。
環境全体を保存すると 環境の消費 >= スタックの消費 なのでメモリ消費は減らないと思います。
クロージャから参照されている変数だけ環境に保存すれば減ると思います。
schemeなら末尾呼び出しでいいですけど末尾呼び出しが最適化されていない言語では
他の方法を考えないといけません。
>>691 >>693
意味わからん。
関数の再コンパイルもコンパイルにかかる時間とそれで得する時間を考えると
自動化は難しいのかもしれないです。
compile! expr levelで(compile! f 3)みたいに手動ですればいいのかも。
0695デフォルトの名無しさん
2006/04/18(火) 18:30:210696デフォルトの名無しさん
2006/04/18(火) 18:48:44コンパイルしなおすっていうのはもう一回 defunの式を書くってことですね。
(compile 'f)としていたので古いマクロが使われてました。
clispはデフォルトで(compiled-function-p #'f)がNILなので新しいマクロが
使われているだけでした。
しかしこれでは evalや loadでマクロが定義された時の動作が処理系依存に
なるような。CommonLispのことは全然知らないので外してるかもしれませんが。
Schemeでもいろいろ調べてみます。
0697デフォルトの名無しさん
2006/04/18(火) 22:55:00> clispはデフォルトで(compiled-function-p #'f)がNILなので新しいマクロが
> 使われているだけでした。
そりゃコンパイルしてないってことじゃ?
それと sbcl って repl 上でも on the fly でコンパイルするんじゃなかったっけ。
ええと、何はともあれその辺の微妙な挙動を詰めたいなら、
仕様書をちゃんと当たっといた方がいいかと。
http://www.lispworks.com/documentation/HyperSpec/Body/03_b.htm
0698デフォルトの名無しさん
2006/04/19(水) 21:46:320699デフォルトの名無しさん
2006/04/19(水) 23:22:23ドキュメントもちゃんとShiroさんが書いたの入ってたと思うけど。
スタブジェネレータとか既存のスタブで勉強しないで手取り足取り親切に
教えてくれるようなのを期待してるとしたら多分ない。
この辺のAPI見直す予定ってアナウンスされてるからそれまで待てば?
0700デフォルトの名無しさん
2006/04/19(水) 23:50:19あ、ほんとだ。READMEにも説明書いてありますね。
ネット上だけ探してた…
0701デフォルトの名無しさん
2006/04/20(木) 12:58:43> Scheme にしてはややライブラリが少ないです。
bigloo-lib http://bigloo-lib.sourceforge.net/(ダンロードhttp://sourceforge.net/project/showfiles.php?group_id=3455)
もあります。
内部にHaskellのような型システムを持っているのでbiglooとCの型から新しい型を定義することも可能ですが、ドキュメント化されてません。bigloo-libの人達が「ドキュメント化してくれ〜」と言っても「未完成だからドキュメント化しない」と答えて6年以上になるでしょうか。
bigloo-libのSRFIですら取り込まれる気配が無いし、*bigloo-version*のような基本的なシンボルをChangeLogに書かずに消してしまってbigloo-libがコンパイルできなくなったりとか、孤高の天才の高性能コンパイラ、という印象です。
0702デフォルトの名無しさん
2006/04/20(木) 13:23:17>Scheme で数値処理などを中心に行いたければチェックしてみてみる価値はあります
biglooでデータ構造の最適化をしようとするとCの型が増えていきますが、書いているうちに制限の多いCでコーディングしているような錯覚に陥って、なんでこんなことしてるんだろうと思ったこともあります。
>Scheme のシンプルな美しさは失われますけど。
A practical Scheme compilerとあるように、美しさではなくて簡単にCと共存できる実用性を目指している処理系だと思います。Xlib.hを読み込んでbiglooのインクルードファイルが平気で生成されたときにはびっくりしました。
何かまともなことをやろうとすると独特のコーディングが要求されるので、それに慣れるまでけっこう大変だと思います。私がいじってた頃はインタプリタのreplが末尾再帰でなかったので途中でやめてしまいましたが。
アグレッシブと言うよりアレゲかもしれません。名前はstalinに負けてますが。
ただし出来上がってしまえば、やたらにパフォーマンスのいいものが出来ると思いますよ
0703デフォルトの名無しさん
2006/04/20(木) 15:14:02補足しておくとbiglooの型システムはbigloo上のオジェクトシステムとは別物です。
bigloo本体を書換えずにプリミティブを作成したり、既存型を拡張したりできます。
type、subtype、coerceなどのキーワードが出てきます。
bigloo-libのcgenがbiglooへのプリプロセッサとして型に対する細々とした操作を
代りにやってくれます。
ChangeLogのバグフィックスが気にならなければ、少し古いbiglooでbigloo-libの
コンパイルは可能だと思います。
biglooがbigloo-libとの連携さえしっかりしてくれれば、またbiglooやりたいと
思ってます。bigloo-libのコンパイルで失敗する度にbigloo-libの人達の気持を勝手に
想像して、暗い気分になるのが嫌なだけかもしれません。それも思い込みで。
期待しすぎてコケたので否定的なことを書きましたが、biglooにはいじれる所がたくさん
あるので、最初はschemeだとは思わずに遊んでみると幸せになれるんでないでしょうか。
0704デフォルトの名無しさん
2006/04/20(木) 22:16:30bigloo って INRIA でしょう?
良く知らないけど INRIA の本命は OCaml じゃないのかなあ。
0705デフォルトの名無しさん
2006/04/20(木) 22:30:39INRIAだって大組織だからいろんな先生が居るだろうし、統一した意思を
持っているとはとても思えない。
0706デフォルトの名無しさん
2006/04/21(金) 00:01:26http://smarteiffel.loria.fr/
これも C or Java に変換する系
0707デフォルトの名無しさん
2006/04/21(金) 03:13:42末尾再帰の最適化がきちんとされる言語ならば。
例えばluaはそう。
0708デフォルトの名無しさん
2006/04/21(金) 09:20:35lua sugeeeeeeee!!!!
0709デフォルトの名無しさん
2006/04/22(土) 03:12:34>とくにLisp/schemeじゃなくて普通の言語で書いた場合とか。
普通の言語ってのがよくわからんが、luaは普通の言語なの?
とりあえずメジャーな言語だと、Javaが処理系依存だけど末尾再帰を最適化してた。
たしかIBMのVM、SUNはやってなかったと思う。
0710デフォルトの名無しさん
2006/04/22(土) 05:05:25言語仕様として要求される事は少ないですね。関数型言語くらい?
0711デフォルトの名無しさん
2006/04/22(土) 08:56:260712デフォルトの名無しさん
2006/04/22(土) 09:04:59http://www.lsharp.org/
0713デフォルトの名無しさん
2006/04/22(土) 17:37:01普通の奴らの上を行け、を読んで
ハッカーはlispを習うもんだと洗脳されたので
GWにschemeを勉強しようと思うのですが
間違っていないですよね?
0714デフォルトの名無しさん
2006/04/22(土) 17:48:460715デフォルトの名無しさん
2006/04/22(土) 17:52:03GW 中に SICP 読破できれば完璧です。
0716デフォルトの名無しさん
2006/04/22(土) 18:49:18luaはふつ〜の言語だよおw
JavaScrpit似でゲームに組み込まれてる言語の中では一番メジャー
0717デフォルトの名無しさん
2006/04/22(土) 19:39:56もうちょっとでかい字で印刷してほしかったと思った。
眼鏡新調かのぉ
0718デフォルトの名無しさん
2006/04/22(土) 19:45:34Larceny って地味に更新されてるのね。IA32 向けのアセンブリ出力
出来るようになってたの知らんかった。
0719デフォルトの名無しさん
2006/04/22(土) 19:51:38関数型言語でも、言語仕様で末尾最適化が明記されてるのは稀だとおもう
HaskellもOCamlも当たり前のように最適化を行うけど、言語仕様には含まれてなかったような・・・
(間違ってたらスマソ)
0720デフォルトの名無しさん
2006/04/22(土) 21:31:010721デフォルトの名無しさん
2006/04/23(日) 02:35:510722デフォルトの名無しさん
2006/04/23(日) 02:37:410723デフォルトの名無しさん
2006/04/23(日) 03:39:510724デフォルトの名無しさん
2006/04/23(日) 09:52:46強制だ。
0725デフォルトの名無しさん
2006/04/23(日) 10:33:35Dr.Schemeを代わりにインストールした。
学習目的にはいいかも。他にもおもちゃ的要素があって楽しい。
0726デフォルトの名無しさん
2006/04/23(日) 13:53:020727デフォルトの名無しさん
2006/04/23(日) 14:37:28そこは笑うところじゃないだろ。
0728デフォルトの名無しさん
2006/04/26(水) 02:34:15自分はエラー処理は当初はabort一択、GCもさっぱり忘れて
作り始めて、ある程度形になるまではそのままいっちゃうんですが。
0729デフォルトの名無しさん
2006/04/26(水) 05:42:01ありか/conservativeで行くか明示的にprotectするか/SCMみたいに
固定長ヘッダだけ自前で管理して後はmallocに任せるか、それとも
全て自分で面倒みるか、等) だけは決めとかないときつくない?
0730デフォルトの名無しさん
2006/04/26(水) 16:43:45(concat "foo" 123 '("a" "b" "c"))
が
"foo123abc"
になるような感じです。
0731デフォルトの名無しさん
2006/04/26(水) 17:42:10自分で書いてみました。初心者なんであまりうまくないでしょうけど。
(define (string-concat list)
(if (eq? list '())
""
(string-append (car list)
(string-concat (cdr list)))))
(define (to-string val)
(cond ((string? val)
val)
((number? val)
(number->string val))
((boolean? val)
(if val "true" "false"))
((symbol? val)
(symbol->string val))
((eq? '() val)
"")
((list? val)
(string-concat (map to-string val)))))
(to-string '("foo" 123 #f 'symbol (10 20 30))) ;; 結果:"foo123falsequotesymbol10quote2030"
なんか、この程度なら標準関数にありそうな気はするんですけど。
というか、Shemeの入門ページはいくつかありますが、関数リファレンスみたいなのが見つからないです。
どこかによさげなのないですか。
0732デフォルトの名無しさん
2006/04/26(水) 17:54:05関数リファレンスなんてR5RS(とSRFI)を見ればいいじゃん。
0733デフォルトの名無しさん
2006/04/26(水) 19:28:19Gaucheのマニュアルが充実してる。
根拠になる規格(SRFI)の番号も付記してるから何かと便利。
Gauche使いでなくても手元にあって損はないと思うよ。
日本語でこれだけそろってる資料は少ないんじゃないかな。
0734デフォルトの名無しさん
2006/04/28(金) 10:59:55当方 SCM のインストールを試みているのですが、
build の途中で以下のメッセージが出て scmlit のプロンプトに入ってしまいます。
> ;In file loaded from /home/hoge/work/cvs/scm/Init5e2.scm:782:
> ;ERROR: "/usr/local/lib/slib/require.scm": unbound variable: *features*
> ; in expression: (cons (#@software-type) *features*)
> ; in scope:
> ; (provided? feature-list . #@define)
> ; (expression) procedure provided?
> ; defined by load: "/usr/local/lib/slib/require.scm"
>
> ;STACK TRACE
> 1; (#@define ((provided? (#@lambda (expression) (if (memq express ...
> 2; (#@cond ((#@slib:provided? (#@quote srfi)) (slib:provide (quot ...
> 3; (#@define ((hss (#@has-suffix? #@file (#@scheme-file-suffix))) ...
> 4; (#@load (#@in-vicinity (#@library-vicinity) "require"))
SCM だと特に slib の init を弄らなくていい、ということだったので、
てっきり簡単に build できるものと思っていたのに…。
slib 同梱の Template.scm に *features* のための configure だとかなんとか
書いてあったのでこれをどうにかするのでしょうか?
あと build のオプションも -F をいろいろ試してみましたが結果は同じ。
いかにも素人くさい質問なんですがご助力おねがい致します。
SCM -> cvs 先端
slib -> 3a3
環境 -> linux Kernel 2.6.16.11 (Archlinuxというマイナーなやつです)
0735デフォルトの名無しさん
2006/04/28(金) 19:30:47質問されても。しかもドキュメントもろくに読んでないっぽいな。
0736デフォルトの名無しさん
2006/04/28(金) 20:05:01ある程度の見通しは立てて、それを阻害しないような選択はするけど、
基本的には忘れます。
0737デフォルトの名無しさん
2006/04/28(金) 21:52:31まったくおっしゃる通りで返す言葉もございません。
release落としてやってみたらすんなり通りましたorz...。
ドキュメントは読んだんですが、エラーメッセージからしてきっと単純なミスなんだと
思い込み、あれかこれかと憶測で試みた後、結局自分の無理解を思い知らされた格好です。
それでも懲りずに質問なんですが、r4rstest.scm を走らせると
> errors were:
> (SECTION (got expected (call)))
> ((6 5 6) (#f #t (mult-float-print-test #f)))
> ((6 5 6) (#f #t (mult-float-print-test #f)))
> ((6 5 6) (#f #t (mult-float-print-test #f)))
> ((6 5 6) (#f #t (mult-float-print-test #f)))
> ((6 5 6) (#f #t (mult-float-print-test #f)))
というエラーが出ます。
どこかでこれは実行環境の浮動小数点数の入出力の精度によるもので、
大して気にすることはないとあったと思うのですが、そういうものでしょうか。
初心者が気にするようなところではないのでしょうが、
どうにかしようがあるのなら、どうにかしたい気がします。
0738デフォルトの名無しさん
2006/04/28(金) 22:02:13そんなに気になるならどういうテストだかちゃんと調べて自分の頭で考えて
みればいいじゃないか。謙遜かもしれんが、自分で自分を「初心者」と呼ん
でるうちは進歩しないぞ。
0739737
2006/04/28(金) 22:25:36そうですね。泣き言いわずに自分で頑張って調べてみることにします。
Bootstrap にするには良い取っ掛かりかも知れません。
どうもでした。
0740デフォルトの名無しさん
2006/04/28(金) 22:44:19どうせ使わないし
Cと同じ動作すればとりあえず実用上問題ないし
0741デフォルトの名無しさん
2006/04/28(金) 22:51:100742デフォルトの名無しさん
2006/04/28(金) 23:45:540743デフォルトの名無しさん
2006/04/29(土) 00:26:57ALUレベルから設計したくなるな。
0744デフォルトの名無しさん
2006/04/29(土) 01:19:07sinの精密な定義にえらい時間をかけてるとか。
0745デフォルトの名無しさん
2006/04/29(土) 05:27:17あれだ、Opteronのソケットに挿せるFPGA。
0746デフォルトの名無しさん
2006/04/29(土) 06:06:47まったく気にしないよりは気にした方がいいと思うけど、
気にしたからといって全ての問題が解決できるわけじゃないからね。
ここはそういうことがあったと心に留めておいて、ひとまずは先に進むのがいいのでは?
何をしたくてSCMをインストールしたのか知らないけど、目的はあったんでしょ?
0747デフォルトの名無しさん
2006/05/03(水) 16:32:37インタラクティブに実行できるのはいいんですが、C-pとか使えるようになってほしいんですけど。
0748デフォルトの名無しさん
2006/05/03(水) 16:45:28ledit
ttp://cristal.inria.fr/~ddr/
rlwrap
ttp://utopia.knoware.nl/~hlub/uck/rlwrap/
0749デフォルトの名無しさん
2006/05/03(水) 17:47:01Gauche-readline
http://www.netlab.is.tsukuba.ac.jp/~yokota/izumi/gauche/
0750デフォルトの名無しさん
2006/05/03(水) 20:02:00listの操作でいろいろなクイズ(パズル?)ありますよね。
あれでおもったんですが、ああいったlistの操作を群論にあてはめるような
研究(遊び?)ってないんでしょうか。
つまり、群論の最初でやる置換群を拡張したようなもの。
もしあるならば、任意のリスト遊びがある記号に対応し、
その記号を分解していくことで、
任意のリスト遊びが、記号の積で自明にあらわせないものかと。
こういうことは誰でもおもいつくものだから、
すでに誰かやっている、もしくはやっても意味無い事の説明でも
どこかにころがってないかな、と思い質問いたします。
0751デフォルトの名無しさん
2006/05/06(土) 04:31:14S式ってあるけど、Lispとは関係なさげ
0752デフォルトの名無しさん
2006/05/06(土) 17:29:33以前もプログラミング用語使った題名の作品をこの板で見たな。
0753デフォルトの名無しさん
2006/05/06(土) 18:35:530754デフォルトの名無しさん
2006/05/06(土) 18:39:260755デフォルトの名無しさん
2006/05/06(土) 20:58:480756デフォルトの名無しさん
2006/05/06(土) 22:53:40>惣一くん……足で踏まれて逝ってしまったり、無理矢理服を
>脱がされて全身の隅々までニオイを嗅がれて
>しまったりと、汚され過ぎですっ! うはっwwwをkwwww
どうやらLispとは関係なさそうです。
0757デフォルトの名無しさん
2006/05/07(日) 01:06:03OSはWinXPを考えております。今のところGauche-glぐらいしか知りません。
0758デフォルトの名無しさん
2006/05/07(日) 12:14:52R6RS はいつになるんだろう…
0759デフォルトの名無しさん
2006/05/07(日) 12:56:450760デフォルトの名無しさん
2006/05/07(日) 13:51:040761デフォルトの名無しさん
2006/05/09(火) 11:15:54mzscheme interfaceが、内蔵されました。
vim6の時点で、perl,python,rubyがdynamic linkされたvimを作ることが出来ましたが、
mzschemeは、そのまま、staticに取り込まれているみたいです。
詳しくは、vim7上で、
:help mzscheme
してみてください。
;;schemeの開発環境としては、どうなんでしょうね?
;;ここまで書いて気づいたけど、pythonもstatic linkっぽい。
0762デフォルトの名無しさん
2006/05/09(火) 11:56:56helpをもうすこし読んでみたら、上記の言語、(perl,python,ruby,mzscheme)の他に
tclも含めて、vimのエディターマクロっぽく使えるみたいですね。
(別途、vim scriptもあるんですが。)
エディターマクロっぽくっていうのは、エディターの環境/設定が変更できて、
バッファの内容が、操作できるって意味で使っています。
例を上げると、
(set-buff-line-list {start} {end} {string-list} [buffer])
みたいな関数が有りました。
と、言うことは、emacsみたいじゃーーん。scheme版のーー。
と、ちょっと興奮してしまいました。
;;すれ違いぽかったら、ごめんなさい。
;;けど、text操作なら、私的にはperlの方が楽チンかなぁ…。
0763デフォルトの名無しさん
2006/05/09(火) 17:59:33いつもはguileを終了して再起動してるんだけど、もっと簡単な方法ない?
0764デフォルトの名無しさん
2006/05/09(火) 20:04:42今,lispでfortranを走らせようとしているのですが,loadがうまくいきません.
環境変数の設定
setenv LD_LIBRARY_PATH /usr/local/acl80.64:$LD_LIBRARY_PATH
共有ライブラリの作成とリンク
f77 -c -DAcl64Bit -l/usr/local/acl80.64/misc/ fnames.f
ld -shared -o fnames.so fnames.o /usr/local/acl80.64/libacli8010.so
を行った後, (load "fnames.so")としても
; Foreign loading fnames.so.
Error: Loading fnames.so failed with error:
fnames.so: cannot open shared object file: No such file or directory.
[condition type: file-error]
というエラーがでてしまい,共有ファイルが作成されていないと出てしまいます.
.soファイルが作成されているのに何故このようなエラーが出るのか,ご存知の方
がいらっしゃれば教えていただけないでしょうか?マニュアルを読んでいるのですが,
解決方法がみつからなくて・・・お願いします.
0765デフォルトの名無しさん
2006/05/09(火) 21:09:400766デフォルトの名無しさん
2006/05/09(火) 23:52:37見れなかったっけ?
0767デフォルトの名無しさん
2006/05/10(水) 02:34:10調べて何処見に行ってるか確認したら?
いいなぁ64bit版ACL。とてもじゃないが買ってもらえんわ。うちじゃ。
0768デフォルトの名無しさん
2006/05/10(水) 15:06:22内の教授がlisp好きで,大枚はたいて買っちゃったんですよ.俺は,lispがあるということさえ
知らなかったんでこれから勉強していきます.
0769デフォルトの名無しさん
2006/05/10(水) 18:14:49Schemeじゃないが、飯高先生がPrologで入り口付近をやってた。
『Prologで作る数学の世界』(朝倉書店)
0770デフォルトの名無しさん
2006/05/10(水) 23:04:22どうするのでしょうか。使用目的は画像処理です。
MIT Scheme には fixed pointer が組み込みであるみたいだけど、普通は homo-
geneous vector とかを使うのかな。
0771デフォルトの名無しさん
2006/05/11(木) 00:21:01aという文字は#\aと表すけど、改行文字は?
0772デフォルトの名無しさん
2006/05/11(木) 00:25:330773デフォルトの名無しさん
2006/05/11(木) 00:26:14#\newline
つか、せっかくペラペラな言語仕様書(R5RS)なんだから、隅から隅まで読め
0774デフォルトの名無しさん
2006/05/11(木) 00:43:27サンクス。分かった読んでみる。
0775デフォルトの名無しさん
2006/05/11(木) 01:31:11vector でがんばるか、自作の処理系に独自拡張をいれる。
でもこの言語に固定小数点が欲しいとか言われても…
0776デフォルトの名無しさん
2006/05/11(木) 07:40:560777770
2006/05/11(木) 23:14:07レスどうもです。
homogeneous vector の SRFI を読んで、計算効率に付いても
ある程度考えている言語かなと思いました。やはり自作するのが
早道っぽいですね。
0778デフォルトの名無しさん
2006/05/11(木) 23:27:020779デフォルトの名無しさん
2006/05/12(金) 12:00:15カッコだけで会話するの?
0780デフォルトの名無しさん
2006/05/12(金) 12:30:530781デフォルトの名無しさん
2006/05/12(金) 15:05:220782デフォルトの名無しさん
2006/05/12(金) 15:20:400783?デフォルトの名無しさん
2006/05/14(日) 21:23:24r5rsだといるんじゃねえの?
r6rsだといらんみたいだけど
どうなんだろう?
0784flatline ◆r6EONKKhcc
2006/05/14(日) 22:39:46WIDEの#scheme-jpに入ってみました.
0785デフォルトの名無しさん
2006/05/15(月) 00:39:010786デフォルトの名無しさん
2006/05/15(月) 02:14:50とあるんで、CLerも物はためしで参加してみればいいんじゃないすか?
0787デフォルトの名無しさん
2006/05/16(火) 05:09:21scheme(gauche)で文字列の先頭から順々に正規表現にマッチさせるにはどうしたらいいですか?
Perlでいう
print while $text =~ /foo|bar/g;
みたいな感じでグローバルマッチをしたいんですが。
0788787
2006/05/16(火) 05:12:54$text = "foo, bar, ah bar";
print $&, "\n" while $text =~ /foo|bar/g;
です…
0789デフォルトの名無しさん
2006/05/16(火) 05:25:2940分も探しているのに見つからないとはどういうことさ?
どうかWindows XP上で動作するCommon LISPがダウンロードできるサイトを教えてください。
ttp://www.bookshelf.jp/2ch/tech/1140012484.html
とかリンクつながってねぇし、Win-32って書いてあるからダウソしたらUNIX用だし。
知ってる方、本当にお願いします。
0790デフォルトの名無しさん
2006/05/16(火) 06:25:21* AllegroCL Trial
http://www.franz.com/downloads/clp/survey
* LispWorks Personal
http://www.lispworks.com/downloads/index.html
* GNU CLISP
http://lispuser.net/commonlisp/clisp.html#clisp-for-win32
(SLIME と組み合わせて使いましょう)
* ECL
http://sourceforge.net/project/showfiles.php?group_id=30035&package_id=22059
0791デフォルトの名無しさん
2006/05/16(火) 07:10:14http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%e5%88%9d%e5%bf%83%e8%80%85%e3%81%ae%e8%b3%aa%e5%95%8f%e7%ae%b1
0792デフォルトの名無しさん
2006/05/16(火) 09:45:30ははぁーm(__)m
ECLをダウソさせていただきました。もうちゃんと動いてます。
(いや、でも本当におかしいですよ、ググッてもググッてもハズレサイトばっかりなんですから)
この恩は二週間くらいは忘れないと思います。
ありがとうございました!
0793デフォルトの名無しさん
2006/05/16(火) 09:48:460794792
2006/05/16(火) 10:35:13違う違う、マジで自分で探してみろって。
LISP入門、なんてサイトは腐るほどあるくせにダウソのサイトの情報はほとんどなし。
あってもリンク切れまくりだし、
しかもここ↓とかなんでe-mail出してkeyゲットして…ってやらんとあかん?
* AllegroCL Trial
http://www.franz.com/downloads/clp/survey
ちゃんとダウソまでしてから言ってくれ。
0795デフォルトの名無しさん
2006/05/16(火) 10:42:11まあまあ、いいじゃないっすか。
0797792
2006/05/16(火) 11:41:11単にここ↓のコード走らせたいだけなのに全部打てとは言わんよね…。
ttp://www.weitz.de/files/riddle.lisp
もしかしてSWI-PrologでLISPのコード走ったりするかな?
あれなら昔使ったことあるんで…ってここで訊いてもアレか…。
0798792
2006/05/16(火) 12:32:29ここのCommon LISP使いの住人たちは
ttp://www.mindspring.com/~mccarthys/puzzle1.htm
解いてみると面白いかもよ。
スレ汚して正直スマンかった。
0799デフォルトの名無しさん
2006/05/16(火) 21:25:330800デフォルトの名無しさん
2006/05/16(火) 21:59:050801デフォルトの名無しさん
2006/05/16(火) 22:38:56確かに Prolog 向きだね。
0802デフォルトの名無しさん
2006/05/16(火) 22:48:480803デフォルトの名無しさん
2006/05/16(火) 23:33:520804デフォルトの名無しさん
2006/05/17(水) 11:03:15今年の流行語大賞にノミネートしよう
0805デフォルトの名無しさん
2006/05/17(水) 15:23:49同じでしょうかね?
0806デフォルトの名無しさん
2006/05/17(水) 15:43:19まぁ似たようなもん。でも、興味があるなら両方学べばいい。
そんなことで「節約」したってしょうがないよ。
0807デフォルトの名無しさん
2006/05/17(水) 15:46:25プログラミングにおいて「方言」のレベルを最初に飛び込む段階で気にしても
しょうがないなと思う。
0808デフォルトの名無しさん
2006/05/17(水) 21:08:13どっちか一方だけでもいいけれど、片方が優れていると思い込むのはオススメ
しない。
0809デフォルトの名無しさん
2006/05/17(水) 21:44:03下位3ビットをタグとすると8つ区別できますよね。
その他即値、その他非即値、ペア、即値整数 あたりは確定だと思います。
あと4つなんですがクロージャ、非即値数、シンボル、ベクタ、継続辺りが候補です。
クロージャを即値にすると扱える環境やコードの量に限界ができるというデメリット
もあるのですが、メモリ使わないのは嬉しいのでできれば即値にしたいです。
非即値数は巨大整数、分数、浮動小数あたりを扱いたいのですが、GMPでは
mpz_tが12, mpq_tが24, mpf_t が16バイトです。8バイトにアライメントすると
mpz_tは4バイト余るのでそこをタグにできると思うんですが、他の二つは無駄が増える
のでちょっと悲しいです(ところで typedef __mpf_struct MP_FLOAT; がコメントアウト
されてるのが何故だか知ってる人いますか?)。
シンボルは string->symbolさえ無ければ3ビットのタグを与える必要もないのですが
GCのこと考えるとやむないのかもしれません。
GCで、なんとなく他のオブジェクトを指してるやつをアライメントで判別した方が
よい気がするのでベクタ、継続が候補に上がります(まだM&SかCopyか決めてません)。
どちらかといえば数値計算回りを高速化したいです。
なにかアドバイスあればお願いします。
0810デフォルトの名無しさん
2006/05/17(水) 23:01:44Scheme じゃないけど、SBCL のタグビットはこんな感じ。
fixnum は 2bit だけどね。
0811デフォルトの名無しさん
2006/05/18(木) 00:24:31情報ありがとうございます。
instance-pointerと other-immediateが二つあるのがよく分かりませんが
fixnumが00というのは意外でした。00意外のところにアクセスすると
微妙に遅くなるという話を聞いたことがあったような気がしたので。
SBCLのソースは参考になりますね。
読むのは難しいですがGCとか調べてみます。
よく考えると非即値数にタグを割当てるメリットが全然ないので
なしにします。
あと、2バイト目にアクセスする時って (x >> 8) & 0xFF とかするより
いい方法ありますか? エンディアンとか関係あるかもしれませんが。
0812デフォルトの名無しさん
2006/05/18(木) 00:47:300813デフォルトの名無しさん
2006/05/18(木) 01:12:45たしかにそうですね、桁溢れチェックはアセンブラだから関係ないんでしょうね。
非即値数ってあんまりたくさん作りたくないんですが、テンポラリなやつは
破壊的に扱っていくみたいなテクニックってありますか?
同じことが pairにも言えると思いますが。
0814デフォルトの名無しさん
2006/05/18(木) 01:15:03短期用ヒープと長期用ヒープを分ければすっきり解決できない?
0815デフォルトの名無しさん
2006/05/18(木) 01:36:26Generationalってやつですか?
それでもいいんですけど、アロケートしなくてもよければベストかなあと。
ある程度なら特定できるような気がしたので。
返り値に含まれないのなら set!されない限り手続きに入る前と後で
オブジェクトは増えないはずなのでごっそり開放できるかもしれませんね。
返り値からマークしていって手続き内でつくられたオブジェクトをスイープ
するとか、返り値からたどれるのを一時領域からヒープにコピーするとか
(こっちの方がよさそう)もありかもしれませんね。今適当に考えただけですが。
無知で専門的なことはよくわからないんですが、ここら辺のことって研究
しつくされてる気がするので、さくっとベストな答えを知りたいです。
ReadschemeやAppel氏あたりからたどれる論文を読めばいいんですかね。
0816デフォルトの名無しさん
2006/05/18(木) 02:15:53ちょっと考えたんですが
(+ (f) (g)) という式があると (f)と(g)でつくられた数以外の
オブジェクトは開放できると思います。
リスト、ベクタ、手続き、継続以外と型を特定できる部分があれば
使えます。
動的にチェックする手もありますが上の4種だった時や、
あんまり開放できなかった時がいまいちかもしれません。
0817デフォルトの名無しさん
2006/05/18(木) 04:46:44おれが勘違いしているかもしれないんで低姿勢で聞いておく。
tagっていうのは pointer (もどき) の下位 bitsを使って、
pointerの解釈を変えるものですよね?
000 だったら、実はそれは 29bit fixnumだったとか。
12bytesの mpz_tに tagをつけても pointerもどきには収まらない
(たぶん 32bitか 64bitだよなあ) から、そんなもんに tagつけても
意味ないじゃん、って思うんだけど、勘違い?
mpz_tをさす pointerに tagつけるならわかるけど、それだったら
mpq_tに無駄ができるとかいうのが意味がわからない...
0818デフォルトの名無しさん
2006/05/18(木) 04:59:350819デフォルトの名無しさん
2006/05/18(木) 08:21:28fixnum のように値まで埋め込む方が例外的。
0820デフォルトの名無しさん
2006/05/18(木) 10:59:21分りづらくてすいません。
mpz_t (MP_INT)を指す pointerにtagつけるってことです。
mpz_tとmpq_tとmpf_tにひとつづつ tagを割り当てるのは無理なので
即値じゃない数ってことでtagを割り当てて pointerの先のフラグ
でまた判別するってことです。
mpz_tとmpq_tしか扱ってなかったときはmpq_tの最初の4バイトには絶対
にこないもの(~0)を置くことで判別できたのですが
mpf_tも考えると(複素数もありますね)それでは無理でした。
数を tagで判別するメリットがないのでその他非即値ってことにして
全部飛び先のフラグで判別することにしました。
どちみちアライメントの問題はありますがしょうがないですかね。
0821デフォルトの名無しさん
2006/05/18(木) 11:20:05まずはこれかな?
CONS should not CONS its arguments, part II: Cheney on the M.T.A.
Henry G. Baker
0822デフォルトの名無しさん
2006/05/18(木) 11:42:31ありがとうございます。
それって Chickenのやつですよね。
なんとなく Stack GCの論文かと思ってました。
読んでみます。
私事ですが今のところ SCM, MzSchemeより速くなって
打倒 Gauche, Petiteって感じです。
Gaucheがなんで速いのか今いち分かってないので
そこらへんも気になります。
0823デフォルトの名無しさん
2006/05/18(木) 12:56:02(f), (g)の実行中に継続が捕捉された場合は開放できない。
継続が捕捉され得るかどうかは(f), (g)を起点とするコールグラフ
全てのソースがわかっていないと静的に判断できない。
実行時に判断するなら、スタックをいじるとか、まあいろいろ方法は
あるけど、きちんとやるのは意外に面倒だよ。
それから、数値計算を速くしたいならflonumのアロケーションを
避けることと、数値のサブタイプによる実行時ディスパッチを避けること。
型宣言を追加するとか、特定のサブタイプ専用のオペレーションを
追加するとか、グローバルフロー解析やって型推論するとか。
0824デフォルトの名無しさん
2006/05/18(木) 13:19:39継続が補足されるっていうのは set!されるというのと同じことだと思うので
ヒープに移動するってことになりますかね。
手続き内のミニGCならヒープに移動するかそのオブジェクトをマークし始めの
オブジェクトにするってポリシーでなんとかなる気もします。
継続が起動される場合は、その一時領域がメインのGCの対象になれば、まあいいと
思います。
補足された継続が後で起動された場合、2重開放みたくならなければいいんですが
全部妄想なので今いちよく分からないです。
手続きを作る手続きに入るときに引数を直接ヒープにつくると、継続が補足された
時に上書きされてまずいって話を思い出しました
("Tail-Recursive Stack Disciplines for an Interpreter" だったと思います)。
インクリメンタルGCはあまりスループットが下るっぽいので
あんまりやりたくないんですが、GCでなくごっそり開放できるんなら得かなあ
と思いました。でも set!や継続を考えるとめんどくさいみたいですね。
0825デフォルトの名無しさん
2006/05/18(木) 13:41:54数値計算に関しては、所詮インタプリタってこともあって微妙なんですよね。
型宣言やサブタイプ専用のオペレーションってSchemeっぽくないので微妙ですし。
実行時ディスパッチっていうのは巨大整数か有理数か浮動小数か実行時に
調べて分岐するってことでしょうか? 避けれるものなら避けたいですが
なかなか難しいですね。
Lispで数値計算っていうのが矛盾してる気もします。MLの方がいいですよね。
納得できる Schemeのインタプリタを作ったら、PrologかMLの処理系を
作ってみたいです。
あと継続の話ですが、継続を使わない時を対象にごりごり最適化して
継続が使われる時は adhoc的な解決でごまかすって手もありかなあと思います。
ただ両方の面で優れてるのが Stack GCって感じがします。
Appel氏の論文に書いてあるみたいに、
メモリが十分にとれるとすれば Stack GCが完璧なんですかね。
0826?デフォルトの名無しさん
2006/05/18(木) 14:22:50>SCM, MzSchemeより速くなって
ほほ〜う。それはすばらしい。
これはまた一人ラムダの門をくぐる猛者が現れたか?
Gaucheはインタープリターだが多くのプリミティブをインライン化していることが大きいと思われる。
インライン化を無効にすると普通になる。
プリミティブのインライン化は呼び出しのコストの削減よりも保存する継続や環境の数が激減する所がおいしい。
Petiteはcarやcdrのプリミティブを後で再定義してもきちんと反映される。
マジで早い。petiteはchezで書かれていると耳にしたことがあるが本当かどうかはわからない。
だとしたらすげ〜
ただしデバッグがしんどい。Gaucheの方が使いやすい(でもrationalが無いんだよな〜)
0827デフォルトの名無しさん
2006/05/18(木) 16:58:05SCM, MzSchemeより速いといっても、まだGCを作ってないので数演算しか
できないです。巨大整数と有理数もサポートしているのでちゃんと
比較できてるとは思います。
fib, tarai, ack辺りでは SCM, MzSchemeより速いです。
ackなら Gaucheより速いです。
プリミティブのインライン化が大きいというのはその通りだと思います。
= > not辺りをインライン化したら一気に速くなりました。
まだ + - * /をインライン化してないので、それをすれば Gaucheより
速くなるかもしれません。ただ
(+ a b c) を
LOAD a/LOAD b/LOAD c/ADD3 としたり、
(+ a 3 b) を
LOAD a/LOAD b/ADD2/ADDI 3 としたり
(+ a b c d e f g)を
LOAD a/LOAD b/LOAD c/LOAD d/LOAD e/LOAD f/LOAD g/ADDN 7 とするような
インストラクションの工夫ってなんだか退屈で面倒くさいので後回しに
してました。
あと Gaucheには val0というレジスタがありますがこれを使う利点
ってなんなんでしょうか。
0828デフォルトの名無しさん
2006/05/18(木) 17:06:33再定義しても反映されるっていうのはコンパイルしなおしてるんですかね。
それかSBCLみたいに機械語にしてるか。そうでもしないとあんなに速く
ならないと思います。
Gaucheはdisasmがあるからいろいろ調べられるんですけどね。
プリミティブの再定義をサポートしなくても R5RS的には大丈夫だと思いますけど。
Petiteも >>637の loop2や(factional 100)とかやるとかなり遅いので
弱点はあると思います。loop2の遅さから末尾呼び出しの実装を推測できない
ですかね。引数シフトだとしても遅すぎると思いますけど。
0829デフォルトの名無しさん
2006/05/18(木) 18:27:35chezと互換と書いてあるのでたぶんそうしてるんだと思う。
>それかSBCLみたいに機械語にしてるか。
threaded interpreterであると書いてあるのでそれはないと思う。
chez関連は ttp://www.cs.indiana.edu/chezscheme/pubs/ で一気に情報が手に入るよ。
petiteの詳しいことはわからんけど。健闘を祈る。
0830デフォルトの名無しさん
2006/05/19(金) 04:00:41そんなことは無いと思うが>Lispで数値計算っていうのが矛盾
CLで型宣言つけまくれば速いよ。コードがLispっぽくなくなるけど。
「Schemeで」ならそうかもしれない。Stalinは数値シミュレーションに
ごりごり使われているらしいが。
0831デフォルトの名無しさん
2006/05/19(金) 04:50:37http://www.gnu.org/software/kawa/Declaring-Types-of-Variables.html
http://www-sop.inria.fr/mimosa/fp/Bigloo/doc/bigloo-19.html#Explicit-typing
確かにそれが scheme っぽいかって言うとどうだろうとは思いますが。
0833デフォルトの名無しさん
2006/05/19(金) 11:45:35>特定のサブタイプ専用のオペレーションを追加する
こっちの方が好きだな。
0834デフォルトの名無しさん
2006/05/19(金) 16:51:22そこは敢えて Lispって書いたんですが、数値計算で Lispを積極的に使う理由って
なんなんでしょうか?
Lispといえば動的な型、ファーストクラスのクロージャ、GCという特徴があると思う
んですが、動的な型というのは実行時の型判別がいるので速度に影響しますし、
クロージャも動的な型とあいまって、速度を稼ぎにくいと思います。
数値計算といっても速度が全てじゃないと思うので GCがいけないとは思いませんが
オブジェクトの生成を抑えるために明示的に破壊的な手続きを呼ぶことになるかも
しれません。
Lispで数値計算をしようと思うと Lispの特徴をどんどん殺すことになるんじゃ
ないでしょうか。CやMLでなく Lispを使う理由っていうのを知りたいです。
0835デフォルトの名無しさん
2006/05/19(金) 16:59:12があって、有理数も多倍長の mpq_tと longとunsigned longのペア
みたいのと二つ作って、小数も一応4つ精度を指定できるので、
4つとまではいかなくても2つくらいは対応しようとすると、
6つになります。さらに複素数をいれると12になるんですが
さすがに全部対応すると速度が落ちる気が...
Scheme処理系作るのって大変ですね。
0836デフォルトの名無しさん
2006/05/19(金) 18:21:21> Lispといえば動的な型、ファーストクラスのクロージャ、GCという特徴があると思う
> CやMLでなく
あなたがあげた3つの特徴でMLとの違いって動的な型しかないけど。
0837デフォルトの名無しさん
2006/05/19(金) 18:34:230838デフォルトの名無しさん
2006/05/19(金) 19:00:03その動的な型が大きいと思うんです。
結局サブタイプ専用手続きを使うのなら MLでいいですからね。
>>837
確かに。
型が静的か動的かってことと、プログラムがデータかってことは直交すると思うので
S式MLを作ればいいですね。静的LISPと呼んでもいいですが、動的だからこそLISPって感じがするので。
僕だけが持つイメージかもしれませんが。
ちょっと調べたら、すでに MetaMLだか MetaOCamlだかいうのや
Template Haskellとかいうのがあるらしいです。面白そう。
0839デフォルトの名無しさん
2006/05/19(金) 19:26:17そう。どの言語で書いてても結局何らかのプログラムジェネレータみたいのが
欲しくなるわけよ。Lispなら最初からついてるから便利ってだけね。
自分のLispのイメージは、強力なメタプログラミングツールって感じ。
0840デフォルトの名無しさん
2006/05/19(金) 21:04:06そりゃ Scheme はそうかもしれないけど Common Lisp はオプショナル
な型があるからね。動的のみじゃないよ。
1. 動かす
2. ぐちゃぐちゃといじりながらインタフェースを最適化
3. ボトルネックなとこに型宣言をつける
4. もっと速度が欲しいなら C でモジュールを書く
で 3. で大抵満足いく速度がでるので助かっている。ML とかだと序盤で
型を設計するときに数値はーここは Int かな〜こっちは Float とか結構
決め打ちしちゃうからね。まぁ最初から厳密に仕様がきまってるなら俺も
ML 使うけど。
0841デフォルトの名無しさん
2006/05/19(金) 21:35:13なるほどー。とりあえず動く物を作ってから後から型宣言
をつけて開発していくわけですね。
最初から決め打ちしなくていいからやりやすいと。
プログラムの種類にもよりますが MLでも本当に型宣言なしで
大きなプログラムを書くのは結構大変ですよね。
いちいちコンパイルに引っ掛かるようになってくる。
まあML経験値低いので自分が駄目なだけかもしれませんが。
道具だからそういう所も大事なんですね。納得しました。
0842デフォルトの名無しさん
2006/05/19(金) 22:24:170843デフォルトの名無しさん
2006/05/20(土) 05:42:251 の段階で性能が気になっちゃう俺は修行が足りませんね。
0844デフォルトの名無しさん
2006/05/20(土) 07:34:280845デフォルトの名無しさん
2006/05/21(日) 02:50:00MLton や OCaml はちょっと方向性が違うしね。
0846デフォルトの名無しさん
2006/05/25(木) 20:56:32総称型って良く知らないんですが、実行時に型判別をするオブジェクト
指向みたいなやつでしょうか?
MLでも fixnumは32ビット使えないですよね。MLのコンパイラ作ったこと
無いので良くわからないんですが、どうしてなんでしょうか?
32bit raw-dataみたいな型があって、足し算、引き算、論理演算
くらいできないと Cの代替にはならないんですよね。
0847デフォルトの名無しさん
2006/05/25(木) 21:20:48じゃ、Cでおながいします。
0848デフォルトの名無しさん
2006/05/26(金) 01:59:04>MLでも fixnumは32ビット使えないですよね。
MLton は 32bit
http://mlton.org/Features
> In MLton, integers and words are 32 bits
OCaml は 31bit
SBCL は 30bit
30bit もあれば十分な気がするけど。
0849デフォルトの名無しさん
2006/05/26(金) 02:28:17型つけてコンパイルするのに、余分なビットは何に使ってんの?
0850デフォルトの名無しさん
2006/05/26(金) 02:29:560851デフォルトの名無しさん
2006/05/26(金) 03:40:120852デフォルトの名無しさん
2006/05/26(金) 08:24:26GCするときに数値かポインタか区別するため
0853デフォルトの名無しさん
2006/05/27(土) 21:44:19navi2chがぴんち
http://pc8.2ch.net/test/read.cgi/unix/1140084512/
0854デフォルトの名無しさん
2006/05/27(土) 23:40:17出張してこないでください。
もうパッチ出てるし。
0855デフォルトの名無しさん
2006/05/28(日) 18:20:21値がマイナスの場合どういう計算すんの?
0x80000000をorしてから計算するのかな?
0856デフォルトの名無しさん
2006/05/28(日) 18:50:120857デフォルトの名無しさん
2006/05/28(日) 19:15:40素人視点では、1bit目を判定に使って算術シフトで
符号処理した方が楽な気がするんだけど、
オフセットバイナリって何ですか?
0858デフォルトの名無しさん
2006/05/28(日) 20:21:570859デフォルトの名無しさん
2006/05/28(日) 23:26:170860デフォルトの名無しさん
2006/05/28(日) 23:53:560861デフォルトの名無しさん
2006/05/28(日) 23:56:230862デフォルトの名無しさん
2006/05/29(月) 00:00:03調べりゃ一発なのに、その数倍の時間を煽りのタイピングに使うと見た(^_^;
0863デフォルトの名無しさん
2006/05/29(月) 00:00:10もったいぶってるの?
0864デフォルトの名無しさん
2006/05/29(月) 00:03:31ttp://w3-pre.apc.ehdo.go.jp/22132/2/2-4.html
>正負の数値を扱う場合には、オフセットバイナリコードと呼ばれる
>ものがあり、同じく4ビットを例にとると「1000」が「0(ゼロ)」になり、
>「1001」,「1010」,「1011」と1ずつ増加し、「1111」が正の数の
>最大値「7」となります。負の数は「0111」が「-1」、「0110」が「-2」
>となり「0000」が負の数の最大値「-8」になります。ちなみに
よくよく考えたら使い道ないかも。
0865デフォルトの名無しさん
2006/05/29(月) 00:06:450866デフォルトの名無しさん
2006/05/29(月) 00:08:26LSBなら0bit目(またはbit 0)という言い方をすることが多くない?
そうでもないかな。
0867デフォルトの名無しさん
2006/05/29(月) 00:08:37ちゃんと説明してよお
0868デフォルトの名無しさん
2006/05/29(月) 00:10:41こいつ何様?
0869デフォルトの名無しさん
2006/05/29(月) 00:13:37オーバーフローやアンダーフローの時どう対応すんの?
即値から多倍長とかに値を拡張する場合。
0870デフォルトの名無しさん
2006/05/29(月) 00:18:32マシン語レベルならフラグに上がるでしょ
0871デフォルトの名無しさん
2006/05/29(月) 00:28:56ビッグエンディアンだと bit 0 あるいは 1st bit が MSB だよ。
0872デフォルトの名無しさん
2006/05/29(月) 00:33:42http://www.google.co.jp/search?hl=ja&q=offset-binary+fixnum&lr=
0873デフォルトの名無しさん
2006/05/29(月) 00:45:20ビッグエンディアンでも、例えば68Kは「bit 0」がLSBだね。
アーキテクチャというより、単に呼称の問題だけど。
0874デフォルトの名無しさん
2006/05/29(月) 07:26:50ほとんど役に立たないっぽい。
0875デフォルトの名無しさん
2006/05/29(月) 22:40:06役立たずって言われてますよ?
0876デフォルトの名無しさん
2006/05/29(月) 22:44:11そろそろ自分で何とかすれ。
0877デフォルトの名無しさん
2006/05/29(月) 22:47:140878デフォルトの名無しさん
2006/05/29(月) 22:57:45うわ・・異常に早いレスですね
しかも自作自演バレバレですよ
もしかしてずっと待ちかまえてたんですか?
役立たずって言われた気分はどうですか?
0879デフォルトの名無しさん
2006/05/29(月) 23:07:22そういうのやり始めると、まともな人が居なくなるから勘弁してくれ。
マジお願い。
0880デフォルトの名無しさん
2006/05/29(月) 23:09:51そろそろ>>856が出てきて釈明するパターンだよ。
0881デフォルトの名無しさん
2006/05/29(月) 23:12:070882デフォルトの名無しさん
2006/05/29(月) 23:13:50痛いところを突かれると矛先が変わるね。
0883デフォルトの名無しさん
2006/05/29(月) 23:14:530884デフォルトの名無しさん
2006/05/29(月) 23:16:000885デフォルトの名無しさん
2006/05/29(月) 23:16:22意味不明です
0886デフォルトの名無しさん
2006/05/29(月) 23:17:10>>875-877
一人でやってるだけじゃん
0887デフォルトの名無しさん
2006/05/29(月) 23:19:24さっさと夢が広がリングな提案なのか役立たずの糞なのか決着つけろ。
0888デフォルトの名無しさん
2006/05/29(月) 23:28:33オフセットバイナリ LISP の検索結果 約 3 件中 1 - 1 件目 (0.61 秒)
>>887
どう見ても糞の方です。
ありがとうございました。
0889デフォルトの名無しさん
2006/05/29(月) 23:29:27もうちょっと待ってやれやw
0890デフォルトの名無しさん
2006/05/29(月) 23:35:29オワタw
0891デフォルトの名無しさん
2006/05/29(月) 23:37:05ちゃんとごめんなさいしようよ(´・ω・`)
0892デフォルトの名無しさん
2006/05/29(月) 23:50:21もう役立たずの気分とかどうでもいいんで、
どういう事なのか説明してください><
0893デフォルトの名無しさん
2006/05/29(月) 23:52:080894デフォルトの名無しさん
2006/05/29(月) 23:54:06オフセットバイナリ fixnumに該当するページが見つかりませんでした。
0895デフォルトの名無しさん
2006/05/30(火) 00:16:09なのにバレバレなのがアレだけど
0896デフォルトの名無しさん
2006/05/30(火) 00:22:40>調べりゃ一発なのに
結局調べりゃ何が一発だったんだ?
0897デフォルトの名無しさん
2006/05/30(火) 00:23:55嬉しくて闇雲に使ってみたかっただけなんだよね?
スレのみんなにごめんなさいしないといけないよね?(´・ω・`)
0898デフォルトの名無しさん
2006/05/30(火) 00:25:010899デフォルトの名無しさん
2006/05/30(火) 00:25:250900デフォルトの名無しさん
2006/05/30(火) 00:26:120901デフォルトの名無しさん
2006/05/30(火) 00:28:400902デフォルトの名無しさん
2006/05/30(火) 00:36:380903デフォルトの名無しさん
2006/05/30(火) 05:19:53http://srfi.schemers.org/srfi-75/mail-archive/msg00309.html
http://srfi.schemers.org/srfi-75/post-mail-archive/msg00000.html
0904デフォルトの名無しさん
2006/05/30(火) 06:02:08the R6RS specification is finalized, the SRFI may be revised to conform
to the R6RS specification and then resubmitted with the intent to
finalize it.
0905デフォルトの名無しさん
2006/05/30(火) 06:58:04R6RSの仕様にあわせる方向で再審議の可能性もあるよ」
だと思う。前向きなニュアンスで。
0906デフォルトの名無しさん
2006/05/30(火) 17:35:12頭悪wwww
0907デフォルトの名無しさん
2006/05/30(火) 19:19:28-------------------------------
m 0 1 2 3 4 ・・・
n
0 1
1 1 1
2 1 2
3 1 3 3 1
4 1 4 6 4 1
・
・
・
-------------------------------
P(n,m)を求める関数を作るとき
schemeでどう書いたらいいですか?
例えば
(P 4 2)
=6
みたいになるプログラムを作りたいんです。
0908デフォルトの名無しさん
2006/05/30(火) 19:41:03P(n, n) = 1
P(n, m) = P(n - 1, m) + P(n - 1, m - 1)
0909デフォルトの名無しさん
2006/05/30(火) 19:49:27をschemeで書くとどうなりますか?
0910デフォルトの名無しさん
2006/05/30(火) 20:18:12オフセットバイナリ 即値に該当するページが見つかりませんでした。
0911デフォルトの名無しさん
2006/05/30(火) 20:57:480912デフォルトの名無しさん
2006/05/30(火) 21:18:220913デフォルトの名無しさん
2006/05/30(火) 22:01:100914デフォルトの名無しさん
2006/05/30(火) 22:37:51thx.
UNICODE の規格組み込みは R6RS で一番嬉しい点なので、
前向きに待ってます。
0915デフォルトの名無しさん
2006/05/31(水) 00:03:32この形式の言語は他にもあるのかな。
0916デフォルトの名無しさん
2006/05/31(水) 03:10:46戻り型はどこに記述すんの?
0917デフォルトの名無しさん
2006/05/31(水) 13:58:01自分の知っている限りでは、Cファミリーの言語(C,C++,Java,C#など)以外
のほとんどの静的型付け言語が、name : type形式だと思う。
0918デフォルトの名無しさん
2006/06/01(木) 05:11:020919デフォルトの名無しさん
2006/06/01(木) 05:34:370920デフォルトの名無しさん
2006/06/02(金) 04:11:540921デフォルトの名無しさん
2006/06/03(土) 21:16:02こんなの。
(defclass cls ()
((label :accessor ac-label :reader r-label :initarg :label :initform "dummy")
(data :accessor ac-data :reader r-data :initarg :data :initform nil)))
(defmethod construct ((o cls) &key label data)
(make-instance 'cls
:label (if (eq label nil)
(r-label o)
label)
:data (if (eq data nil)
(r-data o)
data)))
* (setf a (make-instance 'cls :label "test" :data '(1 2)))
* (setf b (construct a :data (append (r-data a) '(3))))
(1 2 3)
この,construct って,いつも書くのがめんどくさいなーって思うのですが,
なにかスマートな方法があるのでしょうか?それとも,
なにか勘違いがあるのでしょうか?
0922デフォルトの名無しさん
2006/06/03(土) 21:18:10(r-data b)
(1 2 3)
0923デフォルトの名無しさん
2006/06/03(土) 21:28:08function (a:A, b:B, c:C) : D {...} の D
http://developer.mozilla.org/presentations/xtech2006/javascript/
Lisp|Scheme と Java と Python がごちゃ混ぜ...マクロ欲しい。
0924デフォルトの名無しさん
2006/06/03(土) 22:19:520925デフォルトの名無しさん
2006/06/03(土) 22:59:20どこで改行していいのかわからん。
0926デフォルトの名無しさん
2006/06/03(土) 23:06:07画面の右端に当たったら改行
0927デフォルトの名無しさん
2006/06/03(土) 23:47:47特殊形式はまた別だけど。
0928デフォルトの名無しさん
2006/06/04(日) 09:35:22速くはならない。2回目からめちゃ速いけど。下は gauche 用。
>>918 この問題なら、nCr = nCn-r で第二引数を小さくしてから、
nCr = nPr / r! を使う方がループ減る。
(define (memoize f)
(let ((tab (make-hash-table 'equal?)))
(lambda args
(let ((cached (hash-table-get tab args #f)))
(or cached
(let ((ret (apply f args)))
(hash-table-put! tab args ret)
ret))))))
(define choose-memo
(memoize
(lambda (m n)
(if (or (zero? n) (= m n))
1
(+ (choose-memo (- m 1) n) (choose-memo (- m 1) (- n 1)))))))
(define (choose-tail m n)
(let loop ((m m) (n (if (> n (/ m 2)) (- m n) n))
(mm 1) (nn 1))
(if (zero? n) (/ mm nn)
(loop (- m 1) (- n 1) (* mm m) (* nn n)))))
0929デフォルトの名無しさん
2006/06/05(月) 03:29:22そりゃ本質的にはアルゴリズムを改善する方がはやいけど。
漸化式を展開してくと重複項が出てくるから1回目でもそれなりに速くなるよね?
0930デフォルトの名無しさん
2006/06/05(月) 10:27:23感動するくらい速くなるよ。だから「劇的」と書いた。けど、がまんできる程
じゃない。
ホントは末尾再帰で回すのも、もったいない感じがする。inexact でいいこと
が多いから、Γ関数の対数使うのが筋。
0931デフォルトの名無しさん
2006/06/05(月) 12:58:130932デフォルトの名無しさん
2006/06/05(月) 23:02:15なんか、こう、「プログラムの効率改善」とは何かが
違うような感じがするんだよなぁ
0933デフォルトの名無しさん
2006/06/05(月) 23:06:560934デフォルトの名無しさん
2006/06/05(月) 23:25:19パスカルの三角形で効率化するとなると、下からループで作ってくけど楽しくない。
(define (pascal m n)
(let* ((p (max n (- m n)))
(p1 (+ p 1))
(q (min n (- m n)))
(v (make-vector (+ p 1) 1)))
(do ((i 0 (+ i 1)))
((= i q) (vector-ref v p))
(do ((j 1 (+ j 1)))
((= j p1))
(vector-set! v j (+ (vector-ref v (- j 1)) (vector-ref v j)))))))
0935デフォルトの名無しさん
2006/06/06(火) 07:17:43とりあえず動くようになったところでチューニング。
でもよっぽど効率が悪くない限りチューニングする気が起きない罠。
0936(define (´∀`) 'マターリ)
2006/06/07(水) 02:26:58(let loop ((n n) (r '(1)))
(define tmp (cons 0 r))
(if (= n 0) (list-ref r m)
(loop (- n 1) (map + tmp (reverse tmp))))))
0937(define (´∀`) 'マターリ)
2006/06/08(木) 11:50:56(define (p n m)
(do ((m m (- m 1))
(r (vector->list (make-vector (+ (- n m) 1) 1))
(do ((x (cdr r) (cdr x))
(r (list (car r)) (cons (+ (car x) (car r)) r)))
((null? x) (reverse r)))))
((= m 0) (car (reverse r)))))
0938デフォルトの名無しさん
2006/06/09(金) 22:35:27comp.lang.scheme と www.scheme.dk/planet 以外に何かありますか?
0939デフォルトの名無しさん
2006/06/09(金) 22:41:450940デフォルトの名無しさん
2006/06/10(土) 03:11:26スマン。見つからなかった。
0941デフォルトの名無しさん
2006/06/10(土) 11:37:05ttp://lambda-the-ultimate.org/
0942デフォルトの名無しさん
2006/06/10(土) 16:46:47代わりになるものは何ですか?
0943デフォルトの名無しさん
2006/06/10(土) 17:10:56作れ
0944デフォルトの名無しさん
2006/06/11(日) 04:50:39Lisperは二言目には作れ作れっていいますけどね、図書館にいっても
まともなLisp本が置いてない今の状況だってあんたたちのそういった
傲慢が生み出したものなんですよ!
0945デフォルトの名無しさん
2006/06/11(日) 09:00:170946デフォルトの名無しさん
2006/06/11(日) 09:05:470947デフォルトの名無しさん
2006/06/11(日) 12:54:500948デフォルトの名無しさん
2006/06/11(日) 14:21:28DrSchemeでdoを使えない自分の代わりってこと?
0949デフォルトの名無しさん
2006/06/11(日) 15:24:350950デフォルトの名無しさん
2006/06/12(月) 02:25:20図書館にパズルの答の本がいっぱいあったらおかしいだろ?
0951デフォルトの名無しさん
2006/06/12(月) 09:06:020952デフォルトの名無しさん
2006/06/12(月) 11:28:280953flatline ◆r6EONKKhcc
2006/06/12(月) 22:49:45そのまましばらくお待ちください...
0954デフォルトの名無しさん
2006/06/12(月) 23:17:050955デフォルトの名無しさん
2006/06/13(火) 07:14:09さんざん情報を貢いだあげくに愛煙家のラクダや遅漏の学者に浮気され...
そんでもって二股かけられてるならまだいいんだけど...
こっちを振ったあげくに悪口言いまくたりするからな〜
ま、尻軽女のコーマンの話なんだけど。疑心暗鬼がすぎるかな?
0956デフォルトの名無しさん
2006/06/13(火) 13:19:04誤爆?
0957デフォルトの名無しさん
2006/06/13(火) 16:11:010958デフォルトの名無しさん
2006/06/13(火) 16:30:190959デフォルトの名無しさん
2006/06/13(火) 16:34:04http://ja.wikipedia.org/wiki/Haskell
0960デフォルトの名無しさん
2006/06/13(火) 16:40:330961デフォルトの名無しさん
2006/06/13(火) 17:33:340962デフォルトの名無しさん
2006/06/14(水) 23:02:150963デフォルトの名無しさん
2006/06/14(水) 23:49:08なんだそのB級映画の殿堂は!
0964デフォルトの名無しさん
2006/06/15(木) 01:07:560965デフォルトの名無しさん
2006/06/15(木) 03:10:120966デフォルトの名無しさん
2006/06/15(木) 04:25:57そ こ に 謎 が あ る か ら さ。
0967デフォルトの名無しさん
2006/06/15(木) 04:26:30#\nul
0968デフォルトの名無しさん
2006/06/15(木) 16:40:35がある。(integer->char 0) を使うのが安全。何度も使うのなら、適当な変数に
入れる。
0969デフォルトの名無しさん
2006/06/15(木) 20:25:49(integer->char 0) が '\0' になるかどうかわからないんじゃないの?
0970デフォルトの名無しさん
2006/06/16(金) 19:56:14動作は identity と変わりませんよね?
0971デフォルトの名無しさん
2006/06/17(土) 05:50:120972デフォルトの名無しさん
2006/06/17(土) 16:35:240973デフォルトの名無しさん
2006/06/17(土) 16:51:04http://www.lispworks.com/documentation/HyperSpec/Body/f_identi.htm#identity
0974デフォルトの名無しさん
2006/06/17(土) 18:18:180975デフォルトの名無しさん
2006/06/17(土) 19:33:26どう違うんですか?
0976デフォルトの名無しさん
2006/06/17(土) 21:31:27(display 'test)とするとtestって表示されるんだけど、
(display ':test)とすると#{:test}#って表示される。
:から始まるシンボルをdisplayすると#{ }#がついちゃうんだけど、
なんで?
0977デフォルトの名無しさん
2006/06/17(土) 22:52:22ありがとう!
>>974
Ouch!
とすると(values x)と(identity x)は同じようにみえるのだけど... 俺も >>971 が気になるよん
0978デフォルトの名無しさん
2006/06/18(日) 04:46:36(eval 'ozaki)
0979デフォルトの名無しさん
2006/06/20(火) 02:27:150980デフォルトの名無しさん
2006/06/20(火) 04:06:470981デフォルトの名無しさん
2006/06/21(水) 04:30:560982デフォルトの名無しさん
2006/06/21(水) 21:55:15GCI 初心者な私によいチュートリアルのページを教えていただけませんか?
CGI と Common LIsp で一日半検索した後にかいてますので、クレクレ君ではないつもりです。
0983デフォルトの名無しさん
2006/06/21(水) 21:58:370984デフォルトの名無しさん
2006/06/21(水) 22:04:57CGIのスレ池。
0985デフォルトの名無しさん
2006/06/22(木) 00:41:210986デフォルトの名無しさん
2006/06/22(木) 01:34:31どうしてそうやって努力せずに物を手に入れる輩を甘やかすかな〜。
0987デフォルトの名無しさん
2006/06/22(木) 02:31:540988デフォルトの名無しさん
2006/06/22(木) 02:35:330989デフォルトの名無しさん
2006/06/22(木) 02:52:22こんな世界があったのか!って声出して笑っちゃった。
0990デフォルトの名無しさん
2006/06/22(木) 10:52:28ttp://harukat.hp.infoseek.co.jp/lisphtml/about_lisphtml.l
これとか結構萌える
0991デフォルトの名無しさん
2006/06/22(木) 13:42:57何この萌えマークアップw
0992デフォルトの名無しさん
2006/06/22(木) 13:58:060993デフォルトの名無しさん
2006/06/22(木) 21:51:34ストリングで与えられた式を通常の(つまり、car したり cdr したりできる)式
に変換する方法ってあるのか? それともhard codingでパースするしかないのか?
0994デフォルトの名無しさん
2006/06/22(木) 22:05:30read-from-string
0995デフォルトの名無しさん
2006/06/23(金) 07:32:380996デフォルトの名無しさん
2006/06/23(金) 11:00:49((Common Lisp) (Scheme) :Part 15)
http://pc8.2ch.net/test/read.cgi/tech/1151025773/
0997デフォルトの名無しさん
2006/06/23(金) 12:14:090998デフォルトの名無しさん
2006/06/24(土) 09:12:21乙。スレタイGJ!
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。