1 :
デフォルトの名無しさん :
02/06/03 17:11
2 :
デフォルトの名無しさん :02/06/03 17:11
3 :
デフォルトの名無しさん :02/06/03 17:12
4 :
デフォルトの名無しさん :02/06/03 17:12
5 :
デフォルトの名無しさん :02/06/03 17:12
6 :
デフォルトの名無しさん :02/06/03 17:56
7 :
デフォルトの名無しさん :02/06/04 06:10
8 :
Lisp使いの名無しさん :02/06/04 10:23
スレたてお疲れ様です>1
9 :
デフォルトの名無しさん :02/06/04 17:17
結局別アカウントで立ててきました。 いつのまにか5スレ目突入です。
SchemeのコードからJavaVMのアセンブリ言語を出力するコンパイラがあれば 誰かしら喜ぶかなぁ?
12 :
デフォルトの名無しさん :02/06/05 01:50
kawaって言うとJEmacsとか言うのがついてくるけど、 使い方キボンヌ。
うっ,既にあるのか…. 自分で開発するのも楽しそうだと思ったのだが, まぁ利用させてもらおうっと.
竹内郁雄が、月刊 ASCII 6月号の対談で、 (ガイ・スティールが)「何か記憶に残るプログラムを 書いたかというと、どうもピンと来ない。」 って言ってるけど、そうなの?
16 :
デフォルトの名無しさん :02/06/05 21:27
Lisp で複数人開発ってした事ないんだけど、誰かいますか? なんか感じた事があれば教えてプリーズ。
17 :
デフォルトの名無しさん :02/06/05 21:49
>>16 car, cdr を使うか first, rest を使うかでもめたことがあります
>>17 ありがとう。わかりやすいテーマですね...
19 :
デフォルトの名無しさん :02/06/06 00:22
>>17 >first, rest
これ使ってる人いるの?
>>18 ごめん、ちゃちゃだね。
とりあえず、複数人での開発とういう観点では、
ダイナミックスコープであることを意識しておかないとひどい目に
会うことがある、というかひどい目にあったことがあります。
それと、属性リストは使わないほうがよいと思います。パッケージ
を分けていない場合、複数の人が使ったときに破綻してしまうし、
ソースコード上わかりにくいので。
お前ら的にこのコードは読んでおけ!というSchemeソースを紹介してください
>>20 参考になります。ひどい目にあったというのは free variable を参照
する時でしょうか? マクロとの兼ね合いもありそうですが。
>>21 SICP と R5RS で十分だと思いますよ。
23 :
デフォルトの名無しさん :02/06/06 07:17
>>16 2〜4人で開発したこと(CommonLisp, Scheme) は何度かあります。
Lispハッカーの人は、コメントをほとんど書かないか詳細に書くかの2極に分かれる
ように感じました。コメントを書かない人は、きっと頭の中にロジックが収まって
いるのでしょう。ただコメント無しで高階関数を使いまくられると、ぱっと見た時
関数がどんな関数を受け取ることを仮定してるのかわからないんでつらいです。
分かりやすさという点ではなるべくオブジェクト渡しにしておく方が良いですね。
24 :
デフォルトの名無しさん :02/06/06 10:48
Debianでapt-get upgradeしたらDrSchemeがカコヨクなてたsage
apt-cache search しても DrSchemeなんてないYO!
27 :
デフォルトの名無しさん :02/06/07 07:02
>>26 potatoだとない。woody/sidには入ってる。
>>23 なるほど。名前空間の管理は特に問題ありませんでしたか?
複数人で開発するとなると命名規則を作ったり、名前にプレフィックス
が必要になったりしそうな気がしますが。
29 :
デフォルトの名無しさん :02/06/08 06:01
>>28 LISPだと名前空間は問題にならないんでは?
CommonLispならpackageがあるし、各作業者が定義したファイルを
巨大な1関数として読みこむ(packageの前身?)こともできるでしょう。
packageみたいなのはschemeにも処理系毎に大抵ある。
packageが無くても環境を操作できる処理系があるとすれば、
(define PG-A
(let ((env (load-environment "PG-A.scm")))
(lambda(procedure-name . argument)
(if (eq? 'import procedure-name)
(apply find-environment (cons env argument))
(apply (find-environment env procedure-name) argument)))))
(PG-A 'function1 arg) ;CommonLispのpackage名参照もどき
(define PG-A-function1 (PG-A 'import 'function1))
(PG-A-function1 arg) ;CommonLispのimportもどき
30 :
デフォルトの名無しさん :02/06/11 02:58
Shiroさんage
>>28 こちらでは ACL を使っているので、命名規則は ACL に習って、
public な変数: *foo*
public な関数: foo (そのまま)
private な変数: .foo.
private な関数: .foo
にしています。
>>29 Common-Lisp の package って、
(mypackage::private-function)
のように :: を使えば private な領域にアクセスできてしまうのが
困ると言えば困りませんか?微妙な問題だと思いますが。
32 :
デフォルトの名無しさん :02/06/12 03:44
そういえばSchemeって構造体が無いの? 全部リストにしていたけど,今更ながら違和感を覚えた.
>>32 クロージャでもベクターでも作れますが何か?
34 :
デフォルトの名無しさん :02/06/12 06:36
>>32 リストで何か問題でも?
つっても、まあ気持ちはわかる。
schemeは参照ベースだから全部ポインタだし、
「見なす」ことが多いからね。
よく見かけるのは、vectorでもlistでもいいけど
(*構造体識別タグ* 構造体名 member1 member2 ...)
というデータ構成を「構造体」ということにして、
(define-structure point x y)
とすれば
(define (make-point member1 member2)
(list '*構造体識別タグ* 'point member1 member2))
(define point.get-member1 caddr)
(define point.get-member2 cadddr)
(define point.set-member1! (lambda(s)(set-car! (cddr s))s))
(define point.set-member2! (lambda(s)(set-car! (cdddr s))s))
(define point? (lambda(s)
(and (pair? s)
(eq? (car s) '*構造体識別タグ*)
(eq? (cadr s) 'point)))
辺りを自動生成する様なマクロを組むとかね。
(define-structure point x y)
(define pt (make-point 0 0))
(point.get-member1 pt)
==>0
しまった、member1 member2はx yと置き換えて読んでね。
36 :
デフォルトの名無しさん :02/06/12 11:02
質問なんですが、 (define (test-rec n) (let loop1 ((x 0)) (if(< x n)(begin(display x)(loop1 (+ x 1))))) (let loop2 ((x 0)) (if(< x n)(begin(display x)(loop2 (+ x 1)))))) これ、loop1,loop2両方とも末尾再帰してますか?
37 :
デフォルトの名無しさん :02/06/12 11:16
38 :
デフォルトの名無しさん :02/06/12 19:33
39 :
デフォルトの名無しさん :02/06/12 20:33
>> 31 > :: を使えば private な領域にアクセスできてしまうのが > 困ると言えば困りませんか? 非常時以外はそういうことをしない、というルールを 徹底できれば… モジュール間のインタフェースを摺り合わせつつ開発してて、 別モジュールのあれは非公開だけど使ったらインタフェースが すっきりするんじゃないか、と思い付いた時に、わざわざその モジュールに公開してもらう前に試せる、というのが便利なんですよね。 建前では「そんなことはケシカラン」のですが、「本当にそのように インタフェースを変更することが有効か」を検証するためには 一度組んでみなければならない場合もあるわけで。 iterativeに開発してて、明日デモらなくちゃならんとかいう 追い込みの時は特に… そういう意味では実にハック向けの言語ですね。 デモが終ったらそういうハックを忘れてそのままにしてしまう 危険はありますが。
40 :
デフォルトの名無しさん :02/06/13 06:30
41 :
デフォルトの名無しさん :02/06/13 06:56
>>36 named-letはinternal-defineやletrecと同じ扱いなので、
その例では末尾再帰です。
42 :
デフォルトの名無しさん :02/06/13 10:03
JavaとLISPって相性良さそうだね。 ガーベジコレクションを意識する必要ないだけで、かなり。
44 :
デフォルトの名無しさん :02/06/13 22:47
妙に c がおおいc なぁco2-→-c3 -o2
47 :
デフォルトの名無しさん :02/06/13 23:29
非常に感覚的な話なんですが、どうも日本では Scheme のほうが Common Lisp より人気があるような気がするのですが、 これはどういうわけなんでしょう? 「(ぷっ) Common Lisp だって! あれって(言語仕様がAdaなみに) ばかみたいにでかいよね!」 みたいな反応をWeb上や雑誌などで何回かみたことあるんですが、 おまえら、どうですか? (2ch ではこういう物言いが正しいのですよね) Common Lisp がでかいというなら C++はどうなんだろうとおもう今日この頃 です。(Adaのことは詳しくないけど、あなどれないらしいという噂はききました。) ちなみに漏れは、Emacs lisp -> Common Lisp という順に進みました。 P.S. あと、Schemeは確かISOの国際規格になっていて、Common LispはANSIどまりでアメリカの規格でしかないということも知っています。あと、ISLisp (だったかな)とかいうLispの国際規格があるらしいけど、実質的に放置プレイ されていることも知っています。
僕は脳味噌の記憶容量が少ないので、Scheme の方が好きです。 規格はあまり気にしてないかな。Common Lisp も嫌いではありませんが、 よくわからんので中途半端にしか使えません。Emacs Lisp は書けます。
49 :
デフォルトの名無しさん :02/06/13 23:51
>> 48 はっきりいって、Schemeの各処理系もR5RSだけでは耐え切れなくて Common Lisp にあるような機能を独自に拡張したり、 ど忘れしてしまったけど、ユーザーレベルの規格みたいなものを決めていこうと いう動きがあるよね? それだったら、とりあえず Common Lisp を使ってしまって、いいんじゃないの? と思うんだけど。 Kyoto Common Lisp を書いた偉い先生もたしか、 エッセイで「アメリカは嘘っぽいことをもっともらしく言うけど、 結果オーライで、Lispプログラムの互換性がとれればまぁ、我慢できるかな」 みたいなことを言っていたのを読みました。 Common Lisp の制定時に、金がからんだり、政治的な思惑があったらしい ということは、当時者ではないので、詳しくは知らないけど、噂レベルでは 知っています。(漏れはcomp.lang.lispをたまに読んでいるので、Common Lisp 制定時のEditor だった KMP さんがいろいろ昔話をするのを読んだりして、その当時の雰囲気を察しています。当然一方的になるのは承知ですので、カンウンター情報希望。)
>>49 他人の定義した関数を調べるよりも、自分でササッと書いてしまった方が
楽な場合が多いので、あえて Common Lisp を使う気になれないんです。
もし多くの処理系で動作する事が最重要課題のひとつであるならば、
Common Lisp を使いますよ。
あとは、Scheme の proper tail recursion の存在が非常に大きいです。
全ての Common Lisp 処理系でこれが使えたら、Common Lisp を選んで
いたと思います。
>>44 「正規」どういう意味?
こっちがX3J13で採用されたんだっけ?
>>49 CLtL読んだ?
Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
竹内さんがCommon Lispのヤな所を書いた記事もあったはず。
俺はCommon LispはCLOS以外忘れた。
52 :
デフォルトの名無しさん :02/06/14 00:25
53 :
デフォルトの名無しさん :02/06/14 00:39
>> 48 > あとは、Scheme の proper tail recursion の存在が非常に大きいです。 これはたしかに、Common Lisp の規格には含まれていません。 しかし、これってそんなに必要っていうか、重要でしょうか? proper tail recursionが保証されているっていうのは、 プログラムのその部分の実行速度が高速になるという思惑があるんですよね? 現在、すでにかなり酒を飲んでいるので、厳密な書き方が不可能なんですが(すいませんはっきり言って変なこと言っても見逃してくれモードに入っています)、 proper tail recursionとか言っても、なんか、foo-BANGみたいな むりやり別の関数を定義して、accumulator変数、(つまり結果を累積するための変数)なんかを引数としてとる関数を別に定義したりする必要が出て来たり しませんか? 漏れはそんなことするくらい実行速度を速くしたいなら、そこだけ、Cなり、 アセンブラなりで記述すえばいいと思います。 あぁぁ、今これを書いていて、なんだか知らないけど、Mozillaのメールウィンドウが馬鹿みたいに立ち上がって、今まで書いたことが無駄になりそうに なったので、とりあえずこれだけを送信します。(はっきりいって2ch初心者です。)
Arc
>>53 僕が proper tail recursion に期待しているのは、実行速度ではなく
可読性と記述性です。他の言語を使用していていると、proper tail
recursion ならスッキリ書けるものをわざわざ汚いループ構文や
制御変数を使ってバグの元を作らなければならない事態にストレスが
たまるんですよ。
56 :
デフォルトの名無しさん :02/06/14 00:57
>>51 >
>>44 > 「正規」どういう意味?
> こっちがX3J13で採用されたんだっけ?
というか、X3J13規格(って言うんだっけ?)そのものに、規格制定時に
もめた事項、つまりだれかが文句を言って、それが採択されたりした経緯
もあわせて収録されていると思います。
comp.lang.lispの雰囲気では、 CLtL1もしくは2を元になにか言おうとすると、「1は規格を制定した団体が認めたものだけど、2はちがうよ、
規格そのものを見てね」みたいな雰囲気です。でもこれは一日本人が
つたない英語理解能力で解釈したものです。
> Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
> 竹内さんがCommon Lispのヤな所を書いた記事もあったはず。
ここは確か、書店でCommon Lispという書名で分厚い本を見た記憶があるのですが実際には読んでいません。(翻訳を誰がやったのかとか、他のコンピュータ
関連の日本語訳でいたい目にあって段々翻訳を信用しなくなっていた時期なので読んでいません。残念です。でも竹内先生の「はじめての人のためのLisp」は
最初に読んだLisp啓蒙書なのでなんだか良い気持。{でも最初は何内輪受けしてんだこの学者野郎ーという感想})
57 :
デフォルトの名無しさん :02/06/14 01:07
>> 48 > 僕が proper tail recursion に期待しているのは、実行速度ではなく > 可読性と記述性です。他の言語を使用していていると、proper tail > recursion ならスッキリ書けるものをわざわざ汚いループ構文や > 制御変数を使ってバグの元を作らなければならない事態にストレスが > たまるんですよ。 求めるものが可読性とかなら、勝手にそういうふううに書いとけば、最低限, 結果は正しくなるとおもいます。というか、だって、proper tail recursion って、(速度はどうだっていいっていうのなら)、その関数内で、実行するのがその関数への呼び出しだってことだけだよね? そしてそれは実装上じつは、 ループで済んでしまうのでしたぁ!!!!!ってことだけだよね?
58 :
デフォルトの名無しさん :02/06/14 01:29
あぁ、みんな軟化書き込んでくれ、っていうか漏れはDebian使ってるんだが、 日本語が何かいい壊れ具合。加えて2chデビューしたのも良い気分。 酒飲んで酔っ払って井幾分。今日、Common lispに校夷狄な書き込みしたのは 同一人物だ。みん適当な書き方でなですまん。そのうち埋め合わせするつもりだ。
59 :
デフォルトの名無しさん :02/06/14 02:23
俺がSchemeの方を使っているのはSICPの影響かな. CommonLispはほとんど使ったことがないのだが,話によると 関数と変数の名前空間が違うとのことだそうで. それって関数もデータとして扱う関数型言語として非常によろしくないような気が…. 商用Schemeが少ないのは少々困りものだが,まぁローカルでごにょごにょ書くときは slibもあるしsrfiもあるし,まぁ無駄に多くプログラムを書く必要性は少なそうね.
60 :
デフォルトの名無しさん :02/06/14 06:45
>>57 > 求めるものが可読性とかなら、勝手にそういうふううに書いとけば、最低限,
> 結果は正しくなるとおもいます。
そういえばそうだなあ。性能もやっぱり気になるんだよなあ。
100Mくらいあるログファイルをがーっとなめる処理なんかを
よくtail callでがしがし書くんだけど、それがproper tail recursion
で実行されてないとなると、やっぱり気がひけるんだなあ。
61 :
デフォルトの名無しさん :02/06/14 07:13
>>59 symbol-functionとsymbol-valueが別にある、
ってのはSteeleも「やめておけば良かった」点として上げてるね。
けど、互換性考えると"Common" Lispとしては、
そういうわけにいかなかったと思うけど。
62 :
デフォルトの名無しさん :02/06/14 07:14
proper tail recursionがtail recursive callがloopになるという意味なら 実行速度よりもスタック消費無しというのが重要なんじゃないのか? スタック喰い潰して途中終了という事がなくなる。 ちなみにcommon lispでもコンパイラは大抵そのように扱ってくれるので 問題があればコンパイルすれば大抵大丈夫。
63 :
デフォルトの名無しさん :02/06/14 07:16
>>56 > というか、X3J13規格(って言うんだっけ?)そのものに、規格制定時に
> もめた事項、つまりだれかが文句を言って、それが採択されたりした経緯
> もあわせて収録されていると思います。
それがCLtLで、
>>44 のHyperSpecとは違うんじゃない?
これnoteやrationaleが全くないよね。
64 :
デフォルトの名無しさん :02/06/14 08:55
>61 > symbol-functionとsymbol-valueが別にある、 > ってのはSteeleも「やめておけば良かった」点として上げてるね。 いまさらながら Emacs Lisp を使いこなそうと思ってドキュメントを読んでます。 Scheme では symbol は function と value を別にもつって事はないのですか??
65 :
デフォルトの名無しさん :02/06/14 11:04
質問です 文字列のなかから、特定の文字列が含まれるときにtrueを返す関数って ないでしょうか? たとえば、 str1="ようこそ2ちゃんねるへ" str2="ようこそ15ちゃんねるへ" str3="2ちゃん" で、str1とstr3で比較するとtrue、 str2とstr3で比較するとfalseが返る感じです。 おながいします
66 :
デフォルトの名無しさん :02/06/14 11:05
すいません
>>65 は誤爆です。無視してください。
vb質問に書き直します
67 :
47, 49, 53, 58 :02/06/14 11:31
>> 62
まったくそのとおりだね。返すことばもありません。
>> 63
いわゆるHyperSpec
http://www.xanalys.com/software_tools/reference/HyperSpec/Front/index.htm の本文は、(いろんな意味での間違いとかヤな部分も含めて)X3J13規格書そのもの。
そんでそれプラス独自にrationale見たいな感じでだれそれがこんなこと云ってました、そんでそれが採用されましたというのも含まれています(あれ、ANSIの規格書
にもこれは含まれているのかな)。
いま思い出したんだけど、CLtL2が出版されたあとで変更になったこととか
あるから、規格書を見た方がよいという理屈も comp.lang.lisp ではされたいたな。
読みやすさの問題があるだろうけど、いちおう「ルール」としては規格書を見るのが
普通だよね。(K&R vs. ISO C みたいな構図?)
68 :
デフォルトの名無しさん :02/06/14 14:47
X3J13とANSIって、なんかちがうの?
すんまそ。67では両方とも同じ意味で書きました。ANSIは組織のおおもと。 X3J13はANSIという組織にあるCommon Lispの規格を決める委員会だとおもう。
70 :
デフォルトの名無しさん :02/06/15 01:03
70ゲットオォズザ
Part4 に書き込んでる人がいたので、あんなことやりました。
comp.lang.scheme で話題になってる問題。 (call/cc (lambda (c) (0 (c 1)))) => 1 DrScheme だと 1 になって、Guile だとエラーになりました。 これはいかがなものか。
74 :
デフォルトの名無しさん :02/06/15 13:23
>>73 オレはそのままでいいと思う。それは揚げ足取りというか、
実際に問題になることはないんじゃねーの?
>>74 たしかに。気にする程の事でもないですね。
ところで Lisp 使いの人って、オブジェクト指向をどう捉えてるんでしょ。
別に激しく議論する程のものでもないと思ってるのかな。
自分はオブジェクトとして扱うと便利かな? と思う時に使う程度。
抽象化の過程で無意識にオブジェクトとして扱っている場合も多いん
でしょうけど。
Common Lisp の好きなところ 1.シンボルを関数と値の二つを持つから、変数名に car とか list とか気がねなく使える. (cf. Scheme の好きなところ 1) 2.(defun "ドキュメント" (arg) body) みたいに、ドキュメントを入れられる. (他人の src 読むとき非常に便利) 3.keyword 引数. 4.コンパイルできる. Scheme の好きなところ 1.(defun foo (f) (funcall f)) じゃなくて (define (foo f) (f)). (cf. Common Lisp の好きなところ 1) 2.continuation.
追加 Scheme の好きなところ 3.コンパイルしなくても末尾再起.
>>73 評価器の作りの違い。
オペレーターに対しての評価成否をどこで判定してるかの差。
>>78 しつも〜ん。
> (call/cc (lambda (c) (0 (c 1))))
0なんて関数は(ふつう)定義されていないから、エラーになるという解釈と、
それ以前に引数の評価で continuation を呼び出しいるために1がそのまま返される
という解釈?
80ゲトズザ
81 :
デフォルトの名無しさん :02/06/16 00:07
>>73 4.1.3 Procedure callsにあるように
oprator, oprandの評価順は"in an unspecified order"だから、
Dr.Schemeもguileも仕様通りの実装。
>>73 のコードが実装依存なだけと思われ
R5RS: The operator and operand expressions are evaluated (in an unspecified order) and the resulting procedure is passed the resulting arguments. オペレータとオペランドの式は評価され (unspecified な順で)、結果の 手続きが結果の引数をパスされる。 ; ひどい訳だ と書かれていますよね。ってことは、0 が procedure として引数をパス される前に (c 1) は評価されるべきなのでは?
>>73 その英文だけから判断すると、0と(c 1)は unspecified な順で、つまりどっちが
先かは処理系に依存する順番にevalされてってことだから、やぱーりエラーになるか
1が返されるかは、処理系依存だろ。0でさえもevalされてから
オペレータオブジェクトみないなものになってから(漏れは scheme 用語知らん)
呼び出される。
ごめん、82を73とまちがえちゃった。
つーかもしかして「0って数字だからformの先頭にあったらだめですよ」 という罠?
86 :
デフォルトの名無しさん :02/06/16 09:37
>>82 いや、Lispと違って、Schemeは、
(f x1 x2 x3 ...)のfもevalされてからapplyするの。
>>86 ああ、7.2 Formal semanticsがおかしいんじゃねーの? って話か。
確かに"runs out of memory"になるsemantics付けはおかしいな〜。
まあ⊥には違いないわけだが(w
どうやったらfixされるかは書いてないね。
>>87 それは知っとるよ。要は 0 が procedure である事を要求されるのが
apply 時が eval 時かって事でしょ?
89 :
デフォルトの名無しさん :02/06/16 21:00
質問です。 (define x '(a b c)) (set-cdr! (cddr x) (list 'd)) 2つ目のリストは、なぜ (a b c d)なのでしょうか? (cddr x) => (c) なのだから、2つ目のリストは(c d) になる ように思うのですが!?
90 :
デフォルトの名無しさん :02/06/16 21:30
>>89 2つ目のリストってのは何のこと?
1行目で(a b c)というリストが作られて、2行目でそれを変更してるだけでわ?
91 :
デフォルトの名無しさん :02/06/16 21:50
>>90 質問が少し間違いました。
[1] (define x '(a b c)) => x
[2] (set-cdr! (cddr x) (list 'd))
[3] x => (a b c d)
なぜ[3]は(c d) ではないのでしょうか? という質問でした。
(あっ!)すいません。今、理解できました。リストxの
3つめのアトムにset-cdr! するのですね。だから(a b c d)。
お騒がせしました(^^;
(setq x '(a b c)) (setf (cdddr x) (list 'd))
93 :
デフォルトの名無しさん :02/06/17 06:06
>>89 >>92 constant listを変更しちゃいかーん。
Schemeだとホントはset-cdr!の時点でエラーになるべき。
Common Lispだと定数リストを変更した場合の動作は未定義だっけ。
94 :
デフォルトの名無しさん :02/06/17 08:35
>>93 Scheme初学者(89書き込みました)です。89は本の例題でした。
ところで、なぜ「 constant listを変更しちゃいかーん。」の
でしょうか?その辺が関数プログラミングの真髄ですか??
関数プログラミングの利点を知りたいな。。。
95 :
デフォルトの名無しさん :02/06/17 08:56
>>94 その本何ですか。
とりあえず、Schemeでそれをやっちゃいけないフォーマルな根拠は
R5RSのsection 3.4 "Storage model" の最後のパラグラフ。
Constant list (literal listの値)を変更してはいけない理由は、
- そういうオブジェクトはコンパイルされた時read-only memoryに
置かれる可能性がある (ハード的なROMというわけではなく、text
regionなどの変更不可なエリアも含む)。
- コンパイラは最適化によって、そういうオブジェクトをプログラムの
他のデータと共有することもある。破壊的操作をすると思わぬ箇所に
影響が出る可能性がある。
後者は最近、comp.lang.lispで「一行づつ実行すると動くのに関数に
まとめると動かない!」って誰か悩んでいたな。
(setq x (list 'a 'b 'c))
(set-cdr! (cddr x) (list 'd))
なら良い。
96 :
デフォルトの名無しさん :02/06/17 09:28
97 :
デフォルトの名無しさん :02/06/17 10:08
Common Lisp 規格のSpecial Operator QUOTE の項から。 > The consequences are undefined if literal objects (including > quoted objects) are destructively modified. ちなみにHyperSpecではliteralにリンクが張ってあって、 次のような glossaryにあるliteralの定義に跳びます。 literal adj. (of an object) referenced directly in a program rather than being computed by the program; that is, appearing as data in a quote form, or, if the object is a self-evaluating object, appearing as unquoted data. ``In the form (cons "one" '("two")), the expressions "one", ("two"), and "two" are literal objects.'' こりゃいいやね〜。
>>96 もちろん、
(equal? '(a b c d) (list 'a 'b 'c 'd)) ==> #t
です。そういう意味では同じ。ただ、(list 'a 'b 'c 'd)は評価される
たびに新しいリストが作られることが保証されているのに対し、
'(a b c d)はコンパイラがあらかじめどっかにリストを作っておいて
そのポインタを返すだけ、とするかもしれない(処理系依存)。
(define (foo) (list 'a 'b 'c 'd))
(equal? (foo) (foo)) ==> #t
(eq? (foo) (foo)) ==> 常に#f
(define (foo) '(a b c d))
(eq? (foo) (foo)) ==> #tかもしれない
Scheme で eq? 系のオペレータってどれくらいあるの? Common Lisp には、eq, eql equal, equalpの4つ。
>>99 equalpってなんだっけ?
schemeでは
eq? (= eq)
eqv? (= eql)
equal? (= equal)
の3つだけ。
あとはmemq,memv,member/assq,assv,assocみたいに
比較形式毎に関数が用意されてるとか。
102 :
デフォルトの名無しさん :02/06/17 11:30
>>98 回答ありがとうございます。
しかし、98の内容は初学者には恐ろしい事実ですね。リストデータ
は '(a b c d) ではなく、 (list 'a 'b 'c 'd)で作るべきなのでしょ
うか? 少なくとも変更するかが不明な場合には、'(a b c d) は
使わない方がいいと言えますか?
>>102 そう考えるより、「何だか面倒臭そうだから、破壊的な操作はしないでいいや」
と考えるのがイカス漢の印。
104 :
デフォルトの名無しさん :02/06/17 11:43
>>103 了解!
さまざまなWEBページで述べられている”副作用なし”
指向ですね!? これがプログラミングの簡単・高品質化に
どういう効果があるのかが、まだ理解できてません。
勉強します。
どうも、ありがとうございました!!!
>>104 >>95 > オブジェクトをプログラムの他のデータと共有することもある。
> 破壊的操作をすると思わぬ箇所に影響が出る可能性がある。
shiro さん 「なんでもλ」「なんでも再帰」の後「なんでも継続」 書いて3部作にするってどっかに書いてたのにな。 早く読みたいなぁ、とか独り言。
107 :
デフォルトの名無しさん :02/06/17 23:12
>>105 ハゲシク同位。
「なんでも継続」みてみたい。
イマイチ継続の使い方を知らないからー
109 :
デフォルトの名無しさん :02/06/17 23:46
マクロと継続を使ったことが未だない…
こんなのどうよ?ただのパクリだけど。 (define tree '(a (b c (d) e) (f) g)) (define gen (tree->generator tree)) (gen) => a (gen) => b .... (define tree->generator (lambda (tree) (let ((caller '*)) (letrec ((generate-leaves (lambda () (let loop ((tree tree)) (cond ((null? tree) 'skip) ((pair? tree) (loop (car tree)) (loop (cdr tree))) (else (call/cc (lambda (rest-of-tree) (set! generate-leaves (lambda () (rest-of-tree 'resume))) (caller tree)))))) (caller '())))) (lambda () (call/cc (lambda (k) (set! caller k) (generate-leaves))))))))
>>110 どっからパクったんだゴラァ!
さしつかえなければ教えてください。
どなたか、Common Lispでは絶対実装できない(もしくはすごい汚いか、 ちょっと苦しいよみたいな -> Cでobject oriented (gtkとか)) というような continuation の使い方の例を挙げてくだしい。
114 :
デフォルトの名無しさん :02/06/18 00:48
>>109 Scheme じゃなく Common Lisp についてだけど、マクロの"威力"を解説した
本としてよくPaul Graham さんの「On Lisp」が一部で話題になることがあります。
そしてそれがオンラインで読めます。
http://www.paulgraham.com/onlisp.html 漏れはマクロを駆使して Common Lisp で continuation の真似をする
というのが、食道や腸の方を表になるように裏返した人間を見たようでワラタ。
115 :
デフォルトの名無しさん :02/06/18 14:43
CLOS の分かりやすい解説のページってどこかにありますか? 日本語がなければ英語でもいいです……
116 :
さすらいのelisper :02/06/18 14:59
117 :
さらわれた Common Lisper :02/06/18 21:01
>>114 見て common lisp やりたくなって前スレでおすすめされてた
cmucl の deb を入れてみようとしたんだけど。。。
cmucl cmucl-clm cmucl-normal cmucl-safe cmucl-small cmucl-source
と全部入れても cmucl コマンドないよ。コマンド名が違うの?
119 :
さんざんなlisper :02/06/19 00:32
あとcmuclを本格的に使うつもりなら、エディタのEmacs上で使用する ilisp パッケージも入れた方がよい気がする。 ターミナル画面でマターリ楽しむ木なら、clisp パッケージを入れた ほうがreadlineライブラリを使っているのでイイ! って、もしかして以前、とっくに同じ説明がされているという罠。
>>119 あり?公式サイトらしとこには cmucl で起動してるようなのがあったような
気がしたのに。。逝ってきます。
>>120 なるほど。ilisp も入れます。ありがとう。
cmucl は CMU(カーネギー メロン ユニバーシティー) のちーむが 米軍(じゃなくてDefense of 俺の国みたいな役所)から金を引っ張ってきて、 気合いを入れて書いた処理系なので、現在市販されている 処理系に蚊って しまっている所もあるエライものです(なぜこんなのがタダ? そしてpublic domain? ちなみに paul graham がアフォみたいに 金を家政だYohoo関連のものはclispを使っているらしい)。 コンパイラは型情報をかなり積極的に利用したり、もともと数に関する処理 を刺せるつもりだったらしく数値処理も速いらしい。 「lisp なんて(実行速度)遅いよねっ!!」とか 「lisp に代表される動的な型をもつ言語って実行児にならないと 菜にしでかすかわからなくて、コワーイ!!!」 っていう人たちに、「データの型ってのはコンパイル児にかなり予測できる ものですよ」とか、「型についてもコンパイル児によろうとおもえばチェック できますYO!」とかを示すのに使われているのを目撃しますた。
>>116 ,117
サンクスです。
一応googleしてみたのですがなかなかめぼしいものがなかった
(特に日本語は)ので、助かりました。
お二人とも素敵なハンドルでよいですね。
>>120 私はオートインデントが無いと括弧の数を合わせられないヘタレなんですが、
やっぱりEmacsを使うべきでしょうか?
>>124 Emacsを使っている人が目立つだけで、他のエディターでもカッコの
面倒をみてくれるやつなら無問題じゃないの。
126 :
デフォルトの名無しさん :02/06/19 12:45
質問です。 Schemeで使えるWEBアプリケーションのフレームワークって ありますか? (ライブラリ?) 願わくば、javaのメッセージ・リソースによる国際化のような ことができればいいですが。。
127 :
デフォルトの名無しさん :02/06/19 12:55
128 :
デフォルトの名無しさん :02/06/19 13:17
はい、そうなんですけど、 leadlineまで使っているclispならコンソールでもそういった事をしてくれるかな、と ……そんなはず無いか。一度使ってみよう。
>>129 clispのコンソール画面で、()の対応を見せてくれるよ。
)を打った時点で対応する(に一瞬だけカーソルが跳ぶよ。
ふと思ったんだけど、Common Lisp にはコンパイラがあるのに Scheme にはないのはなんで? Scheme の場合は C に変換する っていうのはよく見るんだけど、自前でコンパイルできます、 みたいなのは見たことない。
Kawaというschemeの処理系は、JavaのVM(virtual machine)に対する バイトコードを出力するバイトコードコンパイラを備えています。 ネイティブコードコンパイラを備えているschemeがあっても全く不思議ではなく、 また実際に存在するのではないでしょうか。 でも多くの処理系では(独自の)バイトコードにコンパイルするだけで、実用上 問題ないスピードがでるのでそれで良しとしているのではないでしょうか。 それによってコンパイラを含めた処理系の移植性が向上することのほうが嬉しい のでは?
あと、どんな処理をさせるかによるでしょうけど、いわゆるスクリプト言語 的な使用をするときは、バイトコードにコンパイルする必要さえない場合もある だろうし、また、バイトコードにコンパイルしたところで必ずしもスピードアップ につながるわけではないらしいです(昔はコンパイル後のオブジェクトファイルの 小ささをバイトコードコンパイルの魅力としてとらえている処理系もあったらしい)。 Rubyはたしかインタープリターが構文木みたいソースコードの内部表現を そのまま解釈(interpret)していると聞きました。そして残念なことにそれを 理由に2chでたたかれたことがあるとか。
>>122 を見てcmuclすごそう。。と思ったけどclispの方が使いやすそうな気が
してきた。(どうせ難しいことできないし)
あとclispは日本語通るけど、cmuclはだめぽい。日本語通す技があるらしいん
けどNot Foundだった。
>>134 clispはunicode対応だからね(でもたしかメッセージの日本語化はまだだった
ような)。あとclispはWindows系で動くところも魅力だよね。
日本の人が書いたxyzzy というwindows用エディタのマクロ言語も
Common Lisp系だと聞いたことがあります。
あと、Franz社の allegro common lispは WindowsやUnix(Linux他)で
動くんだけど、Windows用のものは、VB や Delphi のような
操作感のフォームエディタが付いています。
他にも Windows用には XanalysのLispWorksや、CormanさんのCorman Lispがあり、Mac用にはMCLがあります。また、MCLの一部がオープンソース化されたもの
(Open MCLだったかな)もあります。
これだけの選択肢がある(他にもKyoto Common Lispの子孫系のECL、GCLなど)
というのも、歴史のある言語の利点でしょうか。
最近、GCL(GNU Common Lisp)を管理されていた方が、本当の意味で逝ってしまわれた そうです。真面目にナムーという感じ。たしかMaximaというMathematicaのような ソフトもあわせて管理していたはず。後継の管理者見つかったんでしょうか?
137 :
デフォルトの名無しさん :02/06/20 02:35
>>136 Σ(゚д゚lll)ガーン
ソースどこですか?いや疑ってるわけじゃないんだけど、、、
ところで、便乗質問のスレ違いで申しわけないんですが、
2ch内で maxima について話しているスレって誰か知りませんか?
>>137 いや俺自身、英語サイトを適当にブラウジングしているときに
「いまならGCLの管理者に君もなれる!(前管理者が亡くなられたため)」
みたいに煽っている文を読んだ記憶があるというだけなんですけで、
確認をするのは御自身でお願いします(無責任ですいません)。
でもmaximaも管理されていたというのはそこで読んだことですので、
嘘だったらたちが悪いというか。。
とはいえ、なんでこんな時間に起きているんだ>俺。
あっと、それから、そのサイトを見たのは今年に入ってからのはずです。
それでは。
139 :
デフォルトの名無しさん :02/06/20 04:52
>>132 1980年代には、Schemeのネイティブコードへのコンパイルはずいぶん
研究されていた。YaleのTとか。
http://www.paulgraham.com/thist.html 今残っているので大きいのはChezSchemeくらいか。
現在のプロセッサの進歩の速度だと、少人数のチームでベンダ製のC
コンパイラとかと張り合えるネイティブコードコンパイラを作るのは
あまり現実的ではなくなっちゃったんじゃないか。
140 :
デフォルトの名無しさん :02/06/20 05:02
>>133 バイトコードだけが中間コード表現ではないよ。
Schemeのようなレキシカルスコープの言語では、中間コードへ
コンパイルすることの大きな利点は変数束縛がコンパイル時に
解決できること。ローカル変数の参照の度に環境リストを
探さなくても、ポインタ参照とオフセットだけで済む。
マクロがコンパイル時に展開できるのも大きい。この2点だけでも、
中間コードへのコンパイルの利点はあるんじゃないか。
SCMなんかはそれらをやった上で元の木構造を保存している。
Gaucheはグラフにしているらしい。
何年か前に、木構造でもバイトコードでも速度はあまり変わらない
とかいう記事を読んだ覚えがあるけど、最近のプロセッサでは
なんとなくバイトコードの方がキャッシュの効きが良さそうな
気がするんだが、どうなのかなあ。
141 :
デフォルトの名無しさん :02/06/20 09:29
Corman Lisp は常にいちどネイティブコードにコンパイルしてから 実行しています。つまりrepループの内部が(print (eval (compile (read)))) みたくなっています。
142 :
デフォルトの名無しさん :02/06/20 19:26
JavaとLispって処理系が似てる気がするんですが、 なんでJavaがはやって、Lispは流行らないのでしょうか? 機能的な比較ができる人がいましたら、教えてください。
>>142 単に一般人が Lisp の良さがわからないだけ。
「みんなが使ってるから」って理由で Java を使ってるんでしょう。
>>142 LispにあってJavaになさそうな機能もしくは違っている点を列挙します。
漏れはJavaはそれほどというか最初のころに仕様をちょろっとみただけなので
おかしいところはどなたかつっこみを入れてください。
* bignum (無制限に大きな絶対値の整数を扱える。でもJavaもありそう)
* ratio (有理数を正確にあつかえる。えーと0.123456を123456/1000000みたいな)
* 動的な型(これは有利な点というより違い)。
したがって型のことは考えなくてどんどん適当なコードを書いていくことができる。
いわゆるプロトタイピンングつまり、大まかにとりあえず動きそうなコード書いて
みる感じ。
* 上の点と似ているが、開発しているときの感じが perl, python, ruby, ...
などのいわゆるスクリプト言語によくにている。ここからこれらの言語は
Lispの子孫なので「Lispは勝ったのと同じ」という"勝ち組"みたいな人もいる。
* LispOSという開発者に取っての桃源境を一度すでに実現している。
* 規格と実装が分かれている。また実装が複数ある。
* CLOS。
+ standard method combination (elisp の adviseみたいなもの)
+ MOP (meta object protocol)
+ change-class みたいに動的に何かをするという機能が満載。
+ 2chでもスレが立っているAOP (アスペクトオリエンティッドプログラミング)
はXeroxが最初 Lisp でいろいろやって目鼻がついてから、
Javaに移植して公開。
* バグが発生したときは基本的にデバッガが立ち上がるようになっているため、
その場でバグを直して実行を継続するなど、絶対に死んではいけないプログラム
などに便利。
* マクロ
* コンパイラマクロがあるため、処理速度のためだけにする記述の仕方などを
ソースには書かずに、別にコンパイラマクロとして分離することができる。
* カスタマイズ可能なreader。printer。これは珍しくないか。
* まだまだいっぱい。
* っーか James Gosling って (元) lisper じゃん。
Javaだけじゃなく,オブジェクト指向はきっちり設計が出来る人なら 後々強力になれるんだが,設計をきっちり出来る技術者が少ないような気がするね. オブジェクト指向ねぇ…,これってどうなんだろ? 「オブジェクト指向は戦場では必要なし」スレでも見てくるか….
147 :
デフォルトの名無しさん :02/06/21 02:47
>>145 > * マクロ
これは膨らまそうとすればいくらでも膨らむでしょう。(Lisp最後の砦というか)
149 :
scheme小僧 :02/06/21 03:35
http://www.scheme.com/tspl2d/ 読み始めました。
Exercise 3.2.6: OR の定義として
A) (define-syntax or
(syntax-rules ()
((_) #f)
((_ e) e)
((_ e1 e2 e3 ...)
(let ((t e1))
(if t t (or e2 e3 ...))))))
が正しくて
B) (define-syntax or
(syntax-rules ()
((_) #f)
((_ e1 e2 ...)
(let ((t e1))
(if t t (or e2 ...))))))
が正しくないわけを述べよ、というのがあります。
これの答えは
(or e1 e2) について、A では e2 が tail call になるが、
B では e2 が tail call ではなくなる(すなわち規格の要求から外
れる)から、だと思うのですが、あっていますか?
※ (or e1 e2) を展開すると、
A: (or e1 e2) => (let ((t e1)) (if t t (or e2)))
=> (let ((t e1)) (if t t e2))
B: (or e1 e2) => (let ((t e1)) (if t t (or e2)))
=> (let ((t e1))
(if t t
(let ((t2 e2)) (if t2 t2 #f))))
いきいきいきいき、いきちくわ
何かの処理系がgccやDelphiのように知名度と実績がある処理系になってくれれば どっかも使ってくれるんじゃない? ベンダサポートの処理系とかじゃないと,処理系のバグが出たとき困るでしょ. え? 自社製Scheme? まーそれはそれでいいかと思われ.
153 :
LispOS :02/06/21 14:40
154 :
名無しさん :02/06/21 18:51
>>145 > * 規格と実装が分かれている。また実装が複数ある。
これはJavaもそうです。(perlじゃねーんだから…)
> * っーか James Gosling って (元) lisper じゃん。
SchemeでCommon LispなSteeleも規格を書いてます。
仕様書書きに慣れているから、細かい所は彼がほとんどやっているとか。
(Javascriptもそれで声がかかったらしい)
>>153 SymbolicsのmachineとかTAOのことじゃないかな?
155 :
デフォルトの名無しさん :02/06/21 20:30
ELIS欲すい 広大に一台あったと聞いたが
何故広大?見たことない
λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ...... λ......
>>145 どうもです。
>* bignum (無制限に大きな絶対値の整数を扱える。でもJavaもありそう)
>* ratio (有理数を正確にあつかえる。えーと0.123456を123456/1000000みたいな)
これはライブラリーを作ればどうにでもなりますね。
というか、チューリングマシン=ラムダ計算
ですから
着目すべきは、どういう点が記述しやすいのか?と言う事になると思います。
できる事は結局同じなんですけど。
>* っーか James Gosling って (元) lisper じゃん。
lisperというか、ほとんどの言語についてかなり詳しいです。
JavaはC++の後継と言われていますが、実は複数の言語の複合体なんです。
いまいち、lispとjavaの違いがわかりません。
違いと言うか、メリット、デメリットの事なんですが。
実はschemeをかじった事があるのですが、それを踏まえて言えば
個人的にはオブジェクト指向で設計して、コーディングするのが好きです。
schemeにもオブジェクト指向がありますが、あれはどうなんですかね。
まだ試した事ないのですが。
一方schemeは関数の集合体のような関数を作成する時
デバッグしつつできるので、便利だと思います。
JavaでもJUNITを使えば、それに近い事はできますが
JUNIT<Lispですね。
Lispはフレームワーク(!=モジュール)のような物を作るのには向いてない気がします。
> schemeにもオブジェクト指向がありますが、あれはどうなんですかね。 > まだ試した事ないのですが。 「オブジェクト指向がある」ってのはどういう意味でしょうか? 処理系独自の拡張という意味か、それとも first class closure を使った 素のオブジェクト表現か。自分としては後者でも十分に実用的だと思って ます。多重継承とかも簡単にできるし。唯一面倒なのは、インタフェース となる関数を書くことでしょうか。まぁ、マクロを使えば楽になりそう ですけど。 (object-method obj)
>>142 Java と Scheme と Common Lisp の機能的な違いという点で、
Java 「おまえらこんな機能あるかゴラァッ!!」
Scheme 「やろうと思えばこんなふうにヴァカみたいに綺麗にできます。」
Common Lisp 「ありますた。というかもっと機能的にぐちゃぐちゃ、ねちょねちょ
したのがあるのでキモイといわれることもあります。」
という感じになってしまうのではないでしょうか。
schemeは知ってらっしゃるということなので、
僕としては Common Lisp そのものか、手軽さという意味で Emacs Lisp
をいじってみることをおすすめします。
>> 160 あと、オブジェクト指向に興味があるということなので、 このスレでも紹介された eieio を Emacs に入れて遊んでみる のも一つの手ではないでしょうか? eieio の作者が言っていたのですが、職場のOOP研修のあとで同僚に 「Emacs Lisp ではあんなことできるはずないよな」といわれて チャレンジ精神を刺激されて、あれを書いたそうです。 いま、Webページを見にいって驚いたんですが、なんかオブジェクト ブラウザとかまで付いて僕が最初に見たときより、だんだん発展している みたいです。
162 :
OOP with lisp :02/06/22 18:10
なるほど〜 Lisp ではオブジェクト指向プログラミングのための枠組みは 言語仕様に取り込まれているわけではなくて、 ライブラリ(というか関数群?)として提供されているのですね。 C <==> C++ の関係とはぜんぜん違いますね。なるほど。 あ、cfront みたいなものか…違う気もする…
>>162 つーか幻の統一言語というか(w
言語の拡張もLispで書く。
MakefileもLispで書く。
DebuggerもLispで書く。
テストもLispで書く(当然その枠組もLisp)。
とうぜんOSもLispで書く。
「Lispみたいな高水準言語でデバイスドライバーが書けるのかよ!」
「書いて金もらってましたが、なにか?」
みたいな会話が comp.lang.lisp で行われています。
Lisp に興味を持って最近 emacs lisp で学習中。 いままで他人の .emacs とかをコピペするだけだったんだけど、 だんだんその内容がわかってきてうれしい。 いままで苦労して書いていたシェルスクリプトも lisp のほうが 書きやすいんじゃぁ…と思い出してきました。 あとは漏れの C 関数群 (てか C++ クラスライブラリ) の *.so が 呼び出せればなぁ、てか、そもそも「リンク」って概念がないのか。 さすがに Emacs 21 の組み込み関数として実装しなおす気にはなれないなぁ。 それわそうと、 Makefile も Lisp で書くってのはマジ?? それって GNU make と同等の動作をする Lisp プログラムがあるよ、ってこと? それとも make + Makefile でやらせてる動作そのものを lisp でやらせるってこと? 「 Makefile も Lisp で書く 」ために便利なライブラリとかがあるんでしょうか?
>>162 > それって GNU make と同等の動作をする Lisp プログラムがあるよ、ってこと?
> それとも make + Makefile でやらせてる動作そのものを lisp でやらせるって
> こと?
その中間というか、いわゆる defsystem といえば Lisper の間では通じるらしい
のですが、つまり、Unix の make 相当のLispプログラムがあって、
そんで、Makefile 相当のものは、Lisp で記述するらしいです。
漏れはまだいじったことがありませんが、できるだけ多くの処理系を
サポートするように努力しているオープンソースプロジェクトのdefsystem
もあるらしいです。
>>164 > あとは漏れの C 関数群 (てか C++ クラスライブラリ) の *.so が
> 呼び出せればなぁ、てか、そもそも「リンク」って概念がないのか。
> さすがに Emacs 21 の組み込み関数として実装しなおす気にはなれないなぁ。
えーと、Emacs 21用が存在するのか分かりませんが、Emacs-dl みたいな
パッチがあって、共有ファイルの動的なロードを可能にするものです。
これがEmacsになんで含まれていないかというと、RMSが嫌がった(理由忘れた)と
いう噂を聞きました。
レスどうもです。 >僕としては Common Lisp そのものか、手軽さという意味で Emacs Lisp どちらか挑戦してみます。 StandardMLとかはどうなんですか? Schemeと大差ないなぁというとこまでしか、知らないのですが。 >Common Lisp 「ありますた。というかもっと機能的にぐちゃぐちゃ、ねちょねちょ >したのがあるのでキモイといわれることもあります。」 言語を評価する際にいくつかの基準があると思います。 チューリングマシン=ラムダ計算=帰納的関数 なので、どういう計算ができるかという基準はナンセンスですね。 また、言語を評価する際に実行速度やメモリ効率を語ってしまうのもナンセンスだと思います。 あるアルゴリズムを記述する方法があればいいわけなので、 あとはコンピューターが高速化、効率化をすればいいわけです。 OOPLではないC言語であっても OOPは可能であるなんて話が、OOは必要なしスレでよく見かけますが、 そのとおりで Cしか使えない環境でも、OOが理解できてる人は CでOOします。 しかし、それをC++でかいた方が便利です。 便利というのはどういう事かといえば、 簡潔に記述できるとか、見易く記述できるとか、 バグがでにくく記述できるとか、そういう事ですね。 そういう意味では機能的と書いたのは誤解の大元になってしまった気がしますが。 .emacsはlispというよりは、listですよね。 xml vs list だったら、listを支持しますね。 簡潔ですから。
168 :
デフォルトの名無しさん :02/06/22 23:51
MLはいじったことないのですが、強い型付け(だっけ?)仲間であるHaskellの ドキュメントをすこし読んだり、ライブラリのソースを見たことがあるんです が、type inference と type のパターンマッチングだっけ? ちょっと感動しました。 ここらへんのイイ!!という感覚を短くうまく説明した文書が、 Perlの伝導師みたいな人が Haskell を何かの集会で紹介したときにした 文書がwebのどこかにありました。 オマエ perl を捨てるんかゴラァッ!! と何人かに言われてまいったと言っていまし た。
169 :
デフォルトの名無しさん :02/06/22 23:53
JAVAは登場した時から、 コンピューターが高速化すれば、 問題は可決するといっていた。 コンピュータは格段に高速化したが、 未だにJAVAは糞重いままだ。
>>169 JavaはCPUというかハードウェアの違いをVM(バーチャルマシン・仮想機械)
として抽象化して異なるハードウェアにはVMだけ移植すれば
互換性がとれてウマー!
という理屈なんだけど、別に最低ラインがVMだというだけであって、
WINTEL用にはネイティブコードコンパイラがついていたって何もおかしく
ありません(GNU のコンパイラはJavaからネイティブコードにコンパイル
してくれるはず)。とはいってもクラスファイルになったバイトコードだけ
を他のハードウェアにも漏っていって実行したい(アプレットとか)という
欲望があるために、JIT(ジャストインタイムコンパイルだっけ?)
という(Cecil(かな)かsmalltalkのベンダーから勝ったのかな..)
RAMの中でコンパイルして実行というしかけがあって、いまはHotSpotとか
いってるけどまだ遅いのでしょうか?
perl, python, ruby などのスクリプト言語もオセーヨ!と
ネイティブコードコンパイルしていないのがバレると言われがちですが、
じゃあ単純にコンパイルすれば速いのかといわれれば、これらの言語は
動的な型付けをもつために実行時に正しい型かどうかのチェックを
しなければならず、意外に遅いままだったりします。
これは、Perl の B コンパイラだっけ? とか GCL (Cに変換)でやってみれば
実感できます。
あっと、これらの言語では(たぶん)、変数の値はその言語でのオブジェクトに
対するポインタですべてを表します。
そんでアラインメントの関係で一番下(LSB)が自由に使えたりするので
それでfixnumとオブジェクトへのポインタを区別するとか
涙ぐましい努力をします。(ここらへんのテクニックは論文になっていて
NECの論文データべーすで見付かります)
じゃあ、速くするためにはどうしたらいいのかといえば、データの型を
コンパイル時にあらかじめ予測するとか、型の宣言をどうしても必要な
ときだけプログラマーにしてもらうということになります。
そんで Common Lisp にはその型宣言が用意されています。そんだけ。
171 :
デフォルトの名無しさん :02/06/23 01:10
>>170 最初から強い型付き言語でかけばいいじゃん。
Lisp と Java の話で盛り上がっていますね。 アホな疑問なんですが、Lisp と Java が似ているっていうのは具体的にはど の辺が似ているのでしょうか? Java の オブジェクト指向(class)と Lisp の closure でしょうか。まだ勉強 中なのでその辺しか思いつかないんですが、似ていると言うからにはその他に もいくつかあるのでしょうか?
>172 似てるとは思わない。スコープだって…
174 :
デフォルトの名無しさん :02/06/23 01:51
>>172 GCかな?
Lispの真似してるらしいけど。
>コンピュータは格段に高速化したが、
>未だにJAVAは糞重いままだ。
どこが遅いんだろう・・・・
15年前のスパコンで実行してたシミュレーションが
20個程並列に動くんだが。
175 :
デフォルトの名無しさん :02/06/23 02:01
>> どこが遅いんだろう・・・・ どこが遅くないんだろう・・・・
何処が遅いといわれればAWTとかSwingが遅いんだろう。
177 :
デフォルトの名無しさん :02/06/23 02:18
>>172 C++がCにどんどん機能を付け足したのに対して、
Javaは要らない部分を削ってシンプルにしようとした。
CommonLispが古いLispにどんどん機能をつけ足したのに対して
Schemeは要らない部分を削ってシンプルにしようとした。
KISSの精神ってやつ。
Java = C++--
>>177 #Javaってバージョン上がるたびに見事に肥大化してると思うが。
>>179 うん。思う。だから悲すぃ。
でも、初めの頃は凄い志を感じたし、今でも他の言語に比べたらましじゃね?
「シンプルにした」じゃなくて「シンプルにしようとした」って書いたのはそんな気持ちから。
それに対してSchemeも"今はまだ"シンプルさを保ってるけど、
もしJavaと同じくらいのプログラマ人口をかかえるようになれば、
Javaと同じ運命をたどる気がしない?
そう言う意味でやっぱり似てるかなと。
181 :
デフォルトの名無しさん :02/06/23 03:12
Schemeの実行速度の速い実装てあるの? cmuclなみのやつ。
182 :
デフォルトの名無しさん :02/06/23 04:28
>>171 ただ、ほとんどの場合、ボトルネックになっている部分だけ
オプティマイズすればいいんで、全部の型を宣言する必要は
ないと思うんだよね。とりあえずぱぱっと書いて動作を確認
して、それからプロファイルを取って、キツイところに
declareを足して行く、というのがCommonLispのスタイル。
>>181 Chezは速いらしいけど。フリーのものならBiglooなんてどうでしょ。
183 :
デフォルトの名無しさん :02/06/23 05:04
シェルスクリプトとかperlみたく、ファイルの最初の行に #!/usr/local/bin/??? って書いて実行できるschemeインタプリタって無かったっけ?
scm
Scheme じゃないけど、 #!/usr/bin/emacs -batch とかもいけたかも…? いや、試したことないけど。
187 :
デフォルトの名無しさん :02/06/23 11:04
>>182 Lispではボトルネックを見つけるのが難しい、ってどっかで聞いた
んだけど、本当?
>>182 そのスタイル、そっくりそのまま強い型付言語の、type inference
にもあてはまるんだが・・・
強い型付きなのに宣言しなくても良いというのが型推論機構をもつ
MLやHaskellの特徴。
189 :
デフォルトの名無しさん :02/06/23 14:13
>>183 #!/usr/local/bin/gosh
(define (main args)
...
)
190 :
デフォルトの名無しさん :02/06/23 22:33
>>188 > そのスタイル、そっくりそのまま強い型付言語の、type inference
> にもあてはまるんだが・・・
ML, Haskellをいじり倒した経験がないので、いいがかり、かんちがい、
まとはずれになるのを承知でいえば、
これらの言語はいわゆる functional programming というパラダイムを体現して
いると思いますが、referential transparency とか 型 に主眼をおいており、single パラダイムになっていて(それが良さでもあるのでしょうが)、
Common Lisp や C++ 的なだらしなさというか multiple パラダイム
言語の特徴でもある、実際的な力仕事に便利そうなパラダイムをどんどん
足していくという言語とくらべたときに、ワゴン対スポーツカーみたいに比較が
難しいという面はないのでしょうか?
(どっかでSchemeの美しさに萌えていた処理系の実装者が これらの「もっと」
functionalな言語の美しさに惹かれてそちらに移ってしまったという話は聞いた
ことがありますが。)
(I/Oがからむとreferential trasparencyが破綻するのでそれを
どうにかするためにmonadとかいう概念があったりするというのは耳学問で
聞きました。あと referential transparency が保証されていると
簡単に並列化が簡単におこなえるとか。)
191 :
デフォルトの名無しさん :02/06/24 11:11
>#Javaってバージョン上がるたびに見事に肥大化してると思うが。 へ? 思い込みでしょ? assertとgenericsくらいだと思うよ。 もしかして、ライブラリーの話をしてるのか? ライブラリーは時間がたてば増えると思うけど。 念のため言っておくと、servletもejbもフレームワークだからね。
C++の作者である Bjarne Stroustrup が、 「Javaの方がすっきりしていていいじゃん」 といわれてムッとして、 「あいつらそのうち絶対にtemplate相当の機能が欲しいとかほざきだすからな (意訳)」 と言っていたのがワロタ。 ちなみに動的な型をもつ言語では、templateという概念そのものが必要ありません。 というかすでに含まれていると言うか。
193 :
デフォルトの名無しさん :02/06/24 12:01
>>192 そんでBjarne StroustrupはLispを知っていながら
C++をデザインしたのでしょうか? そこが結構気になります。
たしか simula とかいうOOの元祖で作者がこのまえなんか賞を
もらった言語がヒントになったというのは聞いたことがあります。
ちなみにEfectiveSTLのBoostに関する記述の中に 「〜関数オブジェクトを嫌い、関数オブジェクトは、C++プログラマになった Lisp擁護者の少数意見をなだめるためだけに存在すると考えるなら〜」 なんて一節がある。
195 :
デフォルトの名無しさん :02/06/24 12:28
>>194 STLってでも実はBjarne Stroustrupではなくて、
HPかなとかにいて、AdaのGenericな型みたいなのをやっていた人が
オマエC++で同じことヤッテクレ!ということでやったと思ったんですが。
C++とLispという軸に限定して考えれば、静と動というか、
カオスとオーダーみたくなっているけど、別に目標はそんなに
違わないみたいな気がします。そんでそのゴールに似ているけど
実際はちがう Java がでてきたので、オイオイ と突っ込みを入れたく
なる人もいるのではないでしょうか。
でも別に静と動だけが切口なわけではなくて、なんか別にも
軸があるような気がします。
type inference にあるように、日本的な阿吽の呼吸というか、
いわなくても分かる(ことは言うな)みたいなとか。
Prolog みたいな「何が欲しいのか」を言うとか。
いやもっと言ってしまえば結果から迎えに行くというか。 むかし雑誌で読んだんだけど、数学がすごくよくできる人がいて 高校のときは、なんか問題を見ただけで答えがなんだかわからないけど 頭に浮かぶということを言っておられるのを聞いたことがあります。 漏れはやっぱり数学が得意な人はそんな物かと素直になっとくしてしまったん ですが、これってもし嘘じゃなければちょっと面白いかなとおもいます。 すいませんデムパッてしまいました。
197 :
デフォルトの名無しさん :02/06/24 14:24
templateはあとから実装された物だよね。 javaにはまだgenericsって実装されてないよね。 C#は実装するのかな。 個人的にはjavaにgenerisを組み込む必要性は無いと思うけど、 実装するなら、速く使わせて欲しいな。 ところで、みなさん学生だと思うけど 専攻はなんですか?
漏れは Common Lisp で一発あてるのを夢見る 単なる書生です。
漏れは就職先がみつからず果てしなくバイトをやってそうな院生です。
200 :
デフォルトの名無しさん :02/06/24 16:12
なんか職が欲しくて、ディスプレイのまえではぁはぁしているみたいに 思われると嫌なので、言いますが。別に就職活動としてこの書き込みを したわけではありません。 そんで、Common Lisp よりの発言はほとんど俺です。199 さんはすごく てきせつなアシストをだいたい明け方くらいにしてくれました。 日本の研究者の人たちは 196 みたいなデンパの入った会話を平気でできる 環境にあるのでしょうか。
201 :
デフォルトの名無しさん :02/06/24 17:06
>思われると嫌なので、言いますが。別に就職活動としてこの書き込みを >したわけではありません。 誰もそんな事思わないと思うけど。 誰が書き込んだかなんて気にしてる粘着はめったにいないだろう・・・ >日本の研究者の人たちは 196 みたいなデンパの入った会話を平気でできる 俺は別にデムパだとは思わないけどね。 それより、間違っててもいいから、自分の意見は言ったほうがいいよ。 聞くは一時の恥じみたいな・・・ それよりも、自分の考えをこっそりと自分の中にしまって 俺は理解されないんだとか、俺が正しいんだとか言ってる奴の方が怖いよ。
>200 をーい、、漏れ、何かアシストしたっけ (^_^;;
>>201 > それより、間違っててもいいから、自分の意見は言ったほうがいいよ。
> 聞くは一時の恥じみたいな・・・
いやそうなんだけど、一度、デンパだということにされると
あとが面倒くさいというか。
> 俺は理解されないんだとか、俺が正しいんだとか言ってる奴の方が怖いよ。
それを口にだした人に言ってたら対したもんだと逆に思うけど。
電波なんていって面白がってくれるのは2chだけだからね。 変なのは現実じゃひたすら無視されるだけ。理由がどうであれ、 注目されるってのは大変なこと。その意味で電波だろうが、 なんだろうが自己主張すべし(w
>>202 おお、わるい。悪い意味でデンパッテしまった。
しかし、みんななんつーか「とんでもないこと」と(言った本人は後で 知らされる)みたいなことで恥ずかしいとか悔しいことを経験しすぎて 「じゃもう言わない」みたいなのない?
ま、とりあえず、何が何でもそこそこプロトタイプ的に形になったものを 作って、みんなに見せると、それからだな。
208 :
デフォルトの名無しさん :02/06/24 20:23
>「じゃもう言わない」みたいなのない? そういう経験はした事ないけど、 それって挫折みたいなもんだから、 そういうのを乗り越えて自分の意見をどんどん言わなきゃダメだと思うよ。
> そういう経験はした事ないけど、 > それって挫折みたいなもんだから、 > そういうのを乗り越えて自分の意見をどんどん言わなきゃダメだと思うよ。 いや馬鹿にされるだけならいいというか、そこで議論が止まっちゃうんだよね。 流行りの言葉(?)でいえばブレインストーミングができないってかんじかな。 「そんなアフォな話ができるか!!」みたいな。
というわけで、やっぱり何か新しいことを世間に問うつもりなら、 Lispでプロトタイピングをするというのもいいものではないでしょうか。
>> 201 > それより、間違っててもいいから、自分の意見は言ったほうがいいよ。 > 聞くは一時の恥じみたいな・・・ > それよりも、自分の考えをこっそりと自分の中にしまって > 俺は理解されないんだとか、俺が正しいんだとか言ってる奴の方が怖いよ。 いや、間違う、間違わないという判断は時の流れで変わってしまうので、 たまたま何かそういう考えかたが「おもしろそう」と頭に浮かんでも、 それをみんなに言うか言わないかというか。 「これを今、言ったらやばいだろう」というような(学問的な)考え(やアイデア)が あたまに浮かぶことはありませんか?
>「これを今、言ったらやばいだろう」というような(学問的な)考え(やアイデア)が >あたまに浮かぶことはありませんか? 言い方を工夫すればいいんじゃない? 上のLISPは流行ってないけど・・・なぜ? 見たいな質問の仕方なら別にいいと思うけど、 LISPってクソだから廃れたね。 って言い方したら、たくさん釣れちゃうわけだから。
>>212 いやぁ、そうなんだよね。でもたいていそういうときって(自分がおもしろそうな
考えを見つけたと興奮しているから)うわごと見たいなことを口走って
(ウワッ!! こいつアブネッ!)ってことになりがちなんだよね。
例えば、例えばという話だけど、いまJava関連でガベージコレクション がまたホットなわだいになっているけど、 たぶんいまは、generational なガベージコレクションがたぶん性能的に いちばんいいということになっているとおもうけど(JITやHotSpot関連で何かあるか な)、これを考えかたとして「ガベージコレクションは何もしないのが一番楽だ!」、 みたいに考えたらどうだろう。 いやそれを実現する方法は知らないけど、 IBMのAS400かなみたいなワークステーションはユニバーサルアドレスというか なんかオブジェクトは一生同じアドレス見たいな考え方があると聞きました。 このとき「ガベージコレクションなんかシネーヨ!!!(もしくはいらないんじゃない?)」と 叫んだらかなり問題あるだろう。
215 :
デフォルトの名無しさん :02/06/25 00:24
>>214 プログラムによるんじゃない?
WEBサーバーとかは無理だよね。
Paul Graham 氏は OnLisp の中で functional programming をとても優れたも のだと書いているんですが、それが広まらないのは何でですか? 研究には向いているけどビジネスには向いていないとか?それとも単純に書け る人が少なすぎとかですか?
JavaはSUNという巨大メーカーが命運を賭けてプッシュしてるから安心して その上でアプリケーションがかける。 lispなんてどこの馬の骨が作ったのか分からないVM上で応用ソフトなんて 誰もつくらない。しかもなんか無駄に色々種類があるね?どーでもいいけど。 結論「覚えても実用的でなさそう」
結局lispは言語オタクのための言語だから。 普通の人は言語は手段なのにlisperは言語が目的。 存在自体が再帰してしまっている。 だいたいlisperって自分でlisp作ってる人がほとんどでしょ?
219 :
デフォルトの名無しさん :02/06/25 01:47
>>216 個々の関数型言語が広まってないから、それを支える手法である
ところのfunctional programmingが一般的に認識されてない、
つうのが実際のところだと思う。個々の関数型言語が広まってない
理由は'?だが、Graham氏の見解なら記事で読めるぞ。
www.paulgraham.com/paulgraham/popular.html
www.shiro.dreamhost.com/scheme/trans/being-popular-j.html (日本語訳)
個人的には、参照透過・副作用のないプログラム・正規順序の評価
辺りをあんまりギャーギャー言われると「うっせえなあ」と感じて
しまって、ピュアな奴には手を出したくなかったりする。
220 :
デフォルトの名無しさん :02/06/25 06:57
> 存在自体が再帰してしまっている。 誉められたのかと思った。
>>217 かりに、その巨大メーカーが潰れてしまったら、Javaって生き残れるの?
223 :
デフォルトの名無しさん :02/06/25 13:03
DrScheme v2.00でた。
224 :
デフォルトの名無しさん :02/06/25 13:35
>>216 STL, Modern C++ Desgin, Boostなんかは、
Functional ProgrammingやFP(by Backus)の影響が大きい。
225 :
デフォルトの名無しさん :02/06/25 19:09
関数型言語もいいけど、オブジェクト指向もいいという事じゃない?
>
>>217 かりに、その巨大メーカーが潰れてしまったら、Javaって生き残れるの?
tomcatなんかを作ってる人達の好みにマッチしてるからね。
俺もアルゴリズムを実装するならJavaだし。
あとは、ソフトウェア工学でもJava一色といった感じ。
まあ、C#が発展してきたらどうなるかはわからない事は確か。
俺はC#のoverrideとかをいちいち書くのが嫌だな。
C++ とか Java って関数型でオブジェクト指向ですよね? んー、関数言語?
関数型じゃねーだろ
>>225 なんだか、狭い世界でプログラミングしてるんですね。
って Lisper に言われたくないか。
>> 219 英語だけど、関数型言語はこ〜んなにオモロ! という短くてよくできたアジビラみたいなのがwebのどっかにあります。 googleでさがせると思う。
>>229 それだけじゃ探しようがないのでヒントくださいな。
;; アジビラって何?
アジ:アジテーション ビラ:ひら「片」の口語強調型
アジテーション 【agitation】 (1)そそのかすこと。扇動。 (2)社会運動で,演説などによって大衆の感情や情緒にうったえ,大衆の無定形な不満を行動に組織すること。アジ。
びら 宣伝広告のために、人に配ったり、はり出したりする紙片。ちらし。 「宣伝―」「―をまく」 〔「ひら(片・枚)」の転、擬態語「びらびら」から、などの説がある。近世、演芸の宣伝に用いたのが初めという。大正期に英語 bill の影響で外来語意識が生まれた。現在は多く「ビラ」と書く〕
>>234 ちなみに。CMUCLをもっといろんな意味で洗練した Common Lisp って
商業的な価値はあるのでしょうか。
>235 なぜ漏れに…(笑 えーっと、漏れは Emacs Lisp しか使ったこと無いんですよ…スマソ #そんな漏れでもこのスレにいていいですか?
あの〜 漏れの XEmacs で M-x cmulisp とかやると
Starting lisp ...
CMU Common Lisp release x86-linux 3.0.8 18c+ 31 December 2001 build 3030, running on tsubasa
For support see
http://www.cons.org/cmucl/support.html Send bug reports to the debian BTS.
or to
[email protected] type (help) for help, (quit) to exit, and (demo) to see the demos
Loaded subsystems:
Python 1.0, target Intel x86
CLOS based on PCL version: September 16 92 PCL (f)
こんなのが表示されるんですが… これって、 CMUCL ってやつ?
てか、いまビビってます。
これの使い方知ってる人情報キボン。
とりあえず /usr/share/doc/ の下を grep / zgrep してみます。
Debian GNU/Linux 3.0 (woody) です。
>>235 懐かしい...「夢で遭えたら」に出ていた、タラコ唇の緑さんですね?
をを、さらに、 M-x scheme ってやったら Starting /usr/bin/guile ... ILISP V5.11.1 Use M-x ilisp-bug for problems and suggestions. * guile> guile> って表示されてる……
240 :
デフォルトの名無しさん :02/06/26 00:30
> javaにはまだgenericsって実装されてないよね。 GJ…(ぼそ 今のjavacも中はGJだし。 genericsはデフォルトでdisableされてるかもしれんが。
>>237 Debian$ apt-cache search cmucl
Debian$ dpkg -L cmucl
ネットニューズのfjで活躍しておられる ある大学教授のかたが現在のコンピュータサイエンスは、 「志さえあれば、すべてを知ることができる学問だ」 とおっしゃられていたのですが、みなさんどう思います? スレ違いでゴメン。
そんで、努力してすべてを知ったとしても、 なんつーか、ハードウェアとかCPUに関して 根本的にもっといい仕組みが見付かってしまうと、 (よく知らないけど、量子コンピュータとか、、) その知識の多くが無駄になってしまう可能性があると。 それでも知らずにおれないというか、、、。
たとえば、昔のCPUでは整数演算のほうが浮動小数点演算より 異常に高速だったのが、3DゲームのDoomをプログラミングして その後マイクロソフトですこし仕事してまたIdソフトウェアに 戻ってきた人が言っていたのですが、現在のINTELのCPUでは じつは浮動小数点のほうがすごく速いということを本に書いています。
>244 なので整数演算でも浮動小数点演算命令に任せる場合もある。
>> 245 いやそれってちょっと面白いね。
247 :
デフォルトの名無しさん :02/06/26 02:14
LISPを学習しようとおもうのですが お勧めのLISPはどの奴?
浮動小数点演算はプロセッササポートがないと並列化が出来ない OO実行が出来ない 整数へのキャストが高負荷 なので、トータルで劣る場合も多い。 それから、除算に関してはFPUで行った方がたいていの場合 オーバーヘッドを考慮しても高速
>>247 一番実用になると言う意味ならemacs lisp
>249 漏れが言おうと思ったのに〜 >247 OS は何? Windows なら Allegro CL とかいいかもしれない。 でも Linux とか UNIX 系の OS なら結局は Emacs でコードを書くことに なるわけで、結局まずは emacs lisp をいじってみるのがいいんだな。 Windows でも Meadow で emacs lisp をいじることをお勧め(個人的な意見だけどね)
>> 249 これは経験から言っているのですが、多くの言語(英語や日本語、 中国語、韓国語など、、)が入ったテキストを処理するプログラミング環境と して現在、Emacsを凌駕する環境はちょっと見付からないのではないでしょ うか。なぜかみんなエディタが言語に密接にくっついているというだけで、 表現が難しいけど「へたれ」な言語だと思っちゃう人が多いと私は思います。
>>248 > 浮動小数点演算はプロセッササポートがないと並列化が出来ない
> OO実行が出来ない
このOOってアウトオブオーダーだっけ?
> 整数へのキャストが高負荷
> なので、トータルで劣る場合も多い。
う〜ん、わからん。
> それから、除算に関してはFPUで行った方がたいていの場合
> オーバーヘッドを考慮しても高速
いやこれは面白いね。
>> 251 いや実はいま、アラビア語を始めようと思っているんだよね。 なんていうか、我々いわゆる(アメリカの手下としての)西側の国にとっての 最後の外国というか、異文化というか。
そんでどうせ外国語やるならなんかとんでもない(たとえばアラビア語)を やってみろって昔、ちょっと冴えてる友だちに勧められたんだよね。 ついでに「ななしさん」ってなんかその人とは別だけど友だちがどこかで 使っていたハンドルネームだったような。。 (ってみんなこの発言は全部無視してくれ。)
>>251 なんで漏れにレスしたのでしょうか?
全然話のつながりが見えないんですが
>>249 おお悪い。別にレスとか誰に返事するとか考えてなかったよ。
なんとなく頭に浮かんだことを酔っ払った頭でうわごとみたいに
言ってみただけだ。スマソ。
そんで、こういうのも実生活上けっこう問題になるんだよな。 自分はその話と話の脈略がなんとなくあると思って、(連続した話題) として話すんだけど、他の人は ポカーン? みたいな。そういうのないか、みんな?
( ゚д゚)ポカーン
>260 英語ヘタレな漏れにも読めたんで、quick start としてはいいんでないかい? とか言ってみるテスト。
アラビア語は国連の公用語だし,よく研究され学習環境 も整った「金になる」言語ですよ。
265 :
デフォルトの名無しさん :02/06/27 02:54
Scheme関連の書籍が少ないなぁ…. SICPもいいけど,実用的なプログラムを書くときのknow howとかが少なくて 最初はtoy programしか作れなかったよ. 入出力書きづらい.
266 :
デフォルトの名無しさん :02/06/27 09:08
つーか文字列処理がインデックス参照なんでやりにくくない?
267 :
デフォルトの名無しさん :02/06/27 10:26
>>266 string portの方が何かと便利じゃない? srfiにもなってるし。
regexp関連のインターフェースもsrfiになってほしい…
こうして標準は「RnRS」から「RnRS+SRFI」へと変わってゆくのでした……。
269 :
デフォルトの名無しさん :02/06/27 13:54
詳細調べないまま書き込んでスマソなんだけど, SRFIって手続きやマクロで実現できるものなの? それとも処理系に手を加えないとダメなものもある? foldとかはただの手続き群,単一型ベクタは処理系に手を加えなければならない, といった感じがするのだけど.
>>269 srfiによる。マクロ一つで出来るものもあれば、処理系をいじる必要の
あるものもあり。各srfiのreference implementationの項に注が書いてある。
そのへんの区別も含めて、あんまり厳密なこと言いっこ無しよ、みたいな
ノリなんじゃないかなあ。srfiは。
いつの間にか(?) gauche が deb化されてる。 でもバージョンが古い。0.4.6 って。。。
272 :
デフォルトの名無しさん :02/06/27 19:05
schemeの機能を満たしてて括弧のネストがなければ最高なんだが。
>>272 括弧に注目してはいけない。Lisp プログラムは字下げで読むのです。
括弧が無いという点では、Python もなかなか良い言語だと思います。
というか、しっかり関数分割された Lisp プログラムは括弧はそれほど
ネストしませんよ。
>271 うん。漏れ最新版を deb にしてるんだけど、 ドキュメントとかちゃんとまだ書いてなくって未公開。 メンテナさんには 「upstream バージョンあがってまふよ〜 」 って言ってあるんだけど…
275 :
デフォルトの名無しさん :02/06/27 22:28
>というか、しっかり関数分割された Lisp プログラムは括弧はそれほど >ネストしませんよ。 カッコの合計数が増えるという罠
>>275 バレたか。でもまー f(x) がネストするよりは読みやすいと思うけどね。
lispの括弧が多いってさ、普通の言語と比べて 一番外側の括弧が余分なだけじゃないの?
>>277 それは non-nil かも。他の言語でも、多かれ少なかれ、頭の中で入れ子構造を
展開してるんでしょう。Lisp の場合はそれが形となって表われているだけ
だと思う。
279 :
デフォルトの名無しさん :02/06/28 01:24
>>277 一番外側じゃなくて一番外側(プログラム自体)と二番目(一文一文)だと思う。
この二番目が曲者。これが大量にあるおかげで括弧が大幅に増えてる。
>>279 Dylanは処理系が糞すぎるのが欠点。コンパイル時間がかかりすぎ。
しかもHelloWorldが数メガって・・・
>>281 Dylanってたした、FunctionalObjectだったかな、
商用のベンダーが存在して、そのエディターはコンパイルしたあとに
どれだけ最適化が行われたか色分けしてくれるらしいよ。
Webのどっかに紹介記事があったと思ったけど。
最近、たびたび夜にこの2ちゃんねるに、ばかな書き込みをしておりました、 峯島雄治と申します。どうももしわけありませんでした。
何か言いたいということがあれば、0468 35 8420 までお電話ください。 33歳ヒッキーです。
なんでこのスレに書き込むんだよう
>>283 もし251, 257さんであれば早目に病院に行かれた方がよいかと思います…。
lisp では後置再帰をしばしば使いますが、 C コンパイラでも後置再帰を使うことは有効なのでしょうか? つまり後置再帰であることを認識してスタックを無駄に消費しないコードをはいてくれる C コンパイラというのもあるのでしょうか?
>287 ごめん、tail recursion って末尾再帰っていうんだね… 勝手に訳語作ってた YO 。逝ってきます。
単純な末尾再帰に限っていえば、最近のC/C++コンパイラは最適化でスタックを積まなくなる。 が最適化オプション次第で挙動が大きく変わるようなコードは推奨されんだろうな。 とりあえず知ってる限りでgccとかVC++あたりは。
VC++は.NET/6.0ともに末尾再帰の最適化無し
やぱーり、 Scheme マンセーですか。
Common Lisp の関数を調べるより、Scheme で自分で書いた方が 早くて綺麗だったりする。個人での使用なら速度も十分だし。
>>292 漏れはまだ本に載ってるような勉強用のコードしか書いたことないんですが、
例えばどんなものを書くときに scheme は便利ですか?
>>293 C で書くと超面倒、でも Perl で書くと先々不安なもの。
あとはメタ言語を作ろうとする時。
>>292 >Scheme で自分で書いた方が早くて綺麗
実はそれって、言語のポピュラリティという面では
不利なんじゃないかと思う次第。
熟練者は簡単に欲しい関数が書ける
→誰も共通ライブラリみたいなのを作ろうとしない、
あるいはマイライブラリで満足
→初心者はライブラリの少なさにガクゼン。
自分でいちいち書かなくちゃならないのがめんどくさくて挫折。
まあ、srfiなのかな。進むべき方向としては。
>>295 うわ、sageの使いかた間違えたよ。はづかちい。
Schemeが成熟したらダメだろ。 これ以上複雑化していったら、気軽に作れる物じゃなくなって 実装者が減ってしまう。
298 :
デフォルトの名無しさん :02/06/29 12:33
>>294 1行目をもう少し具体的にお願いしまつ。
>>298 扱うデータ構造がネストしているような場合、例えば non-destructive に
再帰的に reverse したいような場合、C だとメモリ確保/解放が面倒です。
Perl でも出来るんですが、ランタイムエラーにならずに処理を進めて
くれちゃったりするので困る事があります。
あとは REPL (read-eval-print loop) の存在が大きいかな。素早く定義
して、素早く動作確認できるのが魅力的。コンパイルする必要もないし。
C, Perl, Scheme を日常的に使いわけているので、「これは Scheme しか
できない!!」ってのを挙げられなくて申しわけないけど。
>>299 REAL を一瞬パールと読んでしまった。。
>C, Perl, Scheme を日常的に使いわけているので
括弧いいですね。私はまだどれも初心者用の本に載っているようなプログラム
しか書けませんが。どの言語も好きですけどね。もっと修行してきます。
301 :
デフォルトの名無しさん :02/06/29 23:10
REPLて略初めて聞いたよ。
302 :
デフォルトの名無しさん :02/06/29 23:23
>例えば non-destructive に >再帰的に reverse したいような場合、 これってどういう意味? 破壊しないで、再起的に、・・・reverseってどういう意味?
>>302 つーかおれはこの意味もわからんのだが。
>Perl でも出来るんですが、ランタイムエラーにならずに処理を進めて
>くれちゃったりするので困る
>>302 (define s (1 (2 3 4) 5 (6 7)))
(rev s) => ((7 6) 5 (4 3 2) 1)
s => (1 (2 3 4) 5 (6 7))
みたいな感じ。良い例ではありませんが。
>>303 他の言語ならエラーが発生してプログラムの実行が停止するような処理
でも、Perl の場合は勝手に決めて処理を進めてしまう事がありますよね。
具体的にどんな状況かって言われると説明しづらいんですが、Perl の
曖昧さ故にデバッグしづらい場面ってのは結構あると思います。
それらを含めて、将来メンテナスするであろうコードに Perl を使うのは
先々不安って言ったんですよ。
>>302 コードにするとこんな感じ?
(define (rev s)
(if (pair? s)
(let loop ((x s)(r '()))
(if (pair? x)
(loop (cdr x)(cons (rev (car x)) r))
r))
s))
Cに直すとこんなかな。 scm rev(scm s) { if (pairp(s)) { scm x = s; scm r = nil; loop: if (pairp(x)) { scm tmpx = cdr(x); r = cons(rev(car(x)),r); x = tmpx; goto loop; } else { return r; } } else { return s; } }
俺版。どっちの方が良いんだろう? (define (rev tree) (reverse (map (lambda (s) (if (list? s) (rev s) s)) tree)))
>>299 その「扱うデータ構造」ってのは大抵ファイルとかから取りこむんだよな?
そーするとパーサ書くのが大変な気がするんだが、どうなん?
最初からリストで書かれていればともかく、普通そんなこと無いだろうし、、
>>307 同じでしょう。
まあ、mapしたものをreverseするのは無駄だから
専用化したものをはさむとか。
この辺はトランスレータとかが勝手に最適化して欲しい気はするけど。
(define (map-reverse proc l)
(let loop ((x l)(r '()))
(if (pair? x)
(loop (cdr x) (cons (proc (car x)) r))
r)))
(define (rev s)
(map-reverse
(lambda(x)(if(pair? x)(rev x)x))s))
>>308 パーサというか、トークン化できればどうにでもなると思うよ。
>>309 map-* ってのは結構使えるかも。map-append とか。
Common Lisp に mapcon ってのが既にあるみたいね。nconc だけど。
313 :
デフォルトの名無しさん :02/06/30 00:58
scmってなんだろ? OOで、再帰を意識するなら public List::reverse(){ List list=new List(); reverse(this.size,list); return list;(付け替えしてもいいし) } private List::reverse(int i,List list){ if(entry[i] is List)entry[i].reverse() list.add(entry[i]) reverse(i-1,list); } だよね?
非破壊って書いてあるだろ
(define (rev s) (if (list? s) (reverse (map rev s)) s))
(define (rev s) (if (list? s) (map! rev (reverse s)) s)) reverse! はどう書くの?
どんどん洗練されていく
map! なんてなかった。 (define (map! f s) (do ((t s (cdr t))) ((null? t) s) (set-car! t (f (car t))))) で置き換えて。
>>315 map!はsrfi-1にあるよ。
同じくsrfi-1の、foldを使ってmutation無し、reverse無しバージョン
(define (rev s)
(if (list? s)
(fold (lambda (e p) (cons (rev e) p)) '() s)
s))
>>57 >実装上じつは、ループで済んでしまうのでしたぁ!!!!!
Loopとrecueseは、末尾呼びだしのgoto(?)への置き換えという「簡単な」最適化をするだけで
理屈だけじゃなく実装上も等価になるからこそ、Lisperは堂々とrecurseしまくれる。
難しい最適化でもなんでもなく、単純な置換で済む。コストは極めて低い。
詳しいことは、Shiroさんとこの、「なんでも再帰」と「Schemeの実装におけるスタックフレーム」を。
あと、C(の標準的な姿)では末尾再帰の最適化はしにくいかもね。
ただ、一方で、
>>55 >recursion ならスッキリ書けるものをわざわざ汚いループ構文や制御変数を使って
という意見も片手落ち。
rubyみたいに内部ireraterが有れば、十分綺麗だし、
関数に、その関数が終ったら次に続けるべき「なにか」を
渡さなくてもいいので、かえってすっきり。
>>320 > 関数に、その関数が終ったら次に続けるべき「なにか」を
> 渡さなくてもいいので、かえってすっきり。
これどういう事?
322 :
デフォルトの名無しさん :02/06/30 13:40
323 :
デフォルトの名無しさん :02/06/30 14:23
>非破壊って書いてあるだろ そんなのは list.add(entry[i].clone()) とするだけだろうが。
324 :
デフォルトの名無しさん :02/06/30 20:56
LISPの、定義された関数がたくさんのっているサイト ってありますか?教えてください。
Common Lisp より先に Scheme をやった方が、綺麗な関数が書けるように なるかも。後者が綺麗なので前者を学習する気がなくなるという副作用付き。
327 :
デフォルトの名無しさん :02/07/01 00:01
common lispが汚いって どの辺が汚いのかな? 当方schemeオンリー
>>320 > あと、C(の標準的な姿)では末尾再帰の最適化はしにくいかもね。
意味がわからん。
容易に、最適化がやりにくいスタイルで書ける、と言うくらいの意味?
みなさんの好きな scheme 処理系は?
Dr.
332 :
デフォルトの名無しさん :02/07/01 11:41
>326 漏れ Emacs Lisp しかつかったことないよ〜 \(`д´)/うわぁぁぁん
334 :
デフォルトの名無しさん :02/07/01 16:56
guile かな。mit-scheme にしようとしたけど、Unix システムコールが 見当たらなかったのでやめた。
>>333 御安心ください。私も Emacs Lisp, Scheme, Common Lisp の順番で
学習しましたカラ。Common Lisp は現在進行形。
SICP 読んでる途中なんだけど
>>114 さんの紹介に魅かれて Onlisp も読み始め
た。無謀かなぁ? SICP は 4章の後半まで読んで stream って何だっけ?って
なってまた始めから読んでます(汗
(define (come! scheme) (let loop ((n 0)) (cond ((= n 0) (display scheme) (newline)) ((= n 1) (display "キタ")) ((even? n) (display "━━")) ((= n 3) (display '(゚∀゚))) ((= n 5) (display '(∀゚ ))) ((= n 7) (display '(゚ ))) ((= n 9) (display '( ))) ((= n 11) (display '( ゚))) ((= n 13) (display '( ゚∀))) ((= n 15) (display '(゚∀゚))) ((= n 17) (display "!!!!!"))) (if (< n 17) (loop (+ n 1)) (newline)))) (come! 'Gauche)
(define (come! scheme) (display scheme) (newline) (for-each (lambda (x) (display x) (display "━━")) '(キタ (゚∀゚) (∀゚ ) (゚ ) ( ) ( ゚) ( ゚∀) (゚∀゚))) (display "!!!!!") (newline))
↑プログラミングを楽しむ事が重要である事を示す良い例
>>324 gaucheでは動いたよ。シンボルに8-bit charを通す処理系なら
動くんじゃない?
>>343 あ、そういうことじゃなくて、顔が右向きのから左向きのに変わっていく、み
たいなのがあったら面白いかなぁと。
で、自分でやってみようかと思ったけど一回書いた文字を消すのって無理かも
しれないですね。
>>344 (define (come! scheme)
(for-each (lambda (x) (cls) (display scheme) (newline)
(display "キタ━━") (display x) (display "━━!!!!!") (newline) (wait 10))
'((゚λ゚) (λ゚ ) (゚ ) ( ) ( ゚) ( ゚λ) (゚λ゚))))
こんな感じか?
clsとwaitは誰か定義して。
>>344 あ、そういうことか。
ポータブルに書くのは難しいけど、gaucheならこんな感じでどう?
sys-selectはタイミング調整ね。
(define (come!)
(for-each (lambda (x) (display x) (display "\r") (flush) (sys-select #f #f #f 200000))
'((゚∀゚_) (∀゚ ) (゚ ) ( _ ) ( ゚) ( ゚∀) (_゚∀゚)))
(come!)
>>346 おーすごい!
でも krxvt だと俺のフォント設定(東雲)が悪いせいで目が表示されない(汗
gnome-terminal でちゃんと見れました。
;; 3行目の最後に閉じ括弧 1つ足りないですよね?
えーと。dynamic-windって、どういう使い方するものなんでしょうか?いまいち謎。
>>348 open/close を自動化させたい時に便利。call-with-* シリーズを書く場合
なんかにどうぞ。でも、よーく R5RS を読んでみると call-with-* には
向かないのかも知れないけど。
351 :
デフォルトの名無しさん :02/07/02 22:33
>>349 これって thunk のとこの
>(call-with-current-continuation escape)
って scheme 的にはありなの? gauche では
>(escape)
にしないとエラーになったけど。
>>352 escapeは0個以上の可変長引数を取る手続きのはずだから、
call-with-current-continuationに渡しても問題ないはず。
gaucheのバグじゃない?
>>350 call-with-* 系は、dynamic-windでcloseするようにしてしまうと
コルーチン系の動作が書けなくなる (一度call-with-*の中で別の
コンテキストにスイッチしたらファイルが閉じられて、コンテキストの
再開ができなくなる)。
dynamic-windはもっと基本的な要素を実装するのに使ったほうが良い。
ダイナミックスコープを持つ変数とか、エラーハンドラとか。例えば
(define (error arg)
(display "unhandled error: ") (display arg) (newline)(quit 1))
(define (with-error-handler handler thunk)
(call/cc
(lambda (cont)
(let ((oerror error))
(dynamic-wind
(lambda () (set! error (lambda (arg) (cont (handler arg)))))
thunk
(lambda () (set! error oerror)))))))
こうすると、thunkの中で(error なんとか)とすると常にhandlerが呼ばれる。
355 :
デフォルトの名無しさん :02/07/03 12:29
>御安心ください。私も Emacs Lisp, Scheme, Common Lisp の順番で >学習しましたカラ。Common Lisp は現在進行形。 学習するって何を? 文法だけなら、3日あれば十分なような・・・
文法だけなら10分デス
>>356 それはない。セルとリストの概念だけで数十分はかかる。
他の言語をやってれば10分で分かるだろ
どこにでも出きますね。○○言語なんて10分とか言いだすやつ。 どうせ文法知ってるだけのくせに。
>>357 セルとリストの概念は、文法じゃないんじゃない?
こういう話題は荒れるだけのような気がしま
362 :
デフォルトの名無しさん :02/07/03 21:47
>>354 なんでwith-error-handlerの中でcall/ccつかっているの?
363 :
デフォルトの名無しさん :02/07/03 23:00
>>354 ファイルオープンや例外とかの継続巻き戻しスタックは、複数欲しい気がする。
例えばエラーかなんかでトップに戻ったときは全部ファイル閉じてて欲しいし、
自分で明示的に継続切り替えたらそのまま状態を保持するとか。
この辺のプロトコルをSRFIで作ってくれないかなあ。
364 :
デフォルトの名無しさん :02/07/03 23:24
>どうせ文法知ってるだけのくせに。 それ以外に何が・・・・痛い
文法知ってるだけでプログラムが書けるんですか。凄い才能ですね。
Cで会話できるよ。
(´∀`)マターリ
>>130 Danke.
ついでに。
Debianで「ledit」というパッケージになっているツールを使えば、
対応していないソフトでも括弧の対応を取ってくれるようになります。
ただし、行を超えては駄目。
10分とか言ってる奴も実は数日ぐらいはかけて本読んだりプログラム作ったり 人から教えてもらったりして理解した罠。
調べながら書くにしても、基本的な道具立ては分かっていないと辛いよね。
結局、自然言語を覚えるのと同じ過程を踏むんじゃないのかな。 漏れ的には弁証法的スパイラルを昇っていく過程だと思う。
372 :
デフォルトの名無しさん :02/07/05 23:25
どなたかCommonLispのdirectory関数の使いかたがのってるURL知りませんか?
373 :
デフォルトの名無しさん :02/07/06 00:01
言語は理論じゃない.実践を経て覚えるものさ.…多分.
375 :
デフォルトの名無しさん :02/07/06 04:19
文法が簡単つっても、 関数の場合は (演算子 被演算子...) で説明は済むが、 構文はlambdaやletとか特殊な括弧の使い方するやつが多い。 ((lambda args ...) values) とか。関数シンボルの代わりに関数定義をそのまま書けたりするってのは、 非常に直感的だとは思うけどね。
>>362 >なんでwith-error-handlerの中でcall/ccつかっているの?
thunk中でエラーが起きたら、handlerを呼び出した後
with-error-handlerから返るためだけど。何か変?
377 :
デフォルトの名無しさん :02/07/06 05:52
最近、高階関数を勉強してその魅力にはまっているのですが、 かっこいい高階関数の例を教えてもらえませんか? 例えばこんなの。 (define (for-each-tree f g n tree) ;; depth-first (cond ((null? tree) n) ((not (list? tree)) (f tree)) (else (g (for-each-tree f g n (car tree)) (for-each-tree f g n (cdr tree)))))) (define (flat tree) (for-each-tree list append () tree)) (define (sum tree) (for-each-tree + + 0 tree)) (define (map-tree f tree) (for-each-tree f cons () tree)) (define tree '(1 (2 3) (4 (5 6) 7 ((8)) 9 10))) > (flat tree) (1 2 3 4 5 6 7 8 9 10) > (sum tree) 55 > (map-tree - tree) (-1 (-2 -3) (-4 (-5 -6) -7 ((-8)) -9 -10))
>>377 Paul Graham 氏の On Lisp や、SICP が参考になると思います。
前者は Common Lisp ですけど。
380 :
デフォルトの名無しさん :02/07/06 08:01
>>377 そのflatはエレガントだねえ。
ちょっと感動した。
>>377 Winston の Lisp 本かな、漏れが 見たのは。
>>380 たしかに。雑音が全く無い。すばらしい。
(define (flat tree) (if (list? tree) (apply append (map flat tree)) (list tree))) (define (sum tree) (if (list? tree) (apply + (map sum tree)) tree)) (define (map-tree f tree) (if (list? tree) (map (lambda (tree) (map-tree f tree)) tree) (f tree))) apply はちょっと邪道かな。でも便利だし
(素の)schemeではファイルを消すことができないと読んだのですが、例えば 「無」を書きこむことでファイルを消す、みたいなことはできるのでしょうか? それともR5RSの範囲ではどうやっても無理なんですか?R5RS+SRFIならできる とか?
すでに存在するファイルに書き込むときの挙動は未規定だった気がします(上書きするかもしれないし追記するかもしれない?)
values とかいう手続きが返す多値って、リストやベクタとは違うの?別物?何の必要によって?
389 :
デフォルトの名無しさん :02/07/06 14:59
>>387 assocなんて、多値だったら嬉しくねぇ?
(成功or不成功, 見つかった値)
Cのfopen(3)なんかだと、pointerの0が「不成功」の役割を担ってるよねぇ。
無理やり二つの型を圧縮してるから、0の意味が分かりにくくなっているわけだ。
ただ、assocを多値にするとsetfはいやーんなままだねぇ。
>>389 やっぱり、 list でも大して変わらない気がする…
>>388 の、関数の戻り値を直接他の関数に渡す、って云う使い方は魅力だけど…
普通の list でそう云う事をしたい気がするな…
Lisp だし。
MIT Scheme で複数の式を いっぺんに評価するにはどうすればよいでしょうか?
(define (set-xy) (begin (define x 1) (define x 2)) ) (set-xy) を評価しても x ; Unbound variable : x y ; Unboune variable : y となってしまいます. どこがいけないんでしょうか
>393 (define (set-xy) (begin (define x 1) (define y 2)) ) の間違えでした
>>393 set-xyの中で define した x と y は set-xy の中だけだから。
>>394 set-xyの内部のdefineはinternal defineと解釈されます。つまり
(define (set-xy) (letrec ((x 1)(y 2)) ))
と同じ。xやyはローカル変数になると考えると良いでしょう。
トップレベルのxやyを変えたい場合はマクロを使って
(define-syntax set-xy
(syntax-rules ()
((_) (begin (define x 1) (define y 2)))))
とするか、define-valuesのような拡張 (MIT Schemeにあるかどうか
知らんけど)を使うしかないでしょう。
(define-values (x y) (values 1 2))
R5RS の letrec の定義をトレースしてみると面白いね
scheme (gauche) で less もどきを作っているんですが、space キーが押され た瞬間に次のページを表示させるためにはどうしたらいいですか? read-char は enter が入力されるまで待っているので少し希望と違うんです が。
>>400 C じゃないと無理ですかね?勉強用にはとりあえず Unix コマンドもどきを作
るのが定番かなと思ったので。「もどき」なのである程度のもので我慢するこ
とにします。
>>380 >>382 元ネタは
http://www.sampou.org/haskell/article/whyfp.html の3章の redtree という関数です。
>>383 こんなんでどうでしょうか?
(define (for-each-tree f g tree)
(if (list? tree) (apply g (map (lambda (tree) (for-each-tree f g tree)) tree))
(f tree)))
(define (flat tree)
(for-each-tree list append tree))
(define (sum tree)
(for-each-tree + + tree))
(define (map-tree f tree)
(for-each-tree f list tree))
>>399 enterを待っているのはread-charではなく、システムの端末ドライバでしょう。
gauche.termiosモジュールに端末コントロールの関数がひととおり揃って
いるので、lessの間だけ入力をraw modeに切替えてみては。
エラー時に端末のモードを戻すのを忘れずに。
ちなみにtermiosへのインターフェースを持っているSchemeはけっこう
多いますよ。
>>400 言語の問題じゃなくてライブラリの問題ですな。わかります?
>>403 言語とライブラリは一心同体。gauche に充実した termios インタフェースが
あるなら話は別ですけど。
>>403 ありがとうございます。man termios とか google とかで調べて何とかできそ
うなところまできました。
gauche の termios のところにある、入力を echo しないで受け取るプログラ
ムをいじくって、dynamic-wind の before 部分を以下のようにしました。
(dynamic-wind
(lambda ()
(slot-set! attr 'lflag (logand lflag (logand (lognot ICANON) (lognot ECHO))))
(sys-tcsetattr port TCSANOW attr))
>>404 君、言語とライブラリーの仕様の区別ついてないだけじゃなくて、
さらに実装も混同してるんだね…Jesus!
408 :
デフォルトの名無しさん :02/07/07 21:51
windowsなら、kernel32.dllから適当な関数持ってきて叩けばいいと思うけど、 unixだとどうなるのかな。 ってもう解決した感じだね。
>>408 Unix(Linux) の場合は端末ドライバのモードを変えてやればいいようです。C
FAQ の 19章にそのまんま載っていて、gauche でもほぼ同じ方法を使えました。
試していないけど cygwin 使えばそのままできそうですね。
でも標準入力を less もどきに渡すとエラーになるんですよね。読み込むデー
タも標準入力、キーボードからの入力も標準入力なのでだめなんでしょうね。
難しいなぁ。
>>409 stdinを使わずに/dev/ttyを開いてみれば?
>>410 おー、素晴しい。ビンゴです。
キーボードからの入力を /dev/tty から受け取るようにしたらうまくいきました。
どう?
なにが?
412 : ◆SChEMeHI :02/07/09 10:23
415 :
デフォルトの名無しさん :02/07/09 11:31
416 :
デフォルトの名無しさん :02/07/10 15:33
ネタがないようなので Paulたちについて語りますか?
ttp://www.shiro.dreamhost.com/scheme/index-j.html Paul Graham (Lisp)
技術野郎の復讐 -- Revenge of the Nerds
「全ての言語(Java,Perl,Python, ..)は 1958年に作られた Lisp に今ごろ追いついてきている」
Paul Prescod (Python)
Python と Lisp の関係について
「Python は Lisp じゃねーぞ(゚Д゚)ゴルァ」
417 :
デフォルトの名無しさん :02/07/10 19:38
Peter Norvig (Lisp) PythonてLisperにもなじみやすくて(・∀・)イイ! AIMAの例書き直しちゃったよ。
Lisp について調べてると、なにかと Paul 氏が出てきますね。 やっぱ成功したせい?
419 :
デフォルトの名無しさん :02/07/11 10:00
420 :
デフォルトの名無しさん :02/07/11 18:04
ほとんど関係ないんだけど、安西先生いま塾長なのね。ちょっとびっくり。 あの本は高校の図書室にあった。読まなかったけど。
何でこのサイトには改行がないんだ。 俺の Mozilla が悪いのか? 読みづらいったらありゃしない。
IEも同じ。
425 :
デフォルトの名無しさん :02/07/12 10:17
原稿料いくらもらったのかなー
塾長ってどっかの塾?
427 :
デフォルトの名無しさん :02/07/12 18:15
慶応義塾
ワシが男塾塾長(略
429 :
デフォルトの名無しさん :02/07/14 02:49
LISPで作られたWebブラウザって無いの?
Common Lisp で文字列と数の相互変換をしたいんですけど、適当な関数が みあたりません。Scheme でいう string->number, number->string のような 関数があればと思うんですけど、他になんか定石があるんでしょうか?
read-from-string で出来ました。お騒がせしました。
R4RSに書いてある低水準マクロ。syntax-rulesじゃない方のやつ。 あんな説明じゃ解らない。 syntaxって何。quote の構文的な相当物って意味わからんし identifierってシンボルと違うの?? 誰か教えて・・・
434 :
デフォルトの名無しさん :02/07/15 02:48
>>433 >syntax-rulesじゃない方
ってなに?
define-macro?
syntax-case?
おれはdefine-macroしか知らん。
>>433 あの説明は分かりにくい。R5RSでは削られたんだし、忘れよう。
低レベルのhygienicマクロを理解したければor使いたければ
標準ではないが、syntax-caseの動作を見るのが良いと思う。
identifierとは、変数を表すシンボルに束縛情報がくっついたものだと
思えば良い。
(define-macro foo
(syntax-rules () ((_ val) (let ((a 3)) (+ a val)))))
というマクロを考えてみる。これは次のように展開される。
(foo 4) ===> (let ((a 3)) (+ a 4)) ==> 7
では次の式はどう展開されるか。
(let ((a 2)) (foo a))
字面で展開すると
(let ((a 2)) (let ((a 3)) (+ a a))) ==> 6
となってしまいそうだが、hygienic macroにおいては、
* マクロfooに渡されるaというidentifierは、let ((a 2))で束縛されたもの
* マクロfoo内で使われるaとういidentifierは、マクロ内で挿入されるlet ((a 3))で束縛されるもの
というふうに束縛情報を一緒に持っているので、ふたつのaが混同される
ことがない。つまり
(let ((a 2)) (foo a)) => 5
となる。
で、これと同じことをsyntax-rulesを使わずに表現しようとすると、
「束縛情報をデータに付随させる」という操作を明示する必要が
ある。それに使われるのがsyntax。
Lisper の皆様は、自分の作ったプログラムが「ステップ数」だけで 評価されたらどうしますか? まぁ、そんな企業にいないだろうけど。
438 :
デフォルトの名無しさん :02/07/16 03:06
439 :
デフォルトの名無しさん :02/07/16 03:13
>>438 S式中の括弧を増やすテクを教えてください。
>>441 リストを (a . (b . (c . d))) のように表現する。
443 :
デフォルトの名無しさん :02/07/16 03:53
>>441 '(a b c d e)
==> '(a . (b . (c . (d . (e . ())))))
444 :
デフォルトの名無しさん :02/07/16 04:05
>>442 アホか?
そんなのいちいち書いてられっかよ。
ふつー、全部inline化、macro-expandしてppした巨大関数1こを納品。
これよ。
人間の頭じゃまずメンテできないし、納品しても安心。
>>445 inline-expand & macro-expandでの公開は、結構普通みたいです。
LISPの利点の1つかも。
447 :
デフォルトの名無しさん :02/07/16 06:21
>>447 2段オチだとしても、
つまんないし、わかりにくいよ
449 :
デフォルトの名無しさん :02/07/16 06:32
>
>>441 >'(a b c d e)
>==> '(a . (b . (c . (d . (e . ())))))
こういうpretty-print作ってくれ
>>439 微妙です。それも是非議論したいです。
プログラム全体をパースして、それで得られる Lisp オブジェクトの総数
とか。駄目?
関数呼び出しの数とか、 C にコンパイルした時の行数とか… …どれも評価には向かなそうだけど。
452 :
デフォルトの名無しさん :02/07/16 10:12
>>449 (define (f x)
(if (pair? x) (begin (display "(") (f (car x)) (display " . ") (f (cdr x)) (display ")"))
(display x)))
こんなの?
453 :
デフォルトの名無しさん :02/07/16 12:16
>>452 最後のdisplayはwriteのがいいんじゃないの?
と、くだらないツッコミしかできなくてスマソ。
454 :
デフォルトの名無しさん :02/07/16 19:37
DelphiみたいなIDE付きのscheme処理系ない?
>>435 さんくす!R4RS眺めつつ、実際に試しつつ、だんだん理解出来てきた気がする!
でもまだちょっと
(bound-identifier=? (generate-identifier 'x) (generate-identifier 'x)) => #f
これよくわからん。 'x を指定する意味は何。
・・・ところでsyntax-caseって?
>>456 ダメじゃダメじゃ。
あんな不細工なの使ってるのあっちの学生ぐらいだよ!
センスなさすぎ。
ちうか、日本人が作ってくれんかのう?英語チンプンカンプンなので。エヘ。
それとemacs勢のやつらは、emacs使いすぎ!
独立しろよー、この大馬鹿モン供があ!
IPAはイパーイ金出すぞー
ちうわけで、今細々と作ってます。 ああめんどっちい
IDE って必要ですか? 具体的にどんな機能を期待するわけ?
461 :
デフォルトの名無しさん :02/07/17 00:14
>>460 そうきたか。
>IDE って必要ですか?
馬鹿か、おめえは!
そんぐらい自分で判断しろや。ギギ
とりあえずフォームにテキストボックスやらボタンとか貼っつけて、
括弧書きながらあーだこーだ悩みたいですなあ!
ちうか、日本語対応してる独立したリソースエディタって何で無いの?
へんなクズばっか。もういや。
> とりあえずフォームにテキストボックスやらボタンとか貼っつけて、 > 括弧書きながらあーだこーだ悩みたいですなあ! そんなの、メタ言語を作れば良いんじゃないの?
>へんなクズばっか。もういや。 禿げしく同意。
464 :
デフォルトの名無しさん :02/07/17 00:23
>>462 ええと?
自分は!画面見て!あーだこーだ悩みたいのであります!
なんでそこで、メタだの、言語だの出てくるのさ。
察してくだせ。くだせ。
465 :
デフォルトの名無しさん :02/07/17 00:34
ぷぷぷ、レス無いんで、フォームにボタン張っつけまで、 作ってからまた考えるよ。こんちくしょう。 そんでクズの仲間入りかよ、おい。
466 :
デフォルトの名無しさん :02/07/17 01:06
リスプ使ってる人はエリートですか?
467 :
デフォルトの名無しさん :02/07/17 01:44
以下の関数は末尾再帰とみなしてよいでしょうか? (define (for-each-pair f g pair r) (cond ((null? pair) r) ((not (pair? pair)) (g (f pair) r)) (else (for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r))))) 終端式内に for-each-pair の呼び出しが入っていても 大丈夫でしょうか?
468 :
デフォルトの名無しさん :02/07/17 01:44
ダメ人間かも。
>>467 だめ、
(for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r)))))
の内側にある方が末尾再帰じゃない。
471 :
デフォルトの名無しさん :02/07/17 02:07
>469 では、以下のようにしたらそれぞれの関数は末尾再帰ですか? (define (for-each-pair-1 f g pair r) (cond ((null? pair) r) ((not (pair? pair)) (g (f pair) r)) (else (for-each-pair-1 f g (cdr pair) (for-each-pair-2 f g (car pair) r))))) (define (for-each-pair-2 f g pair r) (cond ((null? pair) r) ((not (pair? pair)) (g (f pair) r)) (else (for-each-pair-2 f g (cdr pair) (for-each-pair-1 f g (car pair) r))))) なんだか無駄な気がしますが。
>>471 ちがーーう。
そんなんでOKなら、なんでも末尾再帰に出来ちゃうでしょ。
末尾再帰は本質的にはループと一緒なの。
ループで書けないものは末尾再帰で書けない。
まあ、スタック使えば不可能ではないけどエレガントさ 20pt ダウンくらい。
car側再帰、cdr側末尾再帰になってるから、listを処理するなら
>>467 で充分
なんじゃないかな。
car側が深すぎて再帰だとマズーな場合は
>>472 が言ってるように泥臭く書く事
になるだろうけど。
(define (for-each-pair f g pair r) (define (recur pair) (cond ((pair? pair) (recur (car pair)) (recur (cdr pair))) ((null? pair) r) (else (g (f pair) r)))) (recur pair)) 末尾再帰とループでかいてみたが・・・ (define (for-each-pair f g pair r) (define (recur pair) (cond ((pair? pair) (for-each-pair f g pair r)) ((null? pair) r) (else (g (f pair) r)))) (do ((pair pair (cdr pair))) ((not (pair? pair)) (recur pair)) (recur (car pair))))
>>472 すみません、もうちっとねばらしてください。
>>467 を
ループで書くとこんな感じに書けると思うのですが、
だめですか?
(define (for-each-pair f g pair r)
(do ((pair pair (cdr pair))
(r r (for-each-pair f g (car pair) r)))
((not (pair? pair)) (if (null? pair) r (g (f pair) r)))))
要は、処理系が末尾再帰と認識して、ループに変換して
くれるかどうかが知りたいのですが。
単純なループにはできそうにないのでは (define (dotted-for-each f x) (if (list? x) (for-each f x) (do ((x x (cdr x)) ((not (pair? x)) (f x)) (f (car x))))) (define (for-each-pair f g pair r) (cond ((pair? pair) (dotted-for-each (lambda (pair) (for-each-pair f g pair r)) pair)) ((null? pair) r) (else (g (f pair) r))))
>>474 ,
>>476 は r を変えてないからダメでしょう。
>>475 のように処理されると思いますよ。
car部の処理があるから、そこのところで末尾再帰じゃなくなるだけで。
>>475 >>474 とか
>>476 とかちゃんと読まないでレスするから
的外れかも知れないけど、SICPのコンパイラ作るところとか見た?
それを見れば分かるけど、
>>467 の場合、内側は普通の再帰のまま
外側はループになるよ。
で、
>>467 をいくら書き直して(例えばスタック使って強制的に)末尾再帰しても
実行効率とかメモリー効率が良くならないよ。
>>475 俺が
>>472 で「ループ」と言ったのは正確には
「再帰を使わないループ」という意味。不正確な言い方してゴメン。
で、そういうことだから
>>475 はダメ。
それから、
>>479 は良く見たら
>>477 が同じこと言ってたね。
で分かりやすく書いてみる。
よく「末尾再帰はループになる」って言い方するけど、
コンパイラ:「末尾再帰ハケーン!!ループにしますた。」
じゃなくて、実際には。
コンパイラ:「末尾呼び出しハケーン!!ジャンプ命令にしますた。」
って事なの。
だから *結果的に* 末尾再帰はループになるし、
相互再帰とかも素直に処理される。
(もちろん単なるジャンプじゃなくて引数の受け渡しとかの問題が有るけど
それは置いといて)
だから、「for-each-pair は末尾再帰関数か?」という問いには
NO と答えるしか無いけど、
「for-each-pair の2回の再帰呼び出しが普通に呼び出されるか?」
という問いもやはり NO になる。
外側の方の再帰呼び出しはジャンプ命令になる。
すると、結局for-each-pairは、
「ループがあってその中で自分自身を1回だけ呼び出している。」
そんな関数にコンパイルされる。
だから
>>477 の言ったようになる。
フラットなリストでしてみても速度とメモリの効率はよくないだろうなあ。 (define (flat x) (cond ((list? x) (apply append (map flat x))) ((pair? x) (apply append (map flat (list (car x) (cdr x))))) (else (list x)))) (define (for-each-pair f g pair r) (do ((pair (flat pair) (cdr pair)) (r r (g (f (car pair)) r))) ((null? pair) r)))
flatはこうか? (define (flat x) (cond ((list? x) (apply append (map flat x))) ((pair? x) (flat (list (car x) (cdr x)))) (else (list x))))
>>457 syntax-case については、
Kent Dybvig の本「プログラミング言語 Scheme」に説明があります。
(けど、あの本のなかで一番わかりにくい部分の気がする)。
あとひまなら、
"Syntactic Abstraction in Scheme"
"Writing Hygenic Macros in Scheme with Syntax-Case"
あたりも。
484 :
デフォルトの名無しさん :02/07/18 01:58
syntax-caseの定義ってなんであんなデカイの? 解析しようとして挫折しました。
>>480 わかりやすい説明ありがとうございます。
>>467 の関数を処理系はループ(ジャンプ命令)に変換するが、
末尾再帰関数とは呼ばないということですね。勉強になりました。
>>479 SICP 読んでみます。
>>486 そんなことないと思うです。
ループに変換される方は末尾再帰と呼びます。
for-each-pair の呼び出しって2箇所あるじゃないですか?
外側のこれ↓
> (for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r))
は終端式だから、末尾再帰になるけど、その内側のこの部分↓
> (for-each-pair f g (car pair) r)
は終端式じゃないから、こっちの呼び出しは末尾再帰にならないってことだと思うです。
488 :
デフォルトの名無しさん :02/07/18 10:03
(define (f x) (apply + (map (lambda (x) (if (list? x) (apply * (map eval x)) (eval x))) x))) (define x 6) (f '(x x x (x x))) 54 ってなるんだけど、関数引数のxをevalしないようになってるの?
>>485 正解。 483 があげてるのは、その訳本(村上雅章訳)。
最近 CD-R を「くだー」と読むようになりました。
↑チョトワラタ
>>487 >>467 の関数は「末尾呼び出し(つまり、ループに変換される)」が、
「末尾再帰関数」ではない。ということが言いたかったのです。
(CDR 焼済)
494 :
デフォルトの名無しさん :02/07/19 10:40
C の while(1){ 処理A; if(終了条件) break; 処理B; } これを、scheme ですきっり書く方法を教えて下さい。 どうして、scheme の do などには return がないんだ。
>>494 (処理A)
(do () ((終了条件))
(処理B) (処理A))
これかなあ。処理Aが二回でてるのはよくないけど。
とりあえず、call/cc を使えばできるんです。 (call/cc (lambda (return) (let loop () (proc-A) (if (end? ) (return )) (proc-B) (loop)))) でも、長いんです。
(do ((a (処理A 初期値) (処理A (処理B a)))) ((終了条件 a))) になるように処理A、処理B、終了条件を書くとか。 (do ((a 初期値 (処理B a))) ((終了条件 (処理A a)))) こうなれば一番いいけど。
ちなみに Common Lisp なら (loop (proc-A) (if (end? ) (return val)) (proc-B)) んー、実にシンプル。 さらに return は便利で。 (defun foo () ... (if a (return val)) ... ) のように関数から途中で抜けれる。 こんな便利な return を無くしたのも それなりの理由があると思うのです。 なにしろ、 SRFI にもないですから(確か)。
(define (super-a) (処理A) #t) (do () ((and (super-a) (終了条件))) (処理B))
>>494 漏れはよくこう書くな
(let loop ()
処理A
(if 終了条件
結果
(begin 処理B (loop))))
>>499 returnが言語仕様に入ってないのは、ユーザライブラリとして実装
すべしというポリシーなんじゃないの?
503 :
デフォルトの名無しさん :02/07/19 12:04
>>496 >でも、長いんです。
マクロにでもしやがれ
497で言いたかったのは もともとのproc-A proc-B っていうやり方を変えようってこと。 proc-A proc-Bは単に処理の流れで区切っているだけでしょう。 処理の中で変化していく状態なり変数なりを見てほしい。 それに名前をつけて、初期値と変化の仕方を探す。 (a a0 (... a)) aは名前、a0は初期値、...は次にどう変わるか。 (do ((a a0 (... a)) (b b0 (... b)) . . . (z z0 (... z))) ((end? a b ... z))) でこうなる。 proc-A は初期値と次の変化のところに proc-B は次の変化のところに バラバラにして入れることになる。
この形のループはダイクストラさん曰く 1と1/2回ループと言って、
0回以上のループと1回以上のループを含意する重要なループです。
SRFIにすらないので、関数型言語らしい書き方があるかも思っていたけど、
ないみたいですね。
>>500 関数にするのならもう少しシンプルになりますよ。
>>502 ,503
なんてたって、schemeには継続とマクロと末尾呼び出しがありますね。
>>504 副作用ありだと問題がありますよ。
あれこれしなくても処理Aと終了条件を一つの関数にまとめればよかった。 while (処理A+!終了条件) 処理b; (define (end?) (処理A) (終了条件)) (do () ((end?)) (処理B))
>>503 マクロ
(define-syntax block
(syntax-rules ()
((block tag body1 body2 ...)
(call-with-current-continuation
(lambda (tag)
body1 body2 ...)))))
(define-syntax while
(syntax-rules ()
((while test break continue body1 body2 ...)
(block break
(let loop ()
(cond (test
(block continue
body1 body2 ...)
(loop))))))))
ここにあった。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/#continuation
509 :
デフォルトの名無しさん :02/07/20 03:17
Gauche 0.6 age
512 :
デフォルトの名無しさん :02/07/20 10:49
Gauche のロードマップはあと残す所 0.7 のみ。 まじスゲーよ。
ロードマップて何?
全国ロードマップ
515 :
デフォルトの名無しさん :02/07/20 16:27
そろそろ、gauche を deb にして、sourceforge に
おいてやろうって親切な方はいないだろうか。
>>2-7 のようなリンクもいいが、scheme なアンテナもほしー
とか、言ってみるテスト
>>515 とりあえず checkinstall なんてどう? deb 作ってくれるよ。
with-input-from-file とかってやつは、継続を使って脱出/復帰しても ファイルが閉じられはしないようなことが R5RS に書いてありましたが、 閉じられはしないだけで current-input-port は切り替わるんでしょうか? それとも、そのまま?
519 :
名無しのゴーシュ使い :02/07/23 01:35
>>512 ロードマップのページもちょっとずつ変化してるね。
前は version 0.7.0 は GTk サポートのみだったような。
GTk へのインターフェイスが出来れば Guile が不用になるので、
とっても嬉しいです。>> 作者樣
(´-`).。oO(practical scheme へのリンクが切れてますよぉ > 作者様)
Gauche の deb は漏れも up-to-date なパッケージを作ってるんだけど… もちろん漏れと漏れの友人だけのために。 Debian での正式メンテナは 0.5x くらいからとまったままみたい…どうよ?
Debian の場合 Gauche はどの文字コードでコンパイルするんだ? 全部コンパイルして、gosh-euc, gosh-utf, gosh-sjis てな感じにして、 インストールするときのダイアログで gosh からどれにシンボリックリンク張るか尋ねるのか? gauche-dev って何が入ってるの? セロ弾きのゴーシュ万歳!!
LispってEmacsだけのものじゃなかったのですね。 なんだかLispにますます興味が沸きました。
525 :
デフォルトの名無しさん :02/07/25 12:09
Guileの make-shared-substring みたいなのって、gaucheにない? (string=? key (substring pool s e)) みたいな処理が含まれたループかなんかだと、 使い捨ての文字列をいちいち生成するのはかなり馬鹿らしいと思うんだけど。
>>525 それらしいのは見当たらなかったけど、SRFI-13 からそれらしいの探してくるっ
ていうんじゃだめですか?
string-compare s1 s2 proc< proc= proc> [start1 end1 start2 end2] -> values
string-compare-ci s1 s2 proc< proc= proc> [start1 end1 start2 end2] ->values
string= s1 s2 [start1 end1 start2 end2] -> boolean
string<> s1 s2 [start1 end1 start2 end2] -> boolean
string< s1 s2 [start1 end1 start2 end2] -> boolean
string> s1 s2 [start1 end1 start2 end2] -> boolean
string<= s1 s2 [start1 end1 start2 end2] -> boolean
string>= s1 s2 [start1 end1 start2 end2] -> boolean
527 :
デフォルトの名無しさん :02/07/25 21:15
DrSchemeの専用スレ立てていいですか? ここだと、どこからどこまでがLispでどこからSchemeの話しなのか わかりずらいのですが・・・
必要ないだろ。 ここはLispとSchemeと兼用だし。 それだけ話題が少ない。
529 :
デフォルトの名無しさん :02/07/25 22:27
>>525 Gaucheの部分文字列はcopy-on-writeで管理されているので、
変更を加えない限り自動的に共有されるってどこかに書いてあったような
Lispマシンを使っていた世代の人に質問なのですが、 それは、どうして廃れてしまったのでしょうか? 速度でしょうか?それとも「シェルスクリプトの方が Lispより圧倒的に簡単だったから」という理由からでしょうか? 当時を知る人に昔話でもしてもらえたらなーなんて思います。
>>531 Classical Mathematicsだとばっかり...
「おもこ」してました。
534 :
デフォルトの名無しさん :02/07/27 12:47
>>532 他言語、他システムとの親和性が低かったから。
閉じたプロジェクトでは大きな力を発揮したが。
535 :
デフォルトの名無しさん :02/07/27 13:02
536 :
デフォルトの名無しさん :02/07/27 14:21
>>532 ソフトウェアエミュレーションでも十分速くなったからでは?
538 :
デフォルトの名無しさん :02/07/28 10:12
>>538 (call-with-input-file "./books.db" read) でどうでしょー?
540 :
デフォルトの名無しさん :02/07/28 10:37
>>538 (define data (call-with-input-file "./books.db" read))みたいに
して、carやcdrでデータを取りだせそうです。ありがとう!
関数型でも、この後は変数に代入しまくってもいいんですよ
ね!?
541 :
デフォルトの名無しさん :02/07/28 11:22
>>540 schemeだろうけど、LISPは純粋な関数型じゃないですよ。
なので、あまり気にする必要は無いと思います。
I/Oとか必須でしょうし。
けど、安易に接尾辞に!がつく関数は使わないで、
letとかうまく使えば非破壊でも色々できると思います。
542 :
デフォルトの名無しさん :02/07/28 11:27
非破壊にするメリットは、バックトラック系処理とかで 状態を気にする必要が無いとか、色々。 詳しくは関数型言語スレを参照。 I/Oも、見た目非破壊にすることができたと思います。 すぐに例は思いつきませんが。
Lisper でもデスマーチに巻き込まれるんですか?
544 :
デフォルトの名無しさん :02/07/29 07:59
(let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let)) 誰かこれ分かる人解説してください。
545 :
デフォルトの名無しさん :02/07/29 08:33
let に 1を入れて 2を評価する。 どういう意味があるかは不明。 1:'`(let ((let ',let)) ,let) 最初に'があるので let には `(let ((let ',let)) ,let)が評価されずに入る。 let -> (quasiquote (let ((let (quote (unquote let)))) (unquote let))) 2:`(let ((let ',let)) ,let)) ,(=unquote)がないと`(=quasiquote)は評価しない。 `(let ((let 'let)) let) を評価すると (let ((let (quote let))) let) になる。 `(let ((let 'let)) ,let) を評価すると let => (quasiquote (let ((let (quote (unquote let)))) (unquote let))) だから (let ((let (quote let))) (quasiquote (let ((let (quote (unquote let)))) (unquote let)))) になる。 `(let ((let ',let)) ,let) を評価すると quasiquote 内で (quote (unquote let)) は評価されて (quote let-eval) になる。 let => (quasiquote (let ((let (quote (unquote let)))) (unquote let))) だから (let ((let (quote (quasiquote (let ((let (quote (unquote let)))) (unquote let)))))) (quasiquote (let ((let (quote (unquote let)))) (unquote let)))) になる。
(let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let)) は評価しても同じになるのね。 1:'`(let ((let ',let)) ,let) 最初に'があるので let には `(let ((let ',let)) ,let)が評価されずに入る。 let -> `(let ((let ',let)) ,let) 2:`(let ((let ',let)) ,let)) ,(=unquote)がないと`(=quasiquote)は評価しない。 `(let ((let 'let)) let) を評価すると (let ((let 'let)) let) になる。 `(let ((let 'let)) ,let) を評価すると let => `(let ((let ',let)) ,let) だから (let ((let (quote let))) `(let ((let ',let)) ,let)) になる。 `(let ((let ',let)) ,let) を評価すると quasiquote 内で ',let は 'let-eval になる。 let => `(let ((let ',let)) ,let) だから (let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let)) になる。
comp.lang.scheme に投稿してる人の signature 見ると面白いのがありますね。
(reverse (concatenate 'string "pj.oc.oof@" "egoh"))
=>
[email protected] ;; 無限ループ
((lambda (x) (x x)) (lambda (x) (x x)))
;; あと 2ch の過去ログにあったやつ
((call/cc call/cc) (call/cc call/cc))
というわけで何か面白いネタ募集。
自作の scheme 処理系が r4rstest.scm をパスしません・・・
なぜか SECTION 6 5 6 で引っかかるの。
ソースを追っても何をテストしてるのか解読できません。
へるぷみ〜。
>>544 > (let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let))
見るだけで鬱だ・・・
r4rstest.scm は R4RS のテストですよ。 R4RS の 6.5.6 章を見てください。 数値を文字にして、その文字を数値にしたのが、元の数値と同じであるとか。
550 :
デフォルトの名無しさん :02/07/30 01:20
>>549 あの辺の「数」の実装、まともにやろうとすると頭禿げそうな。
そういえば、bignumの16進数の出力とかってどうやるの?
いちいち16で割り算してったら日が暮れそうな気がするけど。
普通に8bit右シフトじゃん?
gaucheは説明によると、substringがポインタ&レングスコストな 代わりにstring-set!が遅いと書いてあるね。 って、string-set!した時点で新しいオブジェクト作るってことは、 それ参照してる変数全部書き換えすんの? 非現実的な気がするんだけど。 受けオブジェクトがあるのかな。 [複数の参照先]→[受けオブジェクト]→[文字列の実体またはポインタ]
553 :
デフォルトの名無しさん :02/07/30 01:33
>>551 普通って、bignumで8bit右シフトなんて簡単にできるの?
555 :
デフォルトの名無しさん :02/07/30 01:36
>>554 どういうアルゴリズムですか?
例えばshort(0〜9999)とかで分かれてた場合は?
556 :
デフォルトの名無しさん :02/07/30 01:41
>>554 うーん、おれ頭悪いんで、例として
12345678901234567890(これは10進表現)
というbignum値(short配列で(0〜9999の範囲)で格納されている)があった場合、
それをどうやって16進出力するかって例をお願いします。
>short配列で(0〜9999の範囲) コレがすんげー意味不明
558 :
デフォルトの名無しさん :02/07/30 01:46
>>557 short bn[];
の各要素に入る値が0から9999ってことじゃないの?
これのメリットは10進ならそのまま出力できるって事。
普通のbignumってshortの範囲全部使い切るじゃん BCDじゃ演算速度がた落ちだろ。
>>559 なにが普通なのかよくわからないです。
いまのところ、
>>558 さんの言う通り、
>>556 の12345678901234567890という値なら
short bn[] = {1234,5678,9012,3456, 7890};
というのを考えてました。
>>559 じゃあ、0〜65535の範囲を使うとして、
それを10進で出力する方法を教えてください。
内部表現は普通↓のようにすると思うが。 LSB <-・-> MSB 0AD2 EB1F A98C AB54
>>562 いや、方向はとりあえずどうでもいいんですけど。
>>562 のshort bn[] = {1234,5678,9012,3456, 7890};
も実際は逆になるでしょうし。
>>563 それって遅いんじゃないですか?
もっと良い方法があるかと思ったんですが。
>>564 方向はどうでも良いが、値が違うと突っ込みが入らないように書いただけ。
>>561 ありがちなのは、10000で割りながら余りを4桁ずつ出していく方法。
同様に、10000進数を16進にするなら、4096で割りながら余りを
3桁ずつ出していけばいい。
>>567 高々除算の数千回から数万回、I/Oに比べたらずっと速い
やはり割り算しかないみたいですね。 結局一度に割る数を多めに取るということでしょうか。 半端な値の処理とか考えると禿げそうですね。 ありがとうございました。 そろそろスレ違いっぽいのでこれで終わりにします。
571 :
デフォルトの名無しさん :02/07/30 02:10
そういうのは自分で作っても実りがあまり無いから、 既存のライブラリ使った方がいいよ、多分。 ハゲるよ(w
572 :
心配だなー :02/07/30 02:14
処理系自作してる間に禿げた人いる?
573 :
デフォルトの名無しさん :02/07/30 02:22
CINTの作者は禿げてるよ!
すとらうすとらっぷもはげてるよ
俺もはげてるよ
内部表現は16進で、10で割りながら表示してます。重いです。
そーか、10000ずつ割るとかやれば少し速くなるんだ・・・気付カナカッタ。
ありがとう
>>568 さん。
577 :
デフォルトの名無しさん :02/07/30 09:24
sawfishでお馴染みの librep は bignum に gnu の数学ライブラリ使ってる。 カリー化な Lisp って何がありますか?
578 :
デフォルトの名無しさん :02/07/30 14:59
579 :
デフォルトの名無しさん :02/07/30 16:10
>>578 のgaucheのリンクにある、
(map (pa$ * 2) '(1 2 3)) => (2 4 6)
という例はどういう風に展開されるのでしょうか?
(map (lambda (t1) (* 2 t1)) '(1 2 3))
こんな感じ?
だけど、↓みたいなことしたい場合はどうするの?
(map (lambda (t1) (- t1 2)) '(1 2 3)) => (-1 0 1)
(map (pa$ - 2) '(1 2 3))
じゃ、
=> (1 0 -1)
となって駄目ですよね?
580 :
デフォルトの名無しさん :02/07/30 16:13
(map (lambda (t1) (- t1 2)) '(1 2 3)) ではいかんのか?
581 :
デフォルトの名無しさん :02/07/30 16:16
一方、SRFI-26では、 (map (cut - <> 2) '(1 2 3)) で被演算子の順序を変えられるみたいなんだけど。 この差がpa$の制限ですか?
582 :
デフォルトの名無しさん :02/07/30 16:20
>>580 それをpa$で書くことはできますか?
ってことを聞きたかったんです。
>>579 Haskellとかだと、flipという、引数の順序を入れ換えるオペレータが
あるな。
map (flip (-) 2) [1,2,3] ==> [-1,0,1]
同じようなことをするflip$みたいのを導入すればいいんじゃないか。
どう書くかは読者の演習課題としておく。
584 :
デフォルトの名無しさん :02/07/30 18:13
(define (flip f a) (lambda (x) (f x a))) これ?
(define (flip f) (lambda (x y . z) (apply f y x z)))
scheme処理系の(C/C++での)作り方を解説してるページとかってあります?
588 :
デフォルトの名無しさん :02/07/31 10:49
>>582 gosh にも cut なるんだし、なぜ pa$ にこだわるの?
589 :
デフォルトの名無しさん :02/07/31 22:42
>>589 「Scheme の勉強」って文法ですか?
それとも背景にある Lisp の慣習や定石も含まれていますか?
591 :
デフォルトの名無しさん :02/07/31 23:29
>>590 「Schemeの勉強」は文法だけです。具体的には湯浅太一さん
の「Scheme入門」を読みました。しかし、これだけではオブ
ジェクト指向、Webフレームワークには勝てないんです。(^^;
定石は是非とも知りたいところです。
592 :
デフォルトの名無しさん :02/07/31 23:35
>>591 とりあえず
>>4 にもある SICP を読んでみましょう。
現実的な問題解決は、それからでも十分だと思いますよ。
594 :
デフォルトの名無しさん :02/08/01 00:56
>>593 ありがとう。SICP持ってますが、あれは気長に学習モードです。
なんとか、「現実的な」(?)サンプルを! (^o^)
SICPってやっぱ、簡単なサンプルを越えるすごさがあるんです
かー(感嘆&クエスチョンマーク)
595 :
デフォルトの名無しさん :02/08/01 02:33
>>592 n-queenサンプルのページ
>ただしメモリ消費量が凄いです.8-queenを解くのに90Mも食ってくれます(汗)
すげぇ富豪的だ(w
596 :
デフォルトの名無しさん :02/08/01 07:27
597 :
デフォルトの名無しさん :02/08/01 08:40
質問なんですが、 (let ((a (lambda(a b.d) (cons d a)))) (a 1 2 3 4)) の答えが ((3 4) . 1) になるんですが、どうしてそうなるかわかりません。 aにlambda(a b.d)(cons d a))))がバインドされるのはわかるのですが、 どういう手続きでそうなるか教えてください。
598 :
デフォルトの名無しさん :02/08/01 09:33
(define (a x y . z) (cons z x)) (a 1 2 3 4) と同じ x -> 1, y -> 2, z -> (3 4)
599 :
デフォルトの名無しさん :02/08/01 09:40
600 :
デフォルトの名無しさん :02/08/01 12:29
600記念カコキ
601 :
デフォルトの名無しさん :02/08/01 13:33
ありがとうございます。なんとなくわかりました。598
>consセルは32bit環境で素直に作ると、car(4)/cdr(4)/識別子(1〜4)で、 >少なくとも9〜12byteは必要でしょう。 >Lispのconsセルはポインタ2つきっかりになるのが普通だ >よ。Javaとかと違って型の種類が固定だから、ポインタの >下3ビットとかに型情報をエンコードする。特にconsセル >と小さい整数あたりは最も効率よい表現を割り当てる。 古いネタ(Part2からの)で恐縮ですが。。Scheme処理系を作ってみたくて勉強 しています。過去スレを漁っていると上のようなやりとりを見つけました。 minischeme は前者の方法、gauche では後者の方法をとっていると思うのです が、ここら辺について詳しい人、解説してもらえませんか? (もちろん Part2 のこの後のやりとりも読んでいるんですが) 後者の方法を使うとポインタの指す先を見なくても型が分るということなので すが、ポインタの下3ビットに別の情報を埋めこんでしまって、そのポインタ の指すデータはちゃんととってこれるんでしょうか。 うーん、書きながら何だかまだまだ勉強不足な気がしてきました。。
603 :
デフォルトの名無しさん :02/08/02 14:01
>>602 > ポインタの下3ビットに別の情報を埋めこんでしまって、そのポインタ
> の指すデータはちゃんととってこれるんでしょうか。
consは、下3bitを000にすればいい。
intなんかはmaskしてから使いなよ。(Cのcodeの中では)
> minischeme は前者の方法
miniだけにword境界を跨いでwordアクセス、
あるいはpointerとtagの分離によるworking setの増大による
速度低減は気にしないんだろ。
自身がなければminiの方法で手習いするのもいい。
604 :
デフォルトの名無しさん :02/08/02 14:28
>>604 (progn
(message "Parallel GCとかじゃなければ、計算中は0でいいでしょ?")
(if paranoia
(yes-or-no-p "って返事で、的を射てるんでしょうかね?)))
>>603 >consは、下3bitを000にすればいい。
ポインタの場合は何も埋めこまないってことかな、と一瞬わかったような気に
なったのですが、テストコードを書いてみてまた混乱してしまいました。
gaucheは(下2ビットですが)確かにポインタのときは 00 になっているようで
すね。
図々しいようですが、Cのコードでちょっとしたサンプルを見せてもらえない
でしょうか。それでも分からなかったら minischeme の方法でやってみること
にします。
607 :
デフォルトの名無しさん :02/08/02 16:29
>>604 マークフラグは別テーブルでできると思う。
>>606 603じゃないけど
typedef struct _cell {
struct _cell *car;
struct _cell *cdr;
} cell;
#define atomp(p) (1&(p))
#define cellp(p) !atomp(p) // pairp
#define car(p) (p)->car
#define cdr(p) (p)->cdr
数値を即値(30bit)にするとかの場合はもう1bit使って、
#define fixnump(p) (3&(long)(p)==3)
#define fixnum_value(p) ((long)(p)
>>2 )
#define make_fixnum_value(p) (cell *)(((p)<<2)|3)
とか。
(24ビットタグアーキテクチャの資産は生きてるのね…)
609 :
デフォルトの名無しさん :02/08/02 17:24
λ計算のいい本あります?
>>607 やっとわかってきました。ありがとうございます。
あとは自分で考えてみることにします。
#define fixnump(p) (3&(long)(p)==3)
は
#define fixnump(p) ((long)(p)&3==3)
にしないと正しい結果が出なかったんですが、理由はよくわかりません(汗
Cでは、x & y == z は x & (y == z) になるという、イヤな優先順位が。念為。
>>610 んん。
#define fixnump(p) ((((long)p)&3)==3)
じゃないとマズくない?
>>611-612 あ、そうですか。
今手元に本がないんで後でちゃんと調べるつもりだったんですが、適当なこと
を書いたかもしれません。すみません。
#define fixnump(p) (3&(long)(p)==3)
がダメなはずはないでしょうか?自分のプログラムが間違っていただけかもし
れません。
それと何度も質問ばっかりで申し訳ないんですが、、
#define atomp(p) (1&(p))
#define cellp(p) !atomp(p) // pairp
ポインタのアドレスの一番下のビットがたまたま1になっていてこの判定が逆
になってしまう可能性があるように思うのですが、そういうことはないんでしょ
うか?
>>613 > ポインタのアドレスの一番下のビットがたまたま1になっていて
ヒープデータをポインタのサイズ、もしくはセルのサイズに
必ずアラインするようにしておく。
そうすれば、ポインタ4バイトのアーキテクチャなら、
有効なポインタの下2ビットは常に0。
必ず0
>>614-615 なるほど。みんなそれを前提にしてたんですか。思わず溜息ものです。
過去ログの話もいまいち飲み込めなかったのが全部すっきりしました。
これが常識なんでしょうか。すごいなぁ。
>>615 さんの紹介してくれたページにもその辺のことが書いてありますね。
これから続きを読んできます。
みなさんいろいろありがとうございました。
617 :
デフォルトの名無しさん :02/08/02 22:22
>>616 つーか、ワード境界を跨いでワードを配置しないのは、
システムプログラマの常識。アセンブラの勉強しなされ。
RISCだとそもそも一発でread/write出来ないのが多いし、CISCでもペナルティがある。
そもそもmalloc(3)はワード境界から割り当てる実装が多い。(つーかしないのある?)
>>609 とりあえず、Barendregtの本はどうでしょう?
板違いかな。
619 :
デフォルトの名無しさん :02/08/03 19:25
僕はアメリカのフロリダで学生してるものなんですが、 今8週間のクラスをとっています。最初の2週間prolog, 次の2週間にscheme,次の2週間にMLで、最後の2週間に コンパイラの概念を教えるクラスをとっているんですが、 shcemeははじめて、というか関数型言語ははじめて勉強するので よくわかりません。使ってる言語はインディアナ大学の プログラミングラングエッジスキームという本なんですけど。 (((if (eq? 'a 'b) car cdr) (cons cdr car))'(3 (2 1))) return 3, (define x (lambda (y) (lambda (z) (cons z y)))) ((x '(2 1)) '(4 3)) return ((4 3 ) 2 1), (define x (lambda ( y z)(cond ((null? z) y)((eq? (car z)y)(cons y z)) (else (x y (cdr z)))))) (x 'd '(a c b)) return d, (x 'b '(a c c a)) return b, (map (lambda (f) (f '(a b c d))) (list cddr cadr caddr list)) return ((c d) b c ((a b c d))) など初歩の問題らしく、2週間ことにテストがあり、これはshceme のパートの一部なんですが、はっきりいってぜんぜんわかりません。 アメリカ人も難しいクラスとなやんでいるのですが、どんなvalue が リターンされるか答える問題ですが、教授は簡単だといっています。 やはりshcemeを勉強しだしこのくらいはできないとだめなんでしょうか? 僕は日本の理工系の学生は尊敬してるのですが、このくらいは 日本の学生は簡単にやってしまうのでしょうか?Cならわかるのですが、 なにかこのクラスをとって自信が情報工学勉強してる自信がなくなって きました。 ならやめろとかいわないでね。
>>619 インタプリタを使える環境にあるんでしょ?
括弧の一番内側から1ステップづつ実行してみるのがよろし。
この課題について言えば、Cと違って関数もオブジェクトに
なることが理解できたらすぐわかると思う。あと括弧に慣れること。
この課題がどういうレベルかというと、英語でいうならアルファベットを
読めるかどうかを確認するレベルかなあ。
>>620 Cでも関数ポインタあるんですが。
違いは、それをインラインで書ける、動的に生成できるってことで。
>>619 620 氏の言う通り、単純に慣れの問題だと思われ。
一度慣れてしまえば、スラスラ解けますよ。僕は理工系の学生ではないですけど。
>>621 > Cでも関数ポインタあるんですが。
そういやそうだな。
そしたら最初のやつはlambdaも出て来ないから
わかりそうなもんだが…もしかしてquoteで引っかかる?
>>623 もしかしたらCをわかってるつもりなだけで
(((intern("a") == intern("b") ? car : cdr)(cons(cdr, car))))(list(3, list(2, 1)))
なんてのを見ても動作が理解できないとかだったりするかも。
(キャストは省略してます。)
実はCもわかってるといっても1年しかたってないので、
schemeに比べるとわかるという程度で・・・
いまschemeを習いだして1週間目がすぎて、2週目なんですが、
本よんでいるにもかかわらず、この最初の問題もわかりません。
(((if (eq? 'a 'b) car cdr) (cons cdr car))'(3 (2 1)))
(eq? 'a 'b)car cdr)(cons cdr car))
ここの意味だけでぜんぜんわかりません。'aと'bがeqalなら
carで#fならcdr? まったくわかりません。誰かどうやって動いてるか
解説おねがいします。テストではoutputを書けってでてくるので。
Cについてはなじらないでください。
>>624 さんがいってる動作も
ぜんぜんわかりません・・・・
>>625 これは理解できる?
(eq? 'a 'b) => #f
(if #f car cdr) => cdr
(cdr (cons cdr car)) => car
(car '(3 (2 1))) => 3
>>625 わかりやすく解説ありがとうございます。
なぜ(cdr (cons cdr car)) ->car
になるのでしょうか?リストの中でcarは最初、cdrは
残りというのはわかるのですが、このリストの中身、
(cons cdr car)のcar->cons, cdr->cdr carとは違うのですか?
調子にのってると思われるかもしれませんが、できれば こちらの解説もおねがいできないでしょうか? (define x (lambda (y) (lambda (z) (cons z y)))) ((x '(2 1)) '(4 3)) return ((4 3 ) 2 1), define xに (lambda (y) (lambda (z)(cons z y)))) がバインドされるのですよね? (lambda (z)に(cons z y)が バインドされるのでしょうか?そしてそれをlambda (y)にバインド ということでしょうか?return されるのをみると、与えられてる ものが逆になってるということだけわかるんですが・・・
>>626 > (if #f car cdr) => cdr
> (cdr (cons cdr car)) => car
これ違うんじゃ。。。quoteついてないからcdrやcarの中身だと思われ。
>なぜ(cdr (cons cdr car)) ->car になるのでしょうか? gosh> (cons cdr car) (#<subr cdr> . #<subr car>) gosh> (cdr (cons cdr car)) #<subr car> あのさ、自分で試すことはできないの?
>>629 だいたいの雰囲気はこういう感じ。
(define x (lambda (y) (lambda (z) (cons z y))))
x => (lambda (y) (lambda (z) (cons z y)))
(x '(2 1)) = ((lambda (y) (lambda (z) (cons z y))) '(2 1))
=> (lambda (z) (cons z '(2 1)))
((x '(2 1)) '(4 3)) = ((lambda (z) (cons z '(2 1))) '(4 3))
= (cons '(4 3) '(2 1))
=> ((4 3) 2 1)
厳密に書くとこう。
(define x (lambda (y) (lambda (z) (cons z y)))) => #<unspecified>
x => #<CLOSURE (y) (lambda (z) (cons z y))>
(x '(2 1)) = (#<CLOSURE (y) (lambda (z) (cons z y))> '(2 1))
=> #<CLOSURE (z) (cons z y)> [y = (2 1)]
((x '(2 1)) '(4 3)) = (#<CLOSURE (z) (cons z y)> '(4 3))
= (cons '(4 3) '(2 1))
=> ((4 3) 2 1)
>>631 , 632
ありがとうございます。動作がわかりました。
自分はDr Schemeをウィンドウズ上で走らせてるんですが、
自分でインプットしてるんですが、どういうふうに動作してるのか
わからなくて・・・ありがとうございました。
string->number, number->string がどーしても上手く実装出来ん。 気が狂いそうだ。うきーっ!
635 :
メロンパン :02/08/04 16:49
>634 いったい何が問題なんだ?
また619なんですが、また質問なんですが・・・ 1.(let ((x 2)) (let ((y (lambda (z)(cdr z))))(y '(+ * x x)))) return value, (* x x) list (+ * x x)のcdrが(* x x)だと理解できるのですが、(y '(+ * x x)のyは何を あらわしているのでしょうか? 2.(define x (lambda (y z) (cond ((null? z)y)((eq? (car z)y)(cons y z)) (else (x y (cdr z)))))) given: (x 'd '(a c b)) return value, d (cond ((null? z)y)で、zがnullならyを返して、(eq? (car z)y)はcar zがイコールなら yをかえすということでしょうか?このあたりが混乱してどう動作しているのかわかりません。 3.(define (map f L)(cond ((null? L) () )(#t(cons (f (car L))(map f(cdr L)))))) return value, (((1) 1) (((2 3)) (2 3))) これも(null? L) ()),Lがヌルなら、()を返すということでしょうか? (#t(cons (f (car L))(map f(cdr L))))))は何をあらわしてるかもわかりません・・・ #tとはなにがtrueだったらなのでしょうか? 質問ばかりで、むかつくとは思いますが、あと1週間後にテストなんです・・・ テストの形式は上にあげたような例題を少し変えてテストがでてくるので、 どういうふうに動作してるか理解してないととけないんです・・・ わがままですが、解説おねがいできないでしょうか・・・
>>636 1. y は (lambda (z)(cdr z)) です。2番目の let でバインドされています。
2. こう書くとわかりやすい?
(define x
(lambda (y z)
(cond
((null? z) y)
((eq? (car z)y)(cons y z))
(else (x y (cdr z)))
)
)
)
まず (null? z) をテストして、真なら y を評価して返す。
(null? z) が偽なら、次に (eq? (car z) y) をテストして、真なら (cons y z) を評価して返す。
(eq? (car z) y) も偽ならば、(x y (cdr z)) を評価して返す。
さっぱり意味がわからなければ cond について調べてください。
3.
(define (map f L)
(cond
((null? L) () )
(#t (cons (f (car L))(map f(cdr L))))
)
)
まず (null? L) をテストして、真なら () を評価して返す・・・というか、これはエラーでは?quote してない () は、評価出来ないハズだ。まぁそれはともかく。
(null? L) が偽なら、次に #t をテストして、真であれば (cons (f (car L))(map f(cdr L))) を評価して返す(真であればっていうか、#t は常に真だけど)。
OK?
>>619 かなり基礎的なところで罠にはまってると思われる。
式がどのように計算(評価)されるかを思いっきり簡略化して説明しよう。
簡単にするために、相当厳密さを欠いているから、
このレベルが理解できたら後日改めて厳密な定義を学んでおくように。
1. ' の直後はそれ以上計算されない。そこに書いてあるままの値になる。
2. 数字はそのまま数になる。(その他にもあるけど、今は無視しておけ。)
3. 手続きの名前は手続きそのものになる。
4. 上述のいずれの形式でも無ければ、(X ...) という形式になっているはず。
4.1 ここで、X が特殊なもの、たとえば define とか let とか cond
とか if とか quote とかなどなら、それに応じて ... のところが
それぞれ特別な方法で解釈される。
この特殊なものはは R5RS で syntax として説明されている。
どう解釈されるかも含めて、これは覚えるしか無い。
... の部分は全部計算されたり、されなかったり、
一部だけ計算されたりと、とにかく、特別なやりかたであつかわれる。
3.2 そうでなければ、まず、X の部分と ... の部分(トップレベル)が
いま説明しつつある方法で全部計算される。
この場合、 X は手続き(procecure)になるべきであり、
... の計算結果を引数にして手続き X を呼び出す。
X が car とか cdr とか cons とか、define したモノとか、
それは実は (lambda ...) とおなじものだとか、
さらには(Y ...) という形式でも、これを計算した結果
(Y ...) が手続きになるのなら、このケースにあたる。
1. の霊: '(if a b c) => (if a b c)
2. の霊: 5 => 5
3. の霊: car => #<primitive-procedure car>
4.1 の霊: (if #t 1 2) => 1
4.2 の霊: (car '(a b)) => a
DrScheme v2.0.1 available
SECTION 6 5 6 の件は未だ解決せず。 浮動小数点数を string->number で正しく戻せないケースがあるらしいです。むぅぅ。 ところで、暗黙の force を組み込んだら r4rstest が新たなエラーを出しました。 write でプロミスを表示しようとした時に暗黙の force で値が確定してしまったようだけれど、こういう挙動は不正なんでしょうか? 簡単に言うと例えば次のような場合・・・ (define x 0) (define y (delay x)) (write x) (set! x 1) (write (force x)) ・・・最初の write のときに暗黙の force で値が 0 に確定するというもの。 ここは暗黙の force を発動させずに #<promise> と表示させるべきなんでしょうか?どうなんでしょ?
間違えた。こうです。 (define x 0) (define y (delay x)) (write y) (set! x 1) (write (force y))
Dr Schemeって重いんだよね。winのやつなんて他のアプリ立ち上げてると かたまるときがあるし。それは俺のxpが問題なだけかもしれないけどw
>>642 Cygwin 入れて Gauche にしる!!
DrScheme が重いのは同意。
gaucheねー、グラフィックに慣れてる俺としてはなかなか むずかしいんだよね。なんせwinマンセーだからw でもDr Schemeつかっててブラウザ立ち上げると少しの間かたまるんだよね。 メモリ512Mもあるのに。ヽ(`Д´)ノウワーン(´・ω・`)ショボーン
linuxかfree bsdにスキームってはいってないの?最初から。
646 :
デフォルトの名無しさん :02/08/05 05:23
いまどきのLinuxならguileってschemeが入ってるよ。たいがい。
>>645 FreeBSDなら最初から入ってはいないけどportsにあるよ。
cd /usr/ports; make search key=scheme
してみれ。
よさげなのがあったら、Pathで示されたディレクトリにcdして
make install clean
すればよろし。
648 :
デフォルトの名無しさん :02/08/05 07:48
schemeで書いてあるwebのBBSのCGIスクリプトでフリーなものないですか?
649 :
デフォルトの名無しさん :02/08/05 12:22
そのくらい自分でつくれYO!!
>>650 エッセイ2時間かけて読み終えたハァハァ。
色々紹介されてた本買ってみようかな。
string->number と number->stringをちゃんと実装するのって そうとう大変じゃないかなあ William D. Clinger "How to Read Floating Point Numbers Accurately" Robert G. Burger, Kent Dybvig "Printing Floating-Point Numbers Quickly and Accuraely" みたいな論文って、 Scheme以外の世界では書かれてないのか?
>>649 人のコードみて勉強しようと思ったんですが、甘いっすか?
甘ちゃんっすか? 俺ってダメなやつっすか?
...がんばってスクラッチからやってみます。しょぼーん。
どうもありがとうございます。これはGaucheの人の作品ですか。 チャレンジしてみます。
656 :
デフォルトの名無しさん :02/08/07 14:12
SICP第二版(日本語)読んでるんですけど、 3.1.1 の make-account の定義に dispatch が 存在するのは間抜けだと思う人居ませんか? グローバルシンボルの withdraw を 局所手続き withdraw に変換するため というのは分かるのですが、 これでオブジェクト指向だと言われても これではメソッドを追加するたびに メソッド本体とdispatchを書き換える必要があり、 いまいち美しくないと思うのです。
657 :
デフォルトの名無しさん :02/08/07 14:40
で?
つまり、もうちょい綺麗な書き方無いのかね、ということです。 予想される解答としては 1、すでにOOP向けの改良を組み込んだSchemeが出回ってる。 2、OOPはマクロや定義をいくつか書くことでもっと綺麗に書ける。 (パッケージ化されている) 3、OOPは優れた思想なので、プログラム入門書であるSICPでも 取り上げざるおえなかったが、Schemeは本来OOPに向かない。 とここまで書いて自分で google に scheme oop と突っ込んで 調べ始めたり。
659 :
デフォルトの名無しさん :02/08/07 17:48
>>656 > これではメソッドを追加するたびに
> メソッド本体とdispatchを書き換える必要があり、
Scheme限定の制約じゃなくて、
動的な定義がある言語のインタープリタにおける制約だし…
テーブル登録ルックアップ型よりは素直でしょ。
>>658 > 1、すでにOOP向けの改良を組み込んだSchemeが出回ってる。
実装を見せられなければいいというものでもないし…
Debug時にうっとうしいということは確かだから、
LaTeXのマクロ、C++のtemplateと同様、
解決方法が求められている課題はあるね。
Passed all tests! やたっ!おめでとう自分。 前書いた暗黙のフォース云々は勘違いでした。ごめんなさひ。
>>660 おめでたうございます。
いいなぁ。どんな処理系のソースとか参考にしました?
>>640 さんだけじゃなくて処理系作ったことある人に聞きたいです。
(特に最初に作った時に参考にしたもの)
>>661 規模が小さい上にツボをしっかり押さえてる処理系
・mini-scheme
・AM-scheme
・SECDR-scheme
かなり昔の処理系で、作者は全部日本人ですね。
これらはgcも手書き。ただ、ちょっと遅いかも。
最初に参考にするならmini-schemeかと。
>>661 基本的にはあまり参考にしてませんです。
gaucheのソースなんか眺めてみたりしましたけれど、
他人のソースって読みにくい。あまり参考にならなかったり。
それより日本語で書かれたドキュメント類の方が何かと参考になります。
664 :
デフォルトの名無しさん :02/08/09 18:02
>>663 やっぱcellは8バイトですか?
その場合gcのマークフラグはどうするんですか?
>>664 今の自分の実装では、コンスセルを1個作ると・・・えーと・・・32バイト。ヒープを食います。
も少しこのあたり改善しないとだめかなぁ?
666 :
デフォルトの名無しさん :02/08/10 11:45
shemeでソートを勉強したいんだけどどこかいいHPしってる? バブルソート、クイックソート、などなど。ソースみて、時間かければ なっとくできると思うんだけど、自分じゃ作れないから。
668 :
デフォルトの名無しさん :02/08/11 00:36
SICP第二版(日本語)読んでみたいと思っているのですが、 ざっと見ただけなのですが、今の自分の知識では無理だと思ったので これを読みこなすために前提となる知識、または知っておいた 方が良い知識があれば教えて頂けないのでしょうか。
「知識」なら、読み始める前に特に必要は無い。 処理系は用意しといてね。 そいから、一緒にトライしてくれるひとが、身近にいるといいかも。
670 :
デフォルトの名無しさん :02/08/11 01:01
それと陰で支えてくれる女子がいてくれたらうれしいのう
>>669 処理系は用意しといてね
今じぶんが持っているのは、Petite Chez Schemeと、
ChezEditというエディタなのですがこれで良いでしょうか。
>>670 残念ながらいません。おまけにプログラムに興味を持っている
男さえも周りにいません。
俺たちは身近な人ではないが、いつでも質問・雑談・答え合わせに来るがよい。 と勝手にこのスレを代表してみる。
673 :
デフォルトの名無しさん :02/08/11 04:42
\ │ / / ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ─( ゚ ∀ ゚ )< Dr Scheme〜〜〜! \_/ \_________ / │ \ ∩ ∧∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \ ( ゚∀゚)< Dr Scheme Dr Scheme! Dr Scheme〜〜! >( ゚∀゚ )/ | / \__________ ________/ | 〈 | | / /\_」 / /\」  ̄ / /
典型的な手続き言語厨なので、 どうも思考がついて行かれん。 どしたらLisp頭になれんの?
>>674 例えばどのあたり?
Lispも手続き型言語だと思い込んでみたら?
俺は手続き型が体に染み付いているので、
Lisp(Scheme)を勉強しても、Lispが書きやすいと
思えるようにはならなかったが、C++やJavaのコードが
少し綺麗になった。
もう少し勉強したらLispの方が書きやすくなるのか?
>>675 >>674 氏は上記のような状況を望んでいるのだと
思われ。したがってそれでは無意味かと……。
hoge(hage(boge(), bage()), hego(), bego());
>>678 それは…日々 list や lambda と戯れるしか無いんじゃないかな…
Emacs とかで遊んだり、 Scheme の source 読んだり…
680 :
デフォルトの名無しさん :02/08/12 10:59
この間shcemeの問題を教えてもらった、学生です。無事schemeのテストが終わりました。 でも2週間でスキーム教えるのには無理があると思いました。テストでは簡単な 教えてもらったような問題から、バイナリーサーチツリーを書け、括弧がいくつあるか 調べるファンクションを書け、infixをpostfixに直すファンクションを書けなど、 まだたくさんいろんなファンクション書けっていう問題がありましたが、スキームやってた 人には簡単でも手続き言語しかしらない自分みたいな腐れ学生はみごとに・・・ 100点中40点・・・平均も40点くらいだったんですが。スキーム恐怖症に少し かかってしまいましたw
681 :
コギャルとHな出会い :02/08/12 11:03
http://kado7.ug.to/net/ 朝までから騒ぎ!!
小中高生
コギャル〜熟女まで
メル友
i/j/PC/対応
女性の子もたくさん来てね
小中高生大歓迎です
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。
激安携帯情報あります。
682 :
デフォルトの名無しさん :02/08/12 11:48
手続き型厨っていうより、複雑なデータ構造を理解できてるか、 っつーことではないか? Cとか BASIC (つーても Pureなのしかしらん) とかのいわゆる手続き型 言語だとデータ構造を意識しなくても変数をバリバリつかってなんとなく toy programなら書けてしまう。 Lisp系言語でもそういうのはできるが、やりにくい (つーかやる習慣がない)。 ので、初期の段階からデータ構造を意識する必要がある。 でかいプログラムを書くときにはどうしてもデータ構造を意識する必要 があるので、Cとかでもそういうのに慣れるのは必要だけどね。
683 :
デフォルトの名無しさん :02/08/12 12:23
そうですね、データ構造のことをすごく意識しろといわれました。 自分実はプログラムはじめて1年目なもので。プログラムは 奥が深いです。
> バイナリーサーチツリーを書け、括弧がいくつあるか > 調べるファンクションを書け、infixをpostfixに直すファンクションを書けなど、 2週間でこれはきついですね。こういうのでscheme嫌いになる人が出たら残念。
685 :
デフォルトの名無しさん :02/08/12 16:13
質問 GUIと日本語が使えるSchemeって、ありますか? (Stklosのwinバイナリは、日本語が通らないです)
質問 UnixとWindowsで使えて GUIと日本語(出来ればUTF8がいいな)が使えて GPLじゃないバイナリがつくれて フリーなSchemeって、ありますか?
687 :
デフォルトの名無しさん :02/08/12 19:10
Lisp Patrick Henry Winston とBertbold Klaus Paul Hornっていう本を 人工知能の分野で有名な北野さんがすすめてましたがいい本なんですか?
>>685 ,686
とりあえず、過去ログ読んでみたら。
689 :
デフォルトの名無しさん :02/08/12 20:53
lispの問題ではないのかもしれませんが、 ;; elisp (* 1.4 1.4) 1.9599999999999997 ;; gauche gosh> (* 1.4 1.4) 1.9599999999999997 という結果になるのは何でですか? guileだと % guile -c "(display (* 1.4 1.4)) (newline)" 1.96 なんですが。
>>690 浮動小数点数の演算で演算誤差が発生して、1.4 と微妙に値が異なってしまうためです。
(= 1.96 (* 1.4 1.4))
ってやってみてください。これが #f なら、(* 1.4 1.4) は 1.96 ではないので、1.96 と表示されるのは誤りです。
訂正 誤:演算誤差が発生して、1.4 と微妙に値が 正:演算誤差が発生して、1.96 と微妙に値が
>>691-692 elisp と gauche はもともと 1.9599... なのでもちろん nil, #f でしたが
guile でも
% guile -c "(display (= 1.96 (* 1.4 1.4)))(newline)"
#f
となりました。ちょっと不思議。
誤差ですか。emacs を電卓代わりにしてたんですが小数の計算には向いていな
いですね。
694 :
デフォルトの名無しさん :02/08/12 23:40
つーか、浮動小数点をイコールで比較すんのは間違ってる気が。
>>693 いわゆる浮動小数点数で誤差が発生するのはある意味常識・・・ご存知ない?
そもそも 1.4 は浮動小数点数で正確に表現出来ないんです。
なんでguileだと中途半端にうまくいくんだろう?
表示精度と内部保持精度が違っていて、四捨五入してごまかしてるとか?
(だったら 1.960000... とでもしてほしいが)
内部精度全桁表示させる方法はありますかね?
>>694 検証実験で = を使ってるだけでは。
698 :
デフォルトの名無しさん :02/08/13 21:39
なんで数値だけ特別扱いなんだよ。 他の言語では小数点付きと整数は別扱いになってるだろーが。
DrSchemeについてくるゲームとかってどうやって遊ぶの? 普通にopenしてexecuteボタン押しても何も起こらないし。
↑ここで聞かずに作者に聞けよ。
702 :
デフォルトの名無しさん :02/08/13 23:18
>>701 気付かないアホがいるとは思わんかった(藁
>>700 作者に聞く前にマニュアル読めよ。
まあ、英語なのが問題なんだろうけど。つーわけで
>>699 うちでは、拡張子が ss なファイルをopenしてexecuteすれば、
blackjackやmineは行けますが?(OS:Win2000)
PLT\collects\game\games.ss はランチャですね。
705 :
デフォルトの名無しさん :02/08/14 23:21
おまえら、相変わらずLISP自作してんのか。 結構なこった。 おれにも、作り方教えテクだ才!
706 :
デフォルトの名無しさん :02/08/15 03:02
gcにmark&sweep(新規メモリが必要になったときcopygc)を使うという前提で、 ・1つのセルに(carとcdrで)8バイト使う処理系 割り当てるメモリ領域は1つで、 gc用マークフラグは別領域にビットマップを作る。 と、 ・フラグ&マーク用にもう数バイト(=アラインメント制限で12バイト)を使う処理系 割り当てるメモリ領域は複数ブロック(セグメント単位) では、 速度にどれぐらいの差が出そうですか? 今mini-schemeとここの過去ログを参考に、後者で作ってるんですが、 前者の方が速いのかなー、とか色々悩んでおります。 後者(mini-scheme)はおそらく、16bitのDOS環境でメモリ確保できる様に、 セグメント単位に分けたと考えられるんですが、わたしが動かす環境は 主にwindowsなので、あんまり意味ないかなと思いました。 ただ、新規セグメントの確保は、後者がオブジェクトの移動が無いので 速そうだなと、この辺りで速度差が出ないか気になっております。
mark-and-sweepよりstop-and-copyの方が良くない? というか、セルとポインタには後者で、大きめのメモリには前者で使い分けるのが 手軽でよさそう。
>>707 お早い回答ありがとうございます。
この辺はなんだか複雑なので、どちらかで一元化出来ないものかと考えて
おりました。
vectorやstringなどを別領域に取るのは良いアイデアですね。
前者のみを使うとなると作りはシンプルになりそうですが、
毎回copygcを呼ぶのは速度的に不利な感じなので、セル単位など、
連続領域が必要にならない間はmark&sweepを使う事を考えております。
(それでも足らなかったら大きめの領域を確保してcopygcを使う。
この辺が2度手間で逆に遅そうですが。)
709 :
デフォルトの名無しさん :02/08/15 03:26
Generational Copy GCを使えばそんなに遅くならないって Appelちゃんがいってたよ。
あと、再帰的な参照をされたvectorオブジェクトについても悩んでおります。 これはmini-schemeでは解決されていませんでした。 (そもそもmini-schemeにはvectorが存在しない。) #(#(#(#(#(#(#(....)..)..)..)..)..)..) この様な非常にネストの深いvectorオブジェクトの各要素のマーク を考えると、mini-schemeで使われている、クヌースの非再帰マーク アルゴリズムそのままでは対処できないとわかりました。 (素直にvectorのmarkを再帰関数で組んでしまうとスタックオーバーフローしてしまう。) 今のところ、vectorオブジェクトにgc専用のvectorのチェーンポインタを付けて、 vectorの要素全部を後でいっぺんにマークする(意味伝わるかな・・)方法を考えて いますが、他に良い方法はあるでしょうか。
>>709 世代別コピーgcは難易度が高すぎて、自分はいまだ理解できずにいます。
理屈を考えると速そうなのは解るんですが・・・。
頭痛くなってきたのでもう寝ます。
gauche(0.6.1)@cygwin が、windows版バイナリでとってきた emacs-21.2 の M-x run-scheme でうまく動かないんだけどうちだけ? cygwin でコンパイルした guile-1.4.1 だとちゃんと動くんだけど。
結局両方作って比較することにしました。 時間があればですが。
715 :
scheme 小僧 :02/08/16 17:45
>R5RS的にもエラーが正しい。 って書いてありますね。 gauche の場合は「手抜き」のせいでエラーにならないんでしょう。stk は知 らないけど。 そもそも変数を定義するのに define は普通使わないと思いますが、、 >通らないと結構面倒くさいのですが、let* を使えってことでしょうか。 というのは何で?
>>716 > >R5RS的にもエラーが正しい。
> って書いてありますね。
やっぱし、そうですか。ありがとうございました。
> そもそも変数を定義するのに define は普通使わないと思いますが、、
> >通らないと結構面倒くさいのですが、let* を使えってことでしょうか。
> というのは何で?
どうも、C などになれちゃっているせいか、先頭で define して
名前を与える方が見易く思ってしまうんですよね。
let だと一段括弧が深くなるというのもありますが、もしかしたら
emacs 使っているので色がつくからかも知れません。
let でも束縛する識別子に色をつけてくれないかなぁ。
>>717 私も全部 define で済んだ方が嬉しいな…
今は letrec* とか書いて使ってるけど…
719 :
デフォルトの名無しさん :02/08/17 00:39
>>718 letrec*ってどういう挙動?
普通にlet*で関数書いておけばいいんじゃないの?
internal definitionは letrecと等価だからね。 初期値を求めるのにそこで bindする変数の値を使ってはいけない罠。 おれもめんどうだなあ、と思ったことあるけど。 それにしても letrec* は初耳。
721 :
デフォルトの名無しさん :02/08/17 01:20
話が逸れるが、letの原型がlambdaだから、 let*の関数版(引数を左から右へ評価する)lambda*ってのも、 あって良いんじゃないかと思う。
>>721 どうやって展開すんの?
((lambda*(a b c) ...) x y z)
↑みたいにインラインで書かれたらマクロ無理だよね?
723 :
デフォルトの名無しさん :02/08/17 01:32
↑そうだった。 最低名前でアクセスする必要がありそうだな。 無名マクロが記述できれば便利なんだが。
725 :
デフォルトの名無しさん :02/08/17 01:39
726 :
デフォルトの名無しさん :02/08/17 01:48
>>725 書いた本人ですが、
ちょっと前のここの過去ログにhtml->sexpr, sexpr->htmlがあります。
一応可逆変換可能です。(コンテンツによっては不完全。)
まあ参考程度にはなるかも。
もうちょっと本格的にやりたいならDSSSLを勉強するとか。
728 :
デフォルトの名無しさん :02/08/17 02:20
Part4はなんか荒れてるな
>>719-720 let* だと再帰する関数が書けないから、それにだけ対応させてみた自作 macro。
複数関数の相互再帰には対応できてないけど、少しは便利。
>>724 > ここの set! の説明に letrec* が登場するけど、ミス?
文脈的に、ミスだと思う。
730 :
デフォルトの名無しさん :02/08/17 11:24
Jakartaが混乱するjava世界のゆるやかなベクトルになってるよう。 Schemeでも、こんなのをつくるってどうよ。もちろん、一つに収斂 させるんじゃなくってね。 賛同してよん。
やだ
732 :
デフォルトの名無しさん :02/08/17 18:15
>>730 インドネシアの首都ジャカルタ
が、どうしたって?
サムイネタでageんなよ…
734 :
デフォルトの名無しさん :02/08/17 18:25
ジャカルタはカルタの進化した形
735 :
デフォルトの名無しさん :02/08/18 04:16
evalんじゃねえ!
736 :
デフォルトの名無しさん :02/08/18 04:54
eqんじゃねえ!
>>713 こちらは Meadow だけど、 .emacs で
(setq scheme-program-name "C:/cygwin/bin/gosh.exe -i")
みたいに -i をつけるとうまく動くよ。
一つお伺いしたいことがございます。 このスレで何回か話題に上っている SECDR-scheme というものを拝見したいのですが、検索しても 発見できません。 よろしかったらお教え願えませんでしょうか。 お願いします。
739 :
デフォルトの名無しさん :02/08/20 17:35
>>738 以前、niftyのFPLにありました。
たしかインターネットからでもダウンロード可能だと思います。
>>739 さん
お教えいただきありがとうございます。
>以前、niftyのFPLにありました。
>たしかインターネットからでもダウンロード可能だと思います。
もしかして、niftyの会員にならないとダウンロードは不可能
ということはございませんか。
ttp://www.nifty.ne.jp/forum/fpl/ には以前伺ったことがございましたが、どうしても発見できませんでした。
折角お教え頂きましたのに、ご好意を無為にするようなことを
書き込んでしまい、すみません。
(define (kar pair) (apply (lambda (x . y) x) pair)) (define (kdr pair) (apply (lambda (x . y) y) pair)) > (kar '(1 2)) 1 > (kdr '(1 2)) (2)
>>741 (define (kons x y)
`(,x . ,y))
>>741 ほう! car, cdr はプリミティブ手続きではなくライブラリ手続きだったのか。
consもか・・・なるほどなるほど。そんなこと思い付きもしなかったな。凄い凄い。
746 :
デフォルトの名無しさん :02/08/21 02:39
龠 λλλλλ....サザエサーンハ ユカイダナー
748 :
デフォルトの名無しさん :02/08/21 20:25
749 :
デフォルトの名無しさん :02/08/23 07:45
lisp使って自動プログラミングさせたりとかやってる人いません? 要件入れると適当なコードが出てくる様なやつ。 そこまですごいことはできないのかな。
自動プログラミングって何?
つーか自動プログラミングなら要件なんか入れないで自分で考えるだろ。
guile-emacsってどうやってmakeするのさ…
753 :
デフォルトの名無しさん :02/08/24 13:09
guile-emacsの、作者に聞け
754 :
デフォルトの名無しさん :02/08/24 14:55
Schemeなんて時代遅れ。これからはRubyだね。
755 :
デフォルトの名無しさん :02/08/24 15:47
lispとschemeってどこが違うの?schemeはlispの方言っていわれてるけど。 たぶん、そんな話題既出だと思うけど。 で、schemeだとdr schemeやGaucheなどの処理系あるけど、lispの場合、 どんな処理系があるの?windowsでcommon lispの処理系ってあるの?
clisp
Alleglo Common Lispもなかったっけ
758 :
デフォルトの名無しさん :02/08/24 16:44
じゃあunixのlisp処理系はナニがある?
アレグロ馬鹿高いので、だめぽ
760 :
デフォルトの名無しさん :02/08/24 16:53
フリーが(・∀・)イイ!!
762 :
デフォルトの名無しさん :02/08/25 00:20
cmuclマンセー
764 :
デフォルトの名無しさん :02/08/25 01:28
Franz Lisp
765 :
デフォルトの名無しさん :02/08/25 01:30
gcl clisp
>>766 「日本人覚醒計画」もいいですね。
( ゚д゚) < 日本人が嫌いだ。
768 :
デフォルトの名無しさん :02/08/25 13:16
common lispっつーのは何?結局処理系なの?
769 :
デフォルトの名無しさん :02/08/25 13:26
sbclは?
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/#continuation (define-syntax while
(syntax-rules ()
((while test break continue body1 body2 ...)
(block break
(let loop ()
(cond (test
(block continue
body1 body2 ...)
(loop))))))))
上のページにあった break continue 付きの while マクロを改造して break
と continue を引数で渡さなくてもいいようなマクロを define-syntax で書
くにはどうするんですか? define-macro だったら
(define-macro (while2 test . body)
`(block break
(let _loop ()
(cond (,test
,@body
(_loop))))))
でいいと思うんですが。(gensym してないので手抜き)
;; block は上のページに載っているマクロです。
あ、すみません。何も考えずにコードのっけちゃいました。 上のやつは例の URL にあるやつそのままなので、そのサイトのやつを見てく ださい。 あ、while2 とかなってるし…。それと下のマクロですが break のことしか考 えてなかったの忘れてました。break しかできません。
773 :
デフォルトの名無しさん :02/08/25 16:05
continue/break付きwhileは過去ログにあるよ
>>773 すみません、過去ログ調べてませんでした。
Part1 にある define-macro で書いてあるやつですよね。
define-syntax と syntax-rules では break のようなキーワードを使うマク
ロをどう書くんだろうと思って、cond のマクロ定義などを参考に考えていた
んですが分からなかったので質問したんですが。syntax-rules は難しいです
ね。define-syntax 使う人はあまりいなんでしょうか?
>>771 R4RSの低水準マクロの例に載ってる loop-until-exit を改造すればいーんじゃない?
>>774 syntax-rulesでは無理です。シンボルは呼び出し側から入力しないと、衝突を回避するために改名されちまいます。
>>776 そうなんですか。cond の else みたいに syntax-rules の引数に渡せばでき
るのかと思ってました。
できないんであればおとなしく define-macro を使うことにします。
>>777 else は束縛されてないから・・・
let の変数リストや lambda の引数リストでレキシカルに束縛すると、それを参照する識別子とトップレベルを参照する自由な識別子は別物になってしまうのです。
・・・・gensymって何?
780 :
デフォルトの名無しさん :02/08/26 05:40
ユニークなシンボルを生成するんだよ、ぼけ。
781 :
デフォルトの名無しさん :02/08/26 13:00
syntax-rule/case使いこなしてる人いる? なんかどう見てもdefine-macroのが簡単なんだが・・・ rule/caseのアドバンテージって、インテリジェントな シンボル衝突回避ぐらいでしょ?
define-macro を調べてて疑問に思いました。 とりあえず実用価値のない簡単な例ですが・・・ (define foo (lambda () 1)) (define-macro bar (lambda (x) (foo))) これで (bar) とか書けば 1 に置換されるんですよね? つーことは define-macro のマクロ展開って、実行時に毎回やるんでしょうか?コンパイル時に1度だけではなくて。 えーと、つまり、コンパイル時に展開しようとすると、foo はまだ代入されてなくて、評価出来ないということになりません? foo は定数だと見破って定数伝搬最適化かければいいんでしょうけど、だったらこういう例は・・・ (define x (read)) (define foo (if x (lambda () 1) (lambda () 2))) read が行われるのは当然実行時だから、それまで foo は定まらない → コンパイル時には展開できない → 実行時に展開ということになるのですけれど、理解あってます?
>>782 ;; 間違ってるかもしれないのであまり信用しないでちょ…
実際に実行してみましたか?この場合 bar は引数を 1個要求するのでは?
で、compile のできる処理系では多分 compile 時に macro 展開しますが、
(bar #f) ;; とか書いてあるところを
(foo) ;; という形に書き替えるだけなので、
その時点で foo が定義されていようといまいと問答無用に展開するのではな
いでしょうか?
> 実際に実行してみましたか?この場合 bar は引数を 1個要求するのでは? あー、うー、ええと、ご指摘通り、実際には実行してみてません。間違ってるかも。 手元に define-macro の使える処理系がちょっと無くて・・・gaucheなら使える?入れてみよかな・・・ あのコードはその場の思いつきで書いたので適当です。言いたいことが伝われば。 自作の処理系に実装するのに、どういう形にするのがいいかなと考えてるです(まぁコンパイルといってもバイトコードです)。 ・・・今思い付いた。Lisp の defmacro も調べてみよ。
>>782 実はそれがdefine-macroの暗黒面なのです。
コンパイルパスと実行パスが分離している場合、macro transformer内からは
実行時の束縛を参照してはいけないのです。
しかし、トップレベルフォームを逐次実行してゆく実装のインタプリタなら、
コンパイラがそのマクロを展開する時点で既に定義されている実行時束縛が
参照できてしまうので、782のような例は通ります (展開は、マクロ呼び出し
barを含むフォームがコンパイルされるときに一回だけ行われます)。
R5RSのsyntax-rulesはそういうこと(コンパイル時評価と実行時評価の混合)
ができないようになってるんで、そういう意味では「正しい」のですが、
その制限がきつすぎると感じる時もあります。
インタプリタでの動作とコンパイル時の動作を合わせることに心血を注いだ
CommonLispでは、eval-whenフォームを使ってどのフェーズでフォームが
実行されるか明示するのが普通ですかね。
Scheme界ではこの問題はもう20年くらい議論してて決着がついていない
んじゃないでしょうか。(だから標準のモジュールシステムが決まらない…)
今度のICFPでもそのへんを扱った論文が出ます。
http://www.cs.utah.edu/plt/publications/macromod.pdf
786 :
お願いします :02/08/27 08:57
すみません。Schemeで 微分のプログラムを考えているのですが、全然分かりません。 <内容> 3x^2+2x+1を '(1 2 3)と入力して、 答えの 6x+2を (2 6) と出力したいのです。 Schemeを勉強し始めたのは良いのですが、 微分について考えろといわれ、わけがわからなくなってしまいました。 フィボナッチとか、ハノイの塔は理解できたのですが・・・。 くだらない質問ですみません。参考にしたいのでソースを下さい・・・。
SICP のどっかにあったよ。
>>787 探しているんですが、全然見つかりません。
微分って「Differentiation」で良いですよね?
>>786 SICP2.3.2か?日本語版だと簡単に索引から見つかったが。
SICPと違う入力形式を望んでいるようだが、その入力形式だと
carの 1 を見てもそれが係数が 1 であることしか分からず、
本当に知りたい ^2 の部分の情報はリストの終端まで見て長さを知るまで
分からないのでややこしいのでは?
入力仕様を変えるか、入力はそのままで内部で '((1 2) (2 1) (3 0)) などに
変換しておくかした方がいいのでは。
790 :
デフォルトの名無しさん :02/08/27 10:36
微分は分かるのか? '(1 3 5 7 11)→'(3 10 21 44)睨めばすぐわかるだろ?
>>786 Common Lispでよければ。
(defun differential (x)
(nreverse (maplist #'(lambda (x) (* (car x) (length x))) (reverse (cdr x)))))
後半誤解でした。すみませぬ。
皆さん、ありがとうございます。
先ほどから考えてはいるのですが、中々解決しません。
ですが、SICPなどで調べながら、何とかやってみます。
>>790 微分の問題などは苦手ですが、
一応、概念は分かっているので何とかなると思います。
>>789 入力形式も変えてやってみたいと思います。確かに不便そうなので・・・。
>>791 ありがとうございます。参考にさせていただきます。
たびたびすみません。 「SICP2.3.2」の例題をを実行したいのですが、 (deriv exp var)にどのように入力すれば実行できるのでしょうか?
>>794 宿題スレじゃね─ぞ! (゚Д゚)ゴルァ
2.3.2を全部読むと載ってますよ。
(deriv '(* x y) 'x)
とか。
# 英語版辛そう。がんがってください
>>795 >>792
>>797 いや、それが書いてある通りに(deriv '(* x y) 'x)
とか入力しても、動かないんです。
reference to undefined identifier: variable?
と言われます。
DrSchemeを使ってるんですが・・・。
宿題スレじゃないけど、lisp独習者の助けや自分の勉強にもなるだろうと 思って答えてるが、このレベルの質問はこれで最後ね。 典型的な 教えて君 的質問をされたので。 だから、2.3.2を全部読んでから来てくれ。SICPってそういう本なの。 いわゆるトップダウン方式の開発だから、下位の手続きが実装されるまで 実行できません。 > reference to undefined identifier: variable? これも読めないのに英語版読むとは。日本語版買ったら? defineされてない識別子 variable? への参照がある、って意味ね。
>>800 すみません。出直してきます。
ありがとうございました。
こんなのでしょ。 だれか末尾再帰になおして。 (define (deriv f) (define (loop f n) (cond ((null? f) '()) ((= n 0) (loop (cdr f) 1)) (else (cons (* (car f) n) (loop (cdr f) (+ n 1)))))) (loop f 0)) > (deriv '(1 2 3)) (2 6)
803 :
デフォルトの名無しさん :02/08/27 23:01
>>802 ホレ
(define (deriv f)
(define (loop f n r)
(cond ((null? f) (reverse r))
((= n 0) (loop (cdr f) 1 r))
(else (loop (cdr f) (+ n 1) (cons (* (car f) n) r)))))
(loop f 0 '()))
これぐらい自分でできる様になれよ
ちなみにおれは5秒で変換できた。
804 :
デフォルトの名無しさん :02/08/27 23:06
ちなみに動作確認含めて30秒 まあ、自慢にはならないか。(/・ω・\)ショボーン
805 :
デフォルトの名無しさん :02/08/27 23:11
現役schemerならコンマ秒で変換できるだろうな。 宇宙刑事の蒸着並。
変数名を考えるのに 5 分以上かかった。
できなくてスマン。
808 :
デフォルトの名無しさん :02/08/27 23:41
>>807 そう落ちこむな。
末尾再帰変換はある程度パターンがあるから
そのうち一条寺烈にもなれるよ。
809 :
デフォルトの名無しさん :02/08/28 01:51
car とcdrってどう読むの?カーとシーディーアールでいい?
802 -> 803 のような変換は簡単だけど 意図が分かりにくくなるように感じて 自動的にやってくれないかなあと思うことがあります。 そんなことないですか?
申し訳ないので他のやり方で作ってみました。 (define (deriv f) (let loop ((f (cdr f)) (r '())) (cond ((null? f) (reverse r)) (else (loop (map (lambda (x) (+ x x)) (cdr f)) (cons (car f) r))))))
>812 微分になってないよ。 (define (deriv f) (do ((f (cdr f) (cdr f)) (g (cdr f) (cdr (map + f g))) (r '() (cons (car g) r))) ((null? f) (reverse r))))
814 :
デフォルトの名無しさん :02/08/28 16:20
scheme理解するのに微分積分って知ってる必要ありますか?
たぶんありません。
>>814 一般常識としては理解する必要あります。
817 :
デフォルトの名無しさん :02/08/28 16:29
関数言語っていうだけで、f(x)みたいなのはしらないとできないんですよね? いや、当方shcmeってあんまり何か知らないんですが。そもそも関数型言語って なにか知らないから。f(x)みたいなことですか?関数型言語って
「f(x)みたいなこと」とは何を指してるのか?
>>818 まあそういうなや。
>>817 は工房とかかもしれんし。
手続き型言語を教える前に関数型言語を教えろって話もあるくらいだし……。
だけど、厨房工房(あるいは文系)向きのscheme入門書ってあるかな?
複素数や関数を例題として使ったりしないヤツ。
そういうのは関数型の魅力が伝わらないから難しいかな。
Schemeにおとといから参戦しました。よろしこ。 現在、おそらく初心者のだれもがつまづく(それとも俺だけ?) 「評価」を勉強中。 リストのボックス表記ってぱずるみたいでおもろいです。
Scheme で「(f x) みたいなこと」を覚えました。 やる気と普通の脳味噌があればできる。
823 :
デフォルトの名無しさん :02/08/28 23:28
リアル厨房です
>>820 入門書としていいのはscheme手習いでしょうね。ってもう絶版?
リスト遊びはどうかな。elispだけど。
827 :
デフォルトの名無しさん :02/08/30 00:22
>>825 つーかさ、そう言うときは図書館利用しろよ。
入門書ならなおさら。絶版でも結構置いてあるよ。
828 :
デフォルトの名無しさん :02/08/30 12:50
がんばって読んでみるよ。 SICPはどこまで読んだかわからなくなったし。
831 :
デフォルトの名無しさん :02/08/31 08:40
>>828 ソレ16ページしかないよぉ。
全部は読めないの?
821にてカキコしたものです。 現在、森北出版の「Schemeによる記号処理入門」にて勉強しておるのですが、 p39のスタックの説明でつまずいております。 ぽっぷの説明で、 (define (pop) (cond ((null? *stack*) 'empty) (else ((lambda (x) (set! x (car *stack*)) (set! *stack* (cdr *stack*)) x) '() )))) これで変数 x がunboundであるというErrorがでます。 (CheSchemeを使用) 確かに、xは未定義ですよね。 みなさんだったらどのようにpopの実現をおこないます?
>>832 やりたい事が良く分かんないけど…こんな感じ?
(define (pop)
(if (null? *stack*) 'empty
(let ((x (car *stack*)))
(set! *stack* (cdr *stack*))
x)))
>>832 でもいいように思うけど・・・
局所変数はset!で変えられないの?
(define (pop)
(if (null? *stack*) 'empty
((lambda (x) (set! *stack* (cdr x)) (car x)) *stack*)))
もうひとつ*stack*は消せたか。 (define (pop) (let ((x *stack*)) (cond ((null? x) 'empty) (else (set! *stack* (cdr x)) (car x)))))
833さん、834さんどうもありがとうございます。 834さん、これだと思うとおりにうごきました。ありがとうございます。 >832でもいいように思うけど・・・ それがErrorがでるんですよ、SCMでもためしてみたんですが... 833さん、および834さんの835での回答ですが、 Letはまだ学習していない項目ですので、 そこをみてからためさせていただきます。 とりあえず先に礼をいいます。ありがとうございました。
>>836 うちのSCMだと832でうまくいったよ。
なんでだろうねえ。
う、漏れのうちまちがいか?? だとしたら、おお騒がせのおおばかもんか?おれ。
839 :
デフォルトの名無しさん :02/09/02 12:01
'cons'の語源って、もしかしてconcentrationですか? あ、でも綴りが違う。
>>831 How to design programsを読むなら、
http://www.htdp.org/ から。
>>828 のは、論文か何か。内容は、
SICPは、色々な問題、プログラム、概念について書いてあるけど、
問題に対してどのようにプログラムを作っていけば良いのかについては
書かれていない。
SICPで扱われている問題の多くは数学や工学の特定の領域の知識が必要なので、
初学者はプログラムの事より数学とかの部分に時間を使わなければならない。
で、プログラムの問題と特定領域の知識の話をごっちゃにしてしまう。
みたいな感じかな。
842 :
デフォルトの名無しさん :02/09/02 13:24
>>841 そこがSICPの面白いところだと思うが、それが邪魔なことも確かにあるわな。
"How to design programs"もよく出来てるな〜。
constructでしたか。 ありがとうございました。
844 :
デフォルトの名無しさん :02/09/03 00:35
lispで一行野郎ってないよな 例えばコマンドラインから-eで引数文字列を評価することにして、 lisp.exe -e "((lambda 〜)....)" < hoge.txt とかさ できなくはないんだろうけど、括弧とキーワードだけでかなり取られるし
845 :
デフォルトの名無しさん :02/09/03 00:37
Lispで使い捨てのプログラムを作らない。
>>844 one linerが書き易い言語は、規模の大きなプログラミングには
向かない傾向があるんじゃないだろうか。AwkとかPerlとか。
847 :
デフォルトの名無しさん :02/09/03 12:09
Gauche 0.6.2 age
848 :
デフォルトの名無しさん :02/09/03 20:10
schemeってなんでクソ長い名前の関数ばっかりなの? string-refとか良く使いそうなのまで長いよ。 だれか短い名前考えて
(define strcpy string-copy) (define strlen string-length) (define strcat string-append) こんなんでどう?
(define sr string-ref)
エディタで補完できれば問題なし
>>849 C言語かよ!
でもいいねそれ。
>>850 srじゃわけわかんねえよ
だいいちstring-set!はどすんだよ・・・ss!かよ!
strref
strset!
・・・も、いいやこれで。
>>851 補完つっても、区別できるまでの入力は必要でしょ?
長い名前は生産性を落としてる気がするのよ。
↓他に考えた名前。
with-input-from-file -> wiff
with-output-to-file -> wotf
substring -> substr
lambda -> la
define -> de
define-macro -> dm
わ、切れてるよ・・・ ↓他に考えた名前。 with-input-from-file -> wiff with-output-to-file -> wotf substring -> substr lambda -> la define -> de define-macro -> dm
続き begin -> seq display -> disp newline -> eol write-char -> putc read-char -> getc (display ...)(newline) -> (puts ...) (la()...) -> (la0 ...)
続き char=? -> ch= char-ci=? -> ci= integer->char -> i2c list->string -> l2s number->string -> n2s いちいち矢印書くのはめんどい。 ネタ切れ。
>>855 それね、実際やるとバグだかなんなんだか
わかんなくなるよ。(eval改造して実験済み)
最後。 単純に名前置き換えしただけだと、 あとでre-defineされたときに別扱いになってしまうので そういう可能性のある関数名は次のマクロで別名定義する。 (SLIBのtranscriptなどは入出力系関数の上書きを行う為) (dm (alias . l) `(de (,(car l) . args) (apply ,(cadr l) args))) (alias disp display) ; -> (de disp(la args(apply display args)))と同じ (alias eol newline) (alias getc read-char) (alias putc write-char)
859 :
デフォルトの名無しさん :02/09/03 22:07
>>852-854 ええとね・・・いい加減、暗号じみてるから、やめたほうが・・・・
la とか de とか dm とか意味わからん。
>>858 toplevel で define するんじゃなくて、 local に置き換えた方が便利そう。
名前がどんどん長くなってくのは、文脈とかの概念が使えないからだと思うし…
全体でやられると、本当に暗号になるからね…
名前空間が、もっと色々いじれたらいいんだけど…
>>860 昔懐かしウィルオ・リスプはde,dmだったよ。たしか。
863 :
デフォルトの名無しさん :02/09/03 23:08
つきつめるとTECOになるわな そんでTECOでLispの処理系とかかいてください
いっそのこと、全部中置記法にして、文字セットも独自にして 記号をいっぱい増やして重ねうちとかできるようにすれば....
866 :
デフォルトの名無しさん :02/09/04 03:26
Alleglo Common Lispってお値段はいくらぐらいなんですか? 使ってる人います?
お値段は7桁中程です
くだらないレスしかつかなくて悲しいよ
870 :
デフォルトの名無しさん :02/09/05 02:16
>お値段は7桁中程です マジですか!! 会社でも買えないっすよ。 そりゃLISPが広まらないわけだ・・・
(define (広める たくさんの人 Lisp) (if (>= お値段 7桁中程) '広まらない (begin (広める 隣の人 Lisp) (広める (- たくさんの人 隣の人) Lisp))))
www.schemers.org がいつもと違うのは何で?
874 :
デフォルトの名無しさん :02/09/05 14:05
使ったこと無いんでわからないんですが、 括弧の対応関係を表示できるエディタって、'#\('みたいなエスケープされた物 もちゃんと考慮されるんでしょうか?
ものによるんじゃない。
↑そんな解答だれにでもできると思う
877 :
デフォルトの名無しさん :02/09/05 15:33
>>874 xyzzy0.2.2.227のLispモードは考慮してくれますた。
gvim(vim6.1.41)のは不完全ですた。
色はちゃんと付けてくれるものの、
対応する括弧へのカーソル移動の挙動が不審ですた。
いつの間にか gauche-0.6.2-1 の deb がある。(゚д゚)ウマー
879 :
デフォルトの名無しさん :02/09/05 16:17
今一番活発なのはGaucheの作者かな
gaucheの.debってinfoがdirに登録される? 登録されない時ってどうすればいい?
>>881 install-info(1)でどう?
883 :
デフォルトの名無しさん :02/09/05 22:22
SCMのソース解析してるサイト(↑にあった)見てて思ったんだけど、 結構有名な処理系(Guileも)なのに多少無茶なリストを読ませると ガベコレの段階で落ちるっぽいね。これはソースからの推測だけど、 スタックオーバーフローを起こす可能性が残ってる。 スタックレスなgc作るのって大変かな?
884 :
非似lisper :02/09/07 00:59
>>883 スタックレスにするのはそんなに難しくないよ。
昔、仕事用にスタックレスなgc作った。
ヒープ側のメモリ枯渇以外では止まることは無いと思う・・・多分。
組みこみ用途の全天候型lispなんで、ハード的なスタックはほとんど使わない作り。
gc時にメモリ消費するのは多少ナンセンスなんで、その辺どうするか迷ったね・・・。
885 :
デフォルトの名無しさん :02/09/07 13:05
文字列をリストにする関数って、何でしょうか?下の最後に 「2」を出したいんですが。 ------------------------------------------- (define s "(1 2 3 4 5)) (define l (文字列をリストにする s)) (cadr l) => 2 ------------------------------------------- (string->list)だと、ひと文字づつのリストになるんですね。Gauche を使ってます。
>>885 文字列は文字の列だから、listにすれば文字のリストになるのが
自然だわな。
入力が常に「数値のリストの文字列表現」であると想定できるなら
(define l (read-from-string "(1 2 3 4 5)"))
(cadr l) => 2
887 :
デフォルトの名無しさん :02/09/07 14:33
>>886 ありがとう!
(read-from-string)、完璧です。
>>886 (de(read-from-string s)(wifs s(read)))
;with-input-from-string --> wifs
(read-from-string s)よりも、(wifs s(read))の方が短い。
わかるか?
あ、感じ悪い書き方。 すまん。
ちなみに (dm (wifs s . body) `(with-input-from-string ,s(la0 ,@body)))
gosh> (de(read-from-string s)(wifs s(read))) *** ERROR: unbound variable: s Stack Trace: _______________________________________ 0 (read-from-string s) At line 1 of "(stdin)" gosh> (dm (wifs s . body) `(with-input-from-string ,s(la0 ,@body))) *** ERROR: unbound variable: s Stack Trace: _______________________________________ 0 (wifs s . body) At line 4 of "(stdin)"
>>888 > (read-from-string s)よりも、(wifs s(read))の方が短い。
(rfs s)の方が短い。
わかるか?
あ、感じ(略
俺言語は自分の世界に引き込もって使え。
あ、感じ悪い書き方。すまん。
896 :
デフォルトの名無しさん :02/09/08 19:45
>(sizeof 'RECT) =>16 >(sizeof 'RECT 'left) =>4 >(typeof 'RECT) =>(RECT (LONG left) (LONG top) (LONG right) (LONG bottom)) >(typeof 'RECT 'left) =>(LONG 4) >(offsetof 'RECT 'top) =>4 こういうのあったら便利だと思うけど、どう?
そもそも 'RECT って何さ。
RECT = 長方形としても
>>896 はとっても意味不明なんですけど。
シンボルの使い方とか間違ってるんだな。とりあえず。 それはいいとしても名前が意味不明。長さを示すのか座標を示すのか分からない。 お望みのコードを書いてやろうとして詰まった(藁 ;;↓SICPっぽいかな? ;(rect-S '(2 4 8 7))とかやると(2,4)と(8,7)を頂点とする長方形の面積が出ます (define rect-x1 car) (define rect-y1 cadr) (define rect-x2 caddr) (define rect-y2 cadddr) (define (rect-width rect) (- (rect-x2 rect) (rect-x1 rect))) (define (rect-height rect) (- (rect-y2 rect) (rect-y1 rect))) (define (rect-S rect) (* (rect-width rect) (rect-height rect)))
>>900 ネタ? どうやったらそんな勘違いができるのか・・・
どう見たって
>>896 は構造体の情報を得るものだろ。
903 :
デフォルトの名無しさん :02/09/09 10:11
>>901 趣味:2ch 特技:煽り
ですか? ちょっとCを知ってるからって何をやってるんだか。
>>902 バイナリファイルやAPIとのアクセスがスムーズなものが欲しいんじゃないかな。
自分も欲しいので考えているんだが・・・・・・はて?
scheme で perl のハッシュみたいなのを実現するには どうしたらいいんでしょうか。 (hash-set! ハッシュ名 キー 値) (hash-get ハッシュ名 キー) リストやベクタを使ったオブジェクトは思いつくんですが、 要素数に制限が無く、常に良いオーダでアクセスできるものは 簡単に作れるのでしょうか。
906 :
デフォルトの名無しさん :02/09/09 12:32
>>896 ですが、windowsのRECT構造体の事です。
schemeの文字列(というかmemory型)でboxing/unboxingみたいなこと
やってるんで、ああいう型データベースみたいなの作ったら
便利じゃないかなー、と思ったわけです。
なんで、
>>900 さんの提示されたのとは目的がちょっと違います。
今アクセサとミューテタも自動で作れないかなーと考えております。
907 :
デフォルトの名無しさん :02/09/09 12:41
>>905 シンボルのhash値を取れる処理系ならhash表は用意されてる筈だし、
vectorとlistを組み合わせればチェイン法のhash表ぐらいは
簡単に作れると思いますけど。
常に良いオーダーでアクセスしたいなら、一定数超えた時点で
表を拡張してrehashするしかないと思いますよ。
>>905 slibにSchemeオンリーの実装がなかったっけ。
909 :
デフォルトの名無しさん :02/09/09 12:59
>>896 ですが、補足すると
(define (sizeof . types) ...) ;型のサイズを返す
(define (typeof . types) ...) ;型の構造を返す
(define (offsetof . types) ...) ;型メンバまでのオフセットを返す
みたいな関数を考えています。typesには型名、メンバ名のリストが入ります。
バウンダリなどの計算は関数内で行います。
型を記述したa-listなテーブルをグローバルに置いて、
これを参照/拡張していきます。
(define *types*
'((LONG 4)
(RECT (LONG left)(LONG top)(LONG right)(LONG bottom))))
今のところ配列の良い表記が思いつきません。
(WIN32_FIND_DATAとかLOGFONTなど)
>>904 >バイナリファイルやAPIとのアクセスがスムーズなものが欲しいんじゃないかな。
まさにその事です。
910 :
デフォルトの名無しさん :02/09/09 13:12
905にまず必要なのは一般的なアルゴリズムの知識だと思われ
911 :
デフォルトの名無しさん :02/09/09 17:17
aga
912 :
デフォルトの名無しさん :02/09/09 17:18
mazi de hayai desu ne
>>909 とりあえず、Common Lispの型を調べてみれ
型名とシンボル、型指定子、配列、and/orが良い立脚点になると思われ。
CLtL, Common Lisp the Language, 2nd Edition
4. Type Specifiers
それに、
2.15. Overlap, Inclusion, and Disjointness of Types
19. Structures
8.1.4. Integrating Types and Classes
もね〜。
> 型を記述したa-listなテーブルをグローバルに置いて、
型オブジェクトを作るのがすっきりすると思うがの〜。
916 :
デフォルトの名無しさん :02/09/10 01:46
組み込み Lisp萌え!
>>884 Javaとか載っけるやつもいるんだから Lispのっててもいいじゃねえか!
とうちの会社のやつを洗脳したい気分。
でもどんなかんじの仕事? そんなに時間制約が厳しいのじゃないよね..
LispOSをMachのOSサーバーとして実装しようと 息巻いてたScottさん、あれから元気にされてますか?
保守age
保守
保守
保守
保守
'メンテ
ホシュ
hos
ホモ
hosyu
ほおう
dag
あ
ほ
か
龠 λλλλλ....サザエサーンハ ユカイダナー
LISP サイキョー
保守
うひひ最下層・・
Move 1 from a to c ! Move 2 from a to b ! Move 1 from c to b ! Move 3 from a to c ! Move 1 from b to a ! Move 2 from b to c ! Move 1 from a to c ! Move 4 from a to b ! Move 1 from c to b ! Move 2 from c to a ! Move 1 from b to a ! Move 3 from c to b ! Move 1 from a to c ! Move 2 from a to b ! Move 1 from c to b !
文法知ってるだけでプログラムが書けるんですか。凄い才能ですね。
らむだっちゃ
940 :
デフォルトの名無しさん :02/12/08 02:15
ん、まだdat落ちしてないのか。
942 :
デフォルトの名無しさん :02/12/20 17:23
終了 Pert 6へ ==============================================
↑誤誘導
ybb?
宮崎はスーパーハカーのお友達がいるからこんなことしなくても関係ないだろ。
>匿名性が失われたら もう2ちゃんねるは疑似匿名掲示板です。
特に問題ないっしょ。会社からとかでも
950 :
デフォルトの名無しさん :03/01/09 14:39
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
pc3にも入れてくれ
言 い た い こ と も 言 え な い こ ん な イ ン タ ー ネ ッ ト じ ゃ
> ハイエナ共の92%が鳥なので マジすか。 仕事始めいってきます。
悪いこと書かないから関係ないよ
うぐぁ〜
IP記録しようがしまいがしったこっちゃねえ! 俺は言う! 俺 は 無 職 で 童 貞 だ
えっと、無知で突っ込みを入れられるのを覚悟で。。 IPの記録が抑止にもなるなら、削除系の板のリモホ表示をやめて みるのはどうでしょう。 依頼者のホストを削除板以外の板に晒されることもないでしょうし。
つーかマジでいい加減に白よ もう遅いし去るけど 「全然君達」わかってないね。 本当にわかっていないね。公安の中にスパイがいて話を聞いてるとは思えん(おき楽すぎて) シャレにならない件とかあるから 管理人氏 色々と ログ等協議を願います。 キャッシュ、か。現金(謎 つーかもういいよ 何故か俺自身理解出来てないけど 本当に何故か皆さんが ぼくを変に気になっている訳だろ。場合によっては天下の大マスコミ様までが。 以前から云ってる通り「早く」カタギしないとまずい。出来たら話だけ聞いて下さい
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
管理費用が倍に増えちゃったのね
逆にヤケになった馬鹿共が大暴れしたら、それはそれで面白い。 そういう祭りキボンヌ
ぬんちゃく、か、、、
2chが出来た当初なら大問題になっただろうけど これだけ一般化しちゃうと問題ではなくなるのかもな アングラな雰囲気は無くなったし、普通に利用する分にはIP記録されても困らん
IPで個人情報が引き出せると思っている厨房を発見しますた
11 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:16 ID:rLfxQ17l 全レスです。
2ちゃんねるも現実ですよ。
びっくらこいた
タイーホか、そうか・・・ 今のうちにエロ画像デリートしよう・・・ 冷蔵庫のプリン食べよう。 もう、思い残す事は、ない・・・
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
何度も訴えられたらたまらんからだろ
>>マジレス(^_^;) ◆1Inrkvo4AY そろそろ スルーして良いか? お前ら("まともな2ちゃんのみんな"だっけ?)が 世界を制覇するのを楽しみにしてるよ!がんばってくれ!!
(^^)
↑逆夢だね。。。