5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

LISP Scheme Part5

1 :デフォルトの名無しさん:02/06/03 17:11
過去スレ
Part1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/test/read.cgi/tech/1002584344/
Part3: http://pc.2ch.net/test/read.cgi/tech/1008220265/
Part4: http://pc.2ch.net/test/read.cgi/tech/1016211619/
関連リンクは>>2-10あたり

2 :デフォルトの名無しさん:02/06/03 17:11
□参考リンク□

日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。

Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。

慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html

Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)

Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど

John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。

お隣りのプログラマ板のLISPスレのログです。
http://mentai.2ch.net/prog/kako/963/963134110.html


3 :デフォルトの名無しさん:02/06/03 17:12
□仕様書関係□

Common Lisp the Language, 2nd Edition(英語)
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
CommonLispの仕様書です。

アルゴリズム言語Schemeに関する第五改訂報告書 R5RS(日本語)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj_toc.html
http://www.biwa.ne.jp/~mmura/scheme/tspl.html#r5rs
日本語訳はここ以外にもあるそうです。

Scheme Requests for Implementation SRFI (英語)
http://srfi.schemers.org/

Scheme Frequently Asked Questions (英語)
http://www.schemers.org/Documents/FAQ/


4 :デフォルトの名無しさん:02/06/03 17:12
□SICP関係□

SICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。

計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/

SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/


5 :デフォルトの名無しさん:02/06/03 17:12
□その他□

Schemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html

幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める

各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/

Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系

Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装


6 :デフォルトの名無しさん:02/06/03 17:56
http://mitpress.mit.edu/sicp/psets/ps4hnd/readme.html
の使い方教えてください。

7 :デフォルトの名無しさん:02/06/04 06:10
Scheme 処理系に追加( Scheme 処理系を自作したい人向け)。

Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz

TinyScheme: Minischeme の発展版
http://tinyscheme.sourceforge.net/

KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/

LispMe: Palm 上で動く Scheme 処理系
http://www.lispme.de/lispme/

前スレ 364 参照。

8 :Lisp使いの名無しさん:02/06/04 10:23
スレたてお疲れ様です>1


9 :デフォルトの名無しさん :02/06/04 17:17
>>1
お疲れ〜〜

10 :1:02/06/04 23:41
結局別アカウントで立ててきました。
いつのまにか5スレ目突入です。

11 :デフォルトの名無しさん:02/06/05 01:13
SchemeのコードからJavaVMのアセンブリ言語を出力するコンパイラがあれば
誰かしら喜ぶかなぁ?

12 :デフォルトの名無しさん:02/06/05 01:50
>>11
つーか、kawaで検索かも。

13 :Lisp使いの名無しさん:02/06/05 02:18
kawaって言うとJEmacsとか言うのがついてくるけど、
使い方キボンヌ。


14 :11:02/06/05 02:57
うっ,既にあるのか….
自分で開発するのも楽しそうだと思ったのだが,
まぁ利用させてもらおうっと.

15 :デフォルトの名無しさん:02/06/05 12:36
竹内郁雄が、月刊 ASCII 6月号の対談で、
(ガイ・スティールが)「何か記憶に残るプログラムを
書いたかというと、どうもピンと来ない。」

って言ってるけど、そうなの?



16 :デフォルトの名無しさん:02/06/05 21:27
Lisp で複数人開発ってした事ないんだけど、誰かいますか?
なんか感じた事があれば教えてプリーズ。


17 :デフォルトの名無しさん:02/06/05 21:49
>>16
car, cdr を使うか first, rest を使うかでもめたことがあります

18 :16:02/06/05 23:10
>>17
ありがとう。わかりやすいテーマですね...


19 :デフォルトの名無しさん:02/06/06 00:22
>>17
>first, rest
これ使ってる人いるの?

20 :デフォルトの名無しさん:02/06/06 00:43
>>18
ごめん、ちゃちゃだね。

とりあえず、複数人での開発とういう観点では、
ダイナミックスコープであることを意識しておかないとひどい目に
会うことがある、というかひどい目にあったことがあります。
それと、属性リストは使わないほうがよいと思います。パッケージ
を分けていない場合、複数の人が使ったときに破綻してしまうし、
ソースコード上わかりにくいので。

21 :デフォルトの名無しさん:02/06/06 00:55
お前ら的にこのコードは読んでおけ!というSchemeソースを紹介してください

22 :16:02/06/06 01:06
>>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
>>15
RABBITってScheme compilerは、Steeleの作。
最低限のprimitiveにprogram変換しといてからってやつ。

http://citeseer.nj.nec.com/context/1162426/0
こういう評価。古典だな。

25 :デフォルトの名無しさん:02/06/06 17:49
Debianでapt-get upgradeしたらDrSchemeがカコヨクなてたsage



26 :デフォルトの名無しさん:02/06/06 21:22
apt-cache search しても DrSchemeなんてないYO!

27 :デフォルトの名無しさん:02/06/07 07:02
>>26
potatoだとない。woody/sidには入ってる。

28 :16:02/06/07 22:39
>>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

31 :デフォルトの名無しさん:02/06/11 21:29
>>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って構造体が無いの?
全部リストにしていたけど,今更ながら違和感を覚えた.

33 :デフォルトの名無しさん:02/06/12 04:25
>>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

35 :34:02/06/12 06:40
しまった、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
Internet Draft
http://theory.lcs.mit.edu/~rivest/sexp.txt
Expire してるけど、S式好きとしてはなるほどと思う。
世の中ぜんぶS式になっちゃえ!アヒャ

38 :デフォルトの名無しさん:02/06/12 19:33
>>32
ちょっと大きなシステムを組む時は、構造体っぽいwrapperがあったほうが
圧倒的に便利と思われ。
ポータビリティ重視ならSRFI-9か。
http://srfi.schemers.org/srfi-9/srfi-9.html


39 :デフォルトの名無しさん:02/06/12 20:33
>> 31
> :: を使えば private な領域にアクセスできてしまうのが
> 困ると言えば困りませんか?

非常時以外はそういうことをしない、というルールを
徹底できれば…

モジュール間のインタフェースを摺り合わせつつ開発してて、
別モジュールのあれは非公開だけど使ったらインタフェースが
すっきりするんじゃないか、と思い付いた時に、わざわざその
モジュールに公開してもらう前に試せる、というのが便利なんですよね。

建前では「そんなことはケシカラン」のですが、「本当にそのように
インタフェースを変更することが有効か」を検証するためには
一度組んでみなければならない場合もあるわけで。
iterativeに開発してて、明日デモらなくちゃならんとかいう
追い込みの時は特に…

そういう意味では実にハック向けの言語ですね。

デモが終ったらそういうハックを忘れてそのままにしてしまう
危険はありますが。


40 :デフォルトの名無しさん:02/06/13 06:30
>>38
リンク見れないんですが。

41 :デフォルトの名無しさん:02/06/13 06:56
>>36
named-letはinternal-defineやletrecと同じ扱いなので、
その例では末尾再帰です。

42 :デフォルトの名無しさん:02/06/13 10:03
JavaとLISPって相性良さそうだね。
ガーベジコレクションを意識する必要ないだけで、かなり。

43 :デフォルトの名無しさん:02/06/13 20:41
>>42
もちょっと詳しい解説きぼん

44 :デフォルトの名無しさん:02/06/13 22:47
>>3
Common Lisp の仕様書としては、いわゆる HyperSpec
http://www.xanalys.com/software_tools/reference/HyperSpec/Front/index.htm
のほうが正規のものだとおもいます。


45 :デフォルトの名無しさん:02/06/13 22:52
妙に c がおおいc なぁco2-→-c3   -o2       
                        


46 :デフォルトの名無しさん:02/06/13 23:05
>>42
意識する必要のあるGC萌え


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の国際規格があるらしいけど、実質的に放置プレイ
されていることも知っています。


48 :デフォルトの名無しさん:02/06/13 23:33
僕は脳味噌の記憶容量が少ないので、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 さんがいろいろ昔話をするのを読んだりして、その当時の雰囲気を察しています。当然一方的になるのは承知ですので、カンウンター情報希望。)


50 :48:02/06/14 00:22
>>49
他人の定義した関数を調べるよりも、自分でササッと書いてしまった方が
楽な場合が多いので、あえて Common Lisp を使う気になれないんです。
もし多くの処理系で動作する事が最重要課題のひとつであるならば、
Common Lisp を使いますよ。

あとは、Scheme の proper tail recursion の存在が非常に大きいです。
全ての Common Lisp 処理系でこれが使えたら、Common Lisp を選んで
いたと思います。


51 :デフォルトの名無しさん:02/06/14 00:25
>>44
「正規」どういう意味?
こっちがX3J13で採用されたんだっけ?

>>49
CLtL読んだ?
Common Lisp誕生については、共立のbitのバックナンバーも読んでね。
竹内さんがCommon Lispのヤな所を書いた記事もあったはず。

俺はCommon LispはCLOS以外忘れた。

52 :デフォルトの名無しさん:02/06/14 00:25
>>11
亀レスだが、biglooもどうぞ。

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初心者です。)



54 :デフォルトの名無しさん:02/06/14 00:39

Arc   

55 :48:02/06/14 00:49
>>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って、なんかちがうの?

69 :67:02/06/14 15:09
すんまそ。67では両方とも同じ意味で書きました。ANSIは組織のおおもと。
X3J13はANSIという組織にあるCommon Lispの規格を決める委員会だとおもう。

70 :デフォルトの名無しさん:02/06/15 01:03
70ゲットオォズザ

71 :デフォルトの名無しさん:02/06/15 01:10
>>70
志を高く持て

72 :70:02/06/15 01:12
Part4 に書き込んでる人がいたので、あんなことやりました。

73 :デフォルトの名無しさん:02/06/15 11:59
comp.lang.scheme で話題になってる問題。

(call/cc (lambda (c) (0 (c 1)))) => 1

DrScheme だと 1 になって、Guile だとエラーになりました。
これはいかがなものか。


74 :デフォルトの名無しさん:02/06/15 13:23
>>73
オレはそのままでいいと思う。それは揚げ足取りというか、
実際に問題になることはないんじゃねーの?

75 :73:02/06/15 17:25
>>74
たしかに。気にする程の事でもないですね。

ところで Lisp 使いの人って、オブジェクト指向をどう捉えてるんでしょ。
別に激しく議論する程のものでもないと思ってるのかな。
自分はオブジェクトとして扱うと便利かな? と思う時に使う程度。
抽象化の過程で無意識にオブジェクトとして扱っている場合も多いん
でしょうけど。


76 :名無しさん@Emacs:02/06/15 17:30
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.


77 :76:02/06/15 17:37
追加
Scheme の好きなところ
3.コンパイルしなくても末尾再起.

78 :デフォルトの名無しさん:02/06/15 20:01
>>73
評価器の作りの違い。
オペレーターに対しての評価成否をどこで判定してるかの差。


79 :デフォルトの名無しさん:02/06/15 22:14
>>78
しつも〜ん。
> (call/cc (lambda (c) (0 (c 1))))
0なんて関数は(ふつう)定義されていないから、エラーになるという解釈と、
それ以前に引数の評価で continuation を呼び出しいるために1がそのまま返される
という解釈?


80 :デフォルトの名無しさん:02/06/15 23:01
80ゲトズザ

81 :デフォルトの名無しさん:02/06/16 00:07
>>73
4.1.3 Procedure callsにあるように
oprator, oprandの評価順は"in an unspecified order"だから、
Dr.Schemeもguileも仕様通りの実装。
>>73のコードが実装依存なだけと思われ

82 :73:02/06/16 00:20
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) は評価されるべきなのでは?



83 :デフォルトの名無しさん:02/06/16 00:54
>>73
その英文だけから判断すると、0と(c 1)は unspecified な順で、つまりどっちが
先かは処理系に依存する順番にevalされてってことだから、やぱーりエラーになるか
1が返されるかは、処理系依存だろ。0でさえもevalされてから
オペレータオブジェクトみないなものになってから(漏れは scheme 用語知らん)
呼び出される。

84 :83:02/06/16 00:56
ごめん、82を73とまちがえちゃった。

85 :デフォルトの名無しさん:02/06/16 01:01
つーかもしかして「0って数字だからformの先頭にあったらだめですよ」
という罠?


86 :デフォルトの名無しさん:02/06/16 09:37
>>73
これについて、Will Clingerがdenotational semanticsをがしがし
計算して、1を返す(もしくはメモリがあふれる)のが正しいって
いってるんですがサパーリ理解できません。

http://www.ccs.neu.edu/home/will/Personal/Nerdliness/callcc.txt


87 :81:02/06/16 10:46
>>82
いや、Lispと違って、Schemeは、
(f x1 x2 x3 ...)のfもevalされてからapplyするの。

>>86
ああ、7.2 Formal semanticsがおかしいんじゃねーの? って話か。
確かに"runs out of memory"になるsemantics付けはおかしいな〜。
まあ⊥には違いないわけだが(w
どうやったらfixされるかは書いてないね。

88 :82:02/06/16 12:42
>>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)。
お騒がせしました(^^;

92 :ななしLisp@それだけ:02/06/17 01:30
(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
>>95
犬飼さんの「入門Scheme」のPDFバージョンのp.35です。ただし、
このようにコーディングせよと説明している訳ではなく、
set-cdr! set-car! の使用例としてあげられています。
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html

Constant list というのは、'(a b c d) のことですか?
'(a b c d) と (list 'a 'b 'c 'd) は同じと思ってましたが。。


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.''

こりゃいいやね〜。


98 :93=95:02/06/17 10:43
>>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かもしれない



99 :デフォルトの名無しさん:02/06/17 10:53
Scheme で eq? 系のオペレータってどれくらいあるの?
Common Lisp には、eq, eql equal, equalpの4つ。


100 :デフォルトの名無しさん:02/06/17 11:06
>>99
equalpってなんだっけ?
schemeでは
eq? (= eq)
eqv? (= eql)
equal? (= equal)
の3つだけ。
あとはmemq,memv,member/assq,assv,assocみたいに
比較形式毎に関数が用意されてるとか。

101 :デフォルトの名無しさん:02/06/17 11:26
正式な定義は以下をどうぞ。
http://www.xanalys.com/software_tools/reference/HyperSpec/Body/f_equalp.htm
かいつまんでいうと、
数の型は無視して、数の数学的な値で比較。
文字の大文字と小文字を区別しない。
conse, array, structure, hash table などは中身をequalpで比較。


102 :デフォルトの名無しさん:02/06/17 11:30
>>98
回答ありがとうございます。
しかし、98の内容は初学者には恐ろしい事実ですね。リストデータ
は '(a b c d) ではなく、 (list 'a 'b 'c 'd)で作るべきなのでしょ
うか? 少なくとも変更するかが不明な場合には、'(a b c d) は
使わない方がいいと言えますか?

103 :デフォルトの名無しさん:02/06/17 11:38
>>102
そう考えるより、「何だか面倒臭そうだから、破壊的な操作はしないでいいや」
と考えるのがイカス漢の印。



104 :デフォルトの名無しさん:02/06/17 11:43
>>103
了解!
さまざまなWEBページで述べられている”副作用なし”
指向ですね!? これがプログラミングの簡単・高品質化に
どういう効果があるのかが、まだ理解できてません。
勉強します。
どうも、ありがとうございました!!!

105 :デフォルトの名無しさん:02/06/17 21:31
>>104

>>95
> オブジェクトをプログラムの他のデータと共有することもある。
> 破壊的操作をすると思わぬ箇所に影響が出る可能性がある。


106 :デフォルトの名無しさん:02/06/17 23:04
shiro さん 「なんでもλ」「なんでも再帰」の後「なんでも継続」
書いて3部作にするってどっかに書いてたのにな。
早く読みたいなぁ、とか独り言。

107 :デフォルトの名無しさん:02/06/17 23:12
>>105
ハゲシク同位。
「なんでも継続」みてみたい。
イマイチ継続の使い方を知らないからー

108 :デフォルトの名無しさん:02/06/17 23:23
>>107
止めるんだよ。時を。


109 :デフォルトの名無しさん:02/06/17 23:46
マクロと継続を使ったことが未だない…

110 :デフォルトの名無しさん:02/06/17 23:50
こんなのどうよ?ただのパクリだけど。
(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))))))))


111 :デフォルトの名無しさん:02/06/17 23:54
>>110
どっからパクったんだゴラァ!
さしつかえなければ教えてください。


112 :デフォルトの名無しさん:02/06/18 00:00
>>111
ttp://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-1.html
ここです。英語ですが。
「13 Jumps」に継続とかあります。

113 :デフォルトの名無しさん:02/06/18 00:33
どなたか、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
意表をついて、Emacs 上でのなんちゃってCLOS(でもちょっと本気)である
EIEIO の info 。
http://cedet.sourceforge.net/eieio.shtml


117 :さらわれた Common Lisper:02/06/18 21:01
>>115
英語だけど。
Successful Lisp: How to Understand and Use Common Lisp
http://psg.com/~dlamkins/sl/cover.html


118 :デフォルトの名無しさん:02/06/19 00:20
>>114 見て common lisp やりたくなって前スレでおすすめされてた
cmucl の deb を入れてみようとしたんだけど。。。
cmucl cmucl-clm cmucl-normal cmucl-safe cmucl-small cmucl-source
と全部入れても cmucl コマンドないよ。コマンド名が違うの?

119 :さんざんなlisper:02/06/19 00:32
>>118
/usr/bin/lisp



120 :さ、さ...斎藤さ〜んなlisper:02/06/19 00:38
あとcmuclを本格的に使うつもりなら、エディタのEmacs上で使用する
ilisp パッケージも入れた方がよい気がする。
ターミナル画面でマターリ楽しむ木なら、clisp パッケージを入れた
ほうがreadlineライブラリを使っているのでイイ!
って、もしかして以前、とっくに同じ説明がされているという罠。


121 :118:02/06/19 00:59
>>119
あり?公式サイトらしとこには cmucl で起動してるようなのがあったような
気がしたのに。。逝ってきます。
>>120
なるほど。ilisp も入れます。ありがとう。

122 :cmucl マンセー:02/06/19 01:08
cmucl は CMU(カーネギー メロン ユニバーシティー) のちーむが
米軍(じゃなくてDefense of 俺の国みたいな役所)から金を引っ張ってきて、
気合いを入れて書いた処理系なので、現在市販されている 処理系に蚊って
しまっている所もあるエライものです(なぜこんなのがタダ?
そしてpublic domain? ちなみに paul graham がアフォみたいに
金を家政だYohoo関連のものはclispを使っているらしい)。
コンパイラは型情報をかなり積極的に利用したり、もともと数に関する処理
を刺せるつもりだったらしく数値処理も速いらしい。
「lisp なんて(実行速度)遅いよねっ!!」とか
「lisp に代表される動的な型をもつ言語って実行児にならないと
菜にしでかすかわからなくて、コワーイ!!!」
っていう人たちに、「データの型ってのはコンパイル児にかなり予測できる
ものですよ」とか、「型についてもコンパイル児によろうとおもえばチェック
できますYO!」とかを示すのに使われているのを目撃しますた。


123 :115:02/06/19 05:16
>>116,117
サンクスです。
一応googleしてみたのですがなかなかめぼしいものがなかった
(特に日本語は)ので、助かりました。

お二人とも素敵なハンドルでよいですね。


124 :sage:02/06/19 07:52
>>120
私はオートインデントが無いと括弧の数を合わせられないヘタレなんですが、
やっぱりEmacsを使うべきでしょうか?

125 :デフォルトの名無しさん:02/06/19 11:46
>>124 Emacsを使っている人が目立つだけで、他のエディターでもカッコの
面倒をみてくれるやつなら無問題じゃないの。



126 :デフォルトの名無しさん:02/06/19 12:45
質問です。
Schemeで使えるWEBアプリケーションのフレームワークって
ありますか? (ライブラリ?)

願わくば、javaのメッセージ・リソースによる国際化のような
ことができればいいですが。。


127 :デフォルトの名無しさん:02/06/19 12:55
>>126
「新しいLispがPerlと同じくらい良い 文字列ライブラリを備え、
さらにサーバベースのアプリケーションに必要な 強力なライ
ブラリを備えていたら、それは人気が出るんじゃないか。」
ttp://www.shiro.dreamhost.com/scheme/trans/being-popular-j.htmlより


128 :デフォルトの名無しさん:02/06/19 13:17
そして arc http://www.paulgraham.com/arc.html ですか。


129 :125:02/06/19 17:27
はい、そうなんですけど、
leadlineまで使っているclispならコンソールでもそういった事をしてくれるかな、と
……そんなはず無いか。一度使ってみよう。

130 :デフォルトの名無しさん:02/06/19 18:34
>>129
clispのコンソール画面で、()の対応を見せてくれるよ。
)を打った時点で対応する(に一瞬だけカーソルが跳ぶよ。


131 :デフォルトの名無しさん:02/06/20 00:00
ふと思ったんだけど、Common Lisp にはコンパイラがあるのに
Scheme にはないのはなんで? Scheme の場合は C に変換する
っていうのはよく見るんだけど、自前でコンパイルできます、
みたいなのは見たことない。

132 :デフォルトの名無しさん:02/06/20 00:36
Kawaというschemeの処理系は、JavaのVM(virtual machine)に対する
バイトコードを出力するバイトコードコンパイラを備えています。

ネイティブコードコンパイラを備えているschemeがあっても全く不思議ではなく、
また実際に存在するのではないでしょうか。

でも多くの処理系では(独自の)バイトコードにコンパイルするだけで、実用上
問題ないスピードがでるのでそれで良しとしているのではないでしょうか。
それによってコンパイラを含めた処理系の移植性が向上することのほうが嬉しい
のでは?


133 :デフォルトの名無しさん:02/06/20 00:54
あと、どんな処理をさせるかによるでしょうけど、いわゆるスクリプト言語
的な使用をするときは、バイトコードにコンパイルする必要さえない場合もある
だろうし、また、バイトコードにコンパイルしたところで必ずしもスピードアップ
につながるわけではないらしいです(昔はコンパイル後のオブジェクトファイルの
小ささをバイトコードコンパイルの魅力としてとらえている処理系もあったらしい)。

Rubyはたしかインタープリターが構文木みたいソースコードの内部表現を
そのまま解釈(interpret)していると聞きました。そして残念なことにそれを
理由に2chでたたかれたことがあるとか。



134 :デフォルトの名無しさん:02/06/20 01:02
>>122 を見てcmuclすごそう。。と思ったけどclispの方が使いやすそうな気が
してきた。(どうせ難しいことできないし)
あとclispは日本語通るけど、cmuclはだめぽい。日本語通す技があるらしいん
けどNot Foundだった。


135 :デフォルトの名無しさん:02/06/20 01:25
>>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など)
というのも、歴史のある言語の利点でしょうか。




136 :デフォルトの名無しさん:02/06/20 02:16
最近、GCL(GNU Common Lisp)を管理されていた方が、本当の意味で逝ってしまわれた
そうです。真面目にナムーという感じ。たしかMaximaというMathematicaのような
ソフトもあわせて管理していたはず。後継の管理者見つかったんでしょうか?



137 :デフォルトの名無しさん:02/06/20 02:35
>>136
Σ(゚д゚lll)ガーン
ソースどこですか?いや疑ってるわけじゃないんだけど、、、

ところで、便乗質問のスレ違いで申しわけないんですが、
2ch内で maxima について話しているスレって誰か知りませんか?

138 :デフォルトの名無しさん:02/06/20 03:08
>>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は流行らないのでしょうか?

機能的な比較ができる人がいましたら、教えてください。


143 :デフォルトの名無しさん:02/06/20 22:25
>>142
単に一般人が Lisp の良さがわからないだけ。
「みんなが使ってるから」って理由で Java を使ってるんでしょう。


144 :デフォルトの名無しさん:02/06/20 22:41
Lispの会社をやっていたRichard P. Gabrielさんの分析。

デザインの「悪い方がよい」原則 Richard P. Gabriel
http://cl.aist-nara.ac.jp/~daiti-m/text/worse-is-better-ja.html

上記の文書を勝手に漁って友だちに見せてしまった小僧があの
xamacs, netscape の Jamie Zawinski なのがワロタ。

このあと Worse is better サーガに発展。
http://www.dreamsongs.com/WorseIsBetter.html


145 :デフォルトの名無しさん:02/06/21 01:10
>>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 じゃん。




146 :デフォルトの名無しさん:02/06/21 01:41
Javaだけじゃなく,オブジェクト指向はきっちり設計が出来る人なら
後々強力になれるんだが,設計をきっちり出来る技術者が少ないような気がするね.
オブジェクト指向ねぇ…,これってどうなんだろ?
「オブジェクト指向は戦場では必要なし」スレでも見てくるか….

147 :デフォルトの名無しさん:02/06/21 02:47
>>145
> * マクロ
これは膨らまそうとすればいくらでも膨らむでしょう。(Lisp最後の砦というか)



148 :デフォルトの名無しさん:02/06/21 03:04
>>146 厨?


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))))


150 :デフォルトの名無しさん:02/06/21 04:57
>>149
あってる。

151 :デフォルトの名無しさん:02/06/21 09:10
いきいきいきいき、いきちくわ

152 :デフォルトの名無しさん:02/06/21 13:00
何かの処理系がgccやDelphiのように知名度と実績がある処理系になってくれれば
どっかも使ってくれるんじゃない?
ベンダサポートの処理系とかじゃないと,処理系のバグが出たとき困るでしょ.
え? 自社製Scheme? まーそれはそれでいいかと思われ.

153 :LispOS:02/06/21 14:40
>145 LispOS とはコレのことですか?
http://lists.tunes.org/mailman/listinfo/lispos/

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欲すい
広大に一台あったと聞いたが

156 :デフォルトの名無しさん:02/06/21 23:00
何故広大?見たことない

157 :デフォルトの名無しさん:02/06/22 00:53
λ......         λ......       λ......
  λ......            λ......
 λ......      λ......        
        λ......                  λ......
    λ......             λ......
                λ......
 λ......       λ......          λ...... 

158 :142:02/06/22 16:12
>>145
どうもです。

>* bignum (無制限に大きな絶対値の整数を扱える。でもJavaもありそう)
>* ratio (有理数を正確にあつかえる。えーと0.123456を123456/1000000みたいな)
これはライブラリーを作ればどうにでもなりますね。
というか、チューリングマシン=ラムダ計算
ですから
着目すべきは、どういう点が記述しやすいのか?と言う事になると思います。
できる事は結局同じなんですけど。

>* っーか James Gosling って (元) lisper じゃん。
lisperというか、ほとんどの言語についてかなり詳しいです。
JavaはC++の後継と言われていますが、実は複数の言語の複合体なんです。

いまいち、lispとjavaの違いがわかりません。
違いと言うか、メリット、デメリットの事なんですが。

実はschemeをかじった事があるのですが、それを踏まえて言えば
個人的にはオブジェクト指向で設計して、コーディングするのが好きです。

schemeにもオブジェクト指向がありますが、あれはどうなんですかね。
まだ試した事ないのですが。

一方schemeは関数の集合体のような関数を作成する時
デバッグしつつできるので、便利だと思います。

JavaでもJUNITを使えば、それに近い事はできますが
JUNIT<Lispですね。

Lispはフレームワーク(!=モジュール)のような物を作るのには向いてない気がします。

159 :143:02/06/22 16:31
> schemeにもオブジェクト指向がありますが、あれはどうなんですかね。
> まだ試した事ないのですが。

「オブジェクト指向がある」ってのはどういう意味でしょうか?
処理系独自の拡張という意味か、それとも first class closure を使った
素のオブジェクト表現か。自分としては後者でも十分に実用的だと思って
ます。多重継承とかも簡単にできるし。唯一面倒なのは、インタフェース
となる関数を書くことでしょうか。まぁ、マクロを使えば楽になりそう
ですけど。

(object-method obj)


160 :デフォルトの名無しさん:02/06/22 17:10
>>142
Java と Scheme と Common Lisp の機能的な違いという点で、
Java 「おまえらこんな機能あるかゴラァッ!!」
Scheme 「やろうと思えばこんなふうにヴァカみたいに綺麗にできます。」
Common Lisp 「ありますた。というかもっと機能的にぐちゃぐちゃ、ねちょねちょ
したのがあるのでキモイといわれることもあります。」

という感じになってしまうのではないでしょうか。

schemeは知ってらっしゃるということなので、
僕としては Common Lisp そのものか、手軽さという意味で Emacs Lisp
をいじってみることをおすすめします。



161 :デフォルトの名無しさん:02/06/22 17:31
>> 160 あと、オブジェクト指向に興味があるということなので、
このスレでも紹介された eieio を Emacs に入れて遊んでみる
のも一つの手ではないでしょうか?

eieio の作者が言っていたのですが、職場のOOP研修のあとで同僚に
「Emacs Lisp ではあんなことできるはずないよな」といわれて
チャレンジ精神を刺激されて、あれを書いたそうです。

いま、Webページを見にいって驚いたんですが、なんかオブジェクト
ブラウザとかまで付いて僕が最初に見たときより、だんだん発展している
みたいです。





162 :OOP with lisp:02/06/22 18:10
なるほど〜 Lisp ではオブジェクト指向プログラミングのための枠組みは
言語仕様に取り込まれているわけではなくて、
ライブラリ(というか関数群?)として提供されているのですね。

C <==> C++ の関係とはぜんぜん違いますね。なるほど。
あ、cfront みたいなものか…違う気もする…


163 :デフォルトの名無しさん:02/06/22 22:13
>>162
つーか幻の統一言語というか(w

言語の拡張もLispで書く。
MakefileもLispで書く。
DebuggerもLispで書く。
テストもLispで書く(当然その枠組もLisp)。
とうぜんOSもLispで書く。

「Lispみたいな高水準言語でデバイスドライバーが書けるのかよ!」
「書いて金もらってましたが、なにか?」
みたいな会話が comp.lang.lisp で行われています。



164 :162:02/06/22 22:53
Lisp に興味を持って最近 emacs lisp で学習中。
いままで他人の .emacs とかをコピペするだけだったんだけど、
だんだんその内容がわかってきてうれしい。

いままで苦労して書いていたシェルスクリプトも lisp のほうが
書きやすいんじゃぁ…と思い出してきました。

あとは漏れの C 関数群 (てか C++ クラスライブラリ) の *.so が
呼び出せればなぁ、てか、そもそも「リンク」って概念がないのか。
さすがに Emacs 21 の組み込み関数として実装しなおす気にはなれないなぁ。

それわそうと、 Makefile も Lisp で書くってのはマジ??
それって GNU make と同等の動作をする Lisp プログラムがあるよ、ってこと?
それとも make + Makefile でやらせてる動作そのものを lisp でやらせるってこと?

「 Makefile も Lisp で書く 」ために便利なライブラリとかがあるんでしょうか?

165 :デフォルトの名無しさん:02/06/22 23:01
>>162
> それって GNU make と同等の動作をする Lisp プログラムがあるよ、ってこと?
> それとも make + Makefile でやらせてる動作そのものを lisp でやらせるって
> こと?
その中間というか、いわゆる defsystem といえば Lisper の間では通じるらしい
のですが、つまり、Unix の make 相当のLispプログラムがあって、
そんで、Makefile 相当のものは、Lisp で記述するらしいです。

漏れはまだいじったことがありませんが、できるだけ多くの処理系を
サポートするように努力しているオープンソースプロジェクトのdefsystem
もあるらしいです。



166 :デフォルトの名無しさん:02/06/22 23:09
>>164
> あとは漏れの C 関数群 (てか C++ クラスライブラリ) の *.so が
> 呼び出せればなぁ、てか、そもそも「リンク」って概念がないのか。
> さすがに Emacs 21 の組み込み関数として実装しなおす気にはなれないなぁ。
えーと、Emacs 21用が存在するのか分かりませんが、Emacs-dl みたいな
パッチがあって、共有ファイルの動的なロードを可能にするものです。

これがEmacsになんで含まれていないかというと、RMSが嫌がった(理由忘れた)と
いう噂を聞きました。




167 :142:02/06/22 23:24
レスどうもです。

>僕としては 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は糞重いままだ。

170 :デフォルトの名無しさん:02/06/23 01:06
>>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
最初から強い型付き言語でかけばいいじゃん。


172 :デフォルトの名無しさん:02/06/23 01:21
Lisp と Java の話で盛り上がっていますね。
アホな疑問なんですが、Lisp と Java が似ているっていうのは具体的にはど
の辺が似ているのでしょうか?

Java の オブジェクト指向(class)と Lisp の closure でしょうか。まだ勉強
中なのでその辺しか思いつかないんですが、似ていると言うからにはその他に
もいくつかあるのでしょうか?


173 :ななしさん:02/06/23 01:41
>172
似てるとは思わない。スコープだって…

174 :デフォルトの名無しさん:02/06/23 01:51
>>172
GCかな?
Lispの真似してるらしいけど。

>コンピュータは格段に高速化したが、
>未だにJAVAは糞重いままだ。
どこが遅いんだろう・・・・
15年前のスパコンで実行してたシミュレーションが
20個程並列に動くんだが。

175 :デフォルトの名無しさん:02/06/23 02:01
>> どこが遅いんだろう・・・・
どこが遅くないんだろう・・・・

176 :デフォルトの名無しさん:02/06/23 02:04
何処が遅いといわれればAWTとかSwingが遅いんだろう。

177 :デフォルトの名無しさん:02/06/23 02:18
>>172
C++がCにどんどん機能を付け足したのに対して、
Javaは要らない部分を削ってシンプルにしようとした。

CommonLispが古いLispにどんどん機能をつけ足したのに対して
Schemeは要らない部分を削ってシンプルにしようとした。

KISSの精神ってやつ。

178 :ななしさん:02/06/23 02:29
Java = C++--

179 :デフォルトの名無しさん:02/06/23 02:46
>>177
#Javaってバージョン上がるたびに見事に肥大化してると思うが。

180 :デフォルトの名無しさん:02/06/23 03:09
>>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インタプリタって無かったっけ?

184 :デフォルトの名無しさん:02/06/23 09:19
scm

185 :デフォルトの名無しさん:02/06/23 10:12
>>183
普通はできるんじゃ。。?

186 :ななしさん:02/06/23 10:19
Scheme じゃないけど、
#!/usr/bin/emacs -batch
とかもいけたかも…?
いや、試したことないけど。

187 :デフォルトの名無しさん:02/06/23 11:04
>>182
Lispではボトルネックを見つけるのが難しい、ってどっかで聞いた
んだけど、本当?

188 :デフォルトの名無しさん:02/06/23 11:21
>>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もフレームワークだからね。

192 :デフォルトの名無しさん:02/06/24 11:45
C++の作者である Bjarne Stroustrup が、
「Javaの方がすっきりしていていいじゃん」
といわれてムッとして、
「あいつらそのうち絶対にtemplate相当の機能が欲しいとかほざきだすからな
(意訳)」
と言っていたのがワロタ。
ちなみに動的な型をもつ言語では、templateという概念そのものが必要ありません。
というかすでに含まれていると言うか。



193 :デフォルトの名無しさん:02/06/24 12:01
>>192 そんでBjarne StroustrupはLispを知っていながら
C++をデザインしたのでしょうか? そこが結構気になります。
たしか simula とかいうOOの元祖で作者がこのまえなんか賞を
もらった言語がヒントになったというのは聞いたことがあります。



194 :デフォルトの名無しさん:02/06/24 12:07
ちなみにEfectiveSTLのBoostに関する記述の中に
「〜関数オブジェクトを嫌い、関数オブジェクトは、C++プログラマになった
Lisp擁護者の少数意見をなだめるためだけに存在すると考えるなら〜」
なんて一節がある。


195 :デフォルトの名無しさん:02/06/24 12:28
>>194 STLってでも実はBjarne Stroustrupではなくて、
HPかなとかにいて、AdaのGenericな型みたいなのをやっていた人が
オマエC++で同じことヤッテクレ!ということでやったと思ったんですが。

C++とLispという軸に限定して考えれば、静と動というか、
カオスとオーダーみたくなっているけど、別に目標はそんなに
違わないみたいな気がします。そんでそのゴールに似ているけど
実際はちがう Java がでてきたので、オイオイ と突っ込みを入れたく
なる人もいるのではないでしょうか。

でも別に静と動だけが切口なわけではなくて、なんか別にも
軸があるような気がします。

type inference にあるように、日本的な阿吽の呼吸というか、
いわなくても分かる(ことは言うな)みたいなとか。

Prolog みたいな「何が欲しいのか」を言うとか。




196 :デフォルトの名無しさん:02/06/24 12:41
いやもっと言ってしまえば結果から迎えに行くというか。

むかし雑誌で読んだんだけど、数学がすごくよくできる人がいて
高校のときは、なんか問題を見ただけで答えがなんだかわからないけど
頭に浮かぶということを言っておられるのを聞いたことがあります。
漏れはやっぱり数学が得意な人はそんな物かと素直になっとくしてしまったん
ですが、これってもし嘘じゃなければちょっと面白いかなとおもいます。

すいませんデムパッてしまいました。


197 :デフォルトの名無しさん:02/06/24 14:24
templateはあとから実装された物だよね。
javaにはまだgenericsって実装されてないよね。
C#は実装するのかな。

個人的にはjavaにgenerisを組み込む必要性は無いと思うけど、
実装するなら、速く使わせて欲しいな。

ところで、みなさん学生だと思うけど
専攻はなんですか?

198 :デフォルトの名無しさん:02/06/24 14:36
漏れは Common Lisp で一発あてるのを夢見る 単なる書生です。



199 :ななしさん:02/06/24 14:54
漏れは就職先がみつからず果てしなくバイトをやってそうな院生です。

200 :デフォルトの名無しさん:02/06/24 16:12
なんか職が欲しくて、ディスプレイのまえではぁはぁしているみたいに
思われると嫌なので、言いますが。別に就職活動としてこの書き込みを
したわけではありません。
そんで、Common Lisp よりの発言はほとんど俺です。199 さんはすごく
てきせつなアシストをだいたい明け方くらいにしてくれました。

日本の研究者の人たちは 196 みたいなデンパの入った会話を平気でできる
環境にあるのでしょうか。


201 :デフォルトの名無しさん:02/06/24 17:06
>思われると嫌なので、言いますが。別に就職活動としてこの書き込みを
>したわけではありません。
誰もそんな事思わないと思うけど。
誰が書き込んだかなんて気にしてる粘着はめったにいないだろう・・・

>日本の研究者の人たちは 196 みたいなデンパの入った会話を平気でできる
俺は別にデムパだとは思わないけどね。
それより、間違っててもいいから、自分の意見は言ったほうがいいよ。
聞くは一時の恥じみたいな・・・
それよりも、自分の考えをこっそりと自分の中にしまって
俺は理解されないんだとか、俺が正しいんだとか言ってる奴の方が怖いよ。


202 :ななしさん:02/06/24 17:14
>200
をーい、、漏れ、何かアシストしたっけ (^_^;;

203 :デフォルトの名無しさん:02/06/24 17:16
>>201
> それより、間違っててもいいから、自分の意見は言ったほうがいいよ。
> 聞くは一時の恥じみたいな・・・
いやそうなんだけど、一度、デンパだということにされると
あとが面倒くさいというか。

> 俺は理解されないんだとか、俺が正しいんだとか言ってる奴の方が怖いよ。
それを口にだした人に言ってたら対したもんだと逆に思うけど。



204 :デフォルトの名無しさん:02/06/24 17:16
電波なんていって面白がってくれるのは2chだけだからね。
変なのは現実じゃひたすら無視されるだけ。理由がどうであれ、
注目されるってのは大変なこと。その意味で電波だろうが、
なんだろうが自己主張すべし(w

205 :デフォルトの名無しさん:02/06/24 17:23
>>202
おお、わるい。悪い意味でデンパッテしまった。

206 :デフォルトの名無しさん:02/06/24 17:46
しかし、みんななんつーか「とんでもないこと」と(言った本人は後で
知らされる)みたいなことで恥ずかしいとか悔しいことを経験しすぎて
「じゃもう言わない」みたいなのない?


207 :デフォルトの名無しさん:02/06/24 19:46
ま、とりあえず、何が何でもそこそこプロトタイプ的に形になったものを
作って、みんなに見せると、それからだな。



208 :デフォルトの名無しさん:02/06/24 20:23
>「じゃもう言わない」みたいなのない?
そういう経験はした事ないけど、
それって挫折みたいなもんだから、
そういうのを乗り越えて自分の意見をどんどん言わなきゃダメだと思うよ。

209 :デフォルトの名無しさん:02/06/24 20:28
> そういう経験はした事ないけど、
> それって挫折みたいなもんだから、
> そういうのを乗り越えて自分の意見をどんどん言わなきゃダメだと思うよ。
いや馬鹿にされるだけならいいというか、そこで議論が止まっちゃうんだよね。
流行りの言葉(?)でいえばブレインストーミングができないってかんじかな。

「そんなアフォな話ができるか!!」みたいな。



210 :デフォルトの名無しさん:02/06/24 20:59
というわけで、やっぱり何か新しいことを世間に問うつもりなら、
Lispでプロトタイピングをするというのもいいものではないでしょうか。


211 :デフォルトの名無しさん:02/06/24 23:04
>> 201
> それより、間違っててもいいから、自分の意見は言ったほうがいいよ。
> 聞くは一時の恥じみたいな・・・
> それよりも、自分の考えをこっそりと自分の中にしまって
> 俺は理解されないんだとか、俺が正しいんだとか言ってる奴の方が怖いよ。
いや、間違う、間違わないという判断は時の流れで変わってしまうので、
たまたま何かそういう考えかたが「おもしろそう」と頭に浮かんでも、
それをみんなに言うか言わないかというか。

「これを今、言ったらやばいだろう」というような(学問的な)考え(やアイデア)が
あたまに浮かぶことはありませんか?




212 :デフォルトの名無しさん:02/06/24 23:08
>「これを今、言ったらやばいだろう」というような(学問的な)考え(やアイデア)が
>あたまに浮かぶことはありませんか?
言い方を工夫すればいいんじゃない?

上のLISPは流行ってないけど・・・なぜ?
見たいな質問の仕方なら別にいいと思うけど、

LISPってクソだから廃れたね。
って言い方したら、たくさん釣れちゃうわけだから。


213 :デフォルトの名無しさん:02/06/24 23:15
>>212
いやぁ、そうなんだよね。でもたいていそういうときって(自分がおもしろそうな
考えを見つけたと興奮しているから)うわごと見たいなことを口走って
(ウワッ!! こいつアブネッ!)ってことになりがちなんだよね。


214 :デフォルトの名無しさん:02/06/25 00:01
例えば、例えばという話だけど、いまJava関連でガベージコレクション
がまたホットなわだいになっているけど、
たぶんいまは、generational なガベージコレクションがたぶん性能的に
いちばんいいということになっているとおもうけど(JITやHotSpot関連で何かあるか
な)、これを考えかたとして「ガベージコレクションは何もしないのが一番楽だ!」、
みたいに考えたらどうだろう。 いやそれを実現する方法は知らないけど、
IBMのAS400かなみたいなワークステーションはユニバーサルアドレスというか
なんかオブジェクトは一生同じアドレス見たいな考え方があると聞きました。
このとき「ガベージコレクションなんかシネーヨ!!!(もしくはいらないんじゃない?)」と
叫んだらかなり問題あるだろう。



215 :デフォルトの名無しさん:02/06/25 00:24
>>214
プログラムによるんじゃない?
WEBサーバーとかは無理だよね。

216 :デフォルトの名無しさん:02/06/25 00:42
Paul Graham 氏は OnLisp の中で functional programming をとても優れたも
のだと書いているんですが、それが広まらないのは何でですか?

研究には向いているけどビジネスには向いていないとか?それとも単純に書け
る人が少なすぎとかですか?

217 :_:02/06/25 01:36
JavaはSUNという巨大メーカーが命運を賭けてプッシュしてるから安心して
その上でアプリケーションがかける。
lispなんてどこの馬の骨が作ったのか分からないVM上で応用ソフトなんて
誰もつくらない。しかもなんか無駄に色々種類があるね?どーでもいいけど。

結論「覚えても実用的でなさそう」

218 :_:02/06/25 01:42
結局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
>>214
HLISP

221 :デフォルトの名無しさん:02/06/25 07:04
> 存在自体が再帰してしまっている。

誉められたのかと思った。

222 :デフォルトの名無しさん:02/06/25 08:33
>>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とかをいちいち書くのが嫌だな。

226 :ななしさん:02/06/25 20:28
C++ とか Java って関数型でオブジェクト指向ですよね?
んー、関数言語?

227 :デフォルトの名無しさん:02/06/25 20:31
関数型じゃねーだろ

228 :デフォルトの名無しさん:02/06/25 20:47
>>225
なんだか、狭い世界でプログラミングしてるんですね。
って Lisper に言われたくないか。


229 :デフォルトの名無しさん:02/06/25 21:00
>> 219
英語だけど、関数型言語はこ〜んなにオモロ!
という短くてよくできたアジビラみたいなのがwebのどっかにあります。
googleでさがせると思う。





230 :219じゃないけど:02/06/25 21:19
>>229
それだけじゃ探しようがないのでヒントくださいな。
;; アジビラって何?

231 :デフォルトの名無しさん:02/06/25 21:23
アジ:アジテーション
ビラ:ひら「片」の口語強調型

232 :デフォルトの名無しさん:02/06/25 21:25
アジテーション
【agitation】
(1)そそのかすこと。扇動。
(2)社会運動で,演説などによって大衆の感情や情緒にうったえ,大衆の無定形な不満を行動に組織すること。アジ。


233 :デフォルトの名無しさん:02/06/25 21:29
びら

宣伝広告のために、人に配ったり、はり出したりする紙片。ちらし。
「宣伝―」「―をまく」

〔「ひら(片・枚)」の転、擬態語「びらびら」から、などの説がある。近世、演芸の宣伝に用いたのが初めという。大正期に英語 bill の影響で外来語意識が生まれた。現在は多く「ビラ」と書く〕

234 :ななしさん:02/06/25 21:30
http://www.google.com/search?num=50&hl=en&lr=lang_en&ie=UTF-8&oe=UTF8&q=%22functional+programming%22+swf+&btnG=Google+Search
じゃみつからないのかな?

235 ::02/06/25 22:06
>>234 ちなみに。CMUCLをもっといろんな意味で洗練した Common Lisp って
商業的な価値はあるのでしょうか。



236 :ななしさん:02/06/25 22:09
>235 なぜ漏れに…(笑
えーっと、漏れは Emacs Lisp しか使ったこと無いんですよ…スマソ

#そんな漏れでもこのスレにいていいですか?

237 :ななしさん:02/06/25 22:13
あの〜 漏れの 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 pvaneynd@debian.org
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) です。


238 :横れす:02/06/25 22:15
>>235 懐かしい...「夢で遭えたら」に出ていた、タラコ唇の緑さんですね?

239 :ななしさん:02/06/25 22:17
をを、さらに、 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されてるかもしれんが。

241 :デフォルトの名無しさん:02/06/26 01:18
>>237
Debian$ apt-cache search cmucl
Debian$ dpkg -L cmucl

242 :デフォルトの名無しさん:02/06/26 01:51
ネットニューズのfjで活躍しておられる
ある大学教授のかたが現在のコンピュータサイエンスは、
「志さえあれば、すべてを知ることができる学問だ」
とおっしゃられていたのですが、みなさんどう思います?

スレ違いでゴメン。


243 :デフォルトの名無しさん:02/06/26 02:03
そんで、努力してすべてを知ったとしても、
なんつーか、ハードウェアとかCPUに関して
根本的にもっといい仕組みが見付かってしまうと、
(よく知らないけど、量子コンピュータとか、、)
その知識の多くが無駄になってしまう可能性があると。
それでも知らずにおれないというか、、、。



244 :デフォルトの名無しさん:02/06/26 02:08
たとえば、昔のCPUでは整数演算のほうが浮動小数点演算より
異常に高速だったのが、3DゲームのDoomをプログラミングして
その後マイクロソフトですこし仕事してまたIdソフトウェアに
戻ってきた人が言っていたのですが、現在のINTELのCPUでは
じつは浮動小数点のほうがすごく速いということを本に書いています。


245 :ななしさん:02/06/26 02:10
>244 なので整数演算でも浮動小数点演算命令に任せる場合もある。

246 :デフォルトの名無しさん:02/06/26 02:11
>> 245
いやそれってちょっと面白いね。


247 :デフォルトの名無しさん:02/06/26 02:14
LISPを学習しようとおもうのですが
お勧めのLISPはどの奴?

248 :デフォルトの名無しさん:02/06/26 02:16
浮動小数点演算はプロセッササポートがないと並列化が出来ない
OO実行が出来ない
整数へのキャストが高負荷
なので、トータルで劣る場合も多い。

それから、除算に関してはFPUで行った方がたいていの場合
オーバーヘッドを考慮しても高速

249 :デフォルトの名無しさん:02/06/26 02:16
>>247
一番実用になると言う意味ならemacs lisp

250 :ななしさん:02/06/26 02:19
>249 漏れが言おうと思ったのに〜

>247 OS は何? Windows なら Allegro CL とかいいかもしれない。
でも Linux とか UNIX 系の OS なら結局は Emacs でコードを書くことに
なるわけで、結局まずは emacs lisp をいじってみるのがいいんだな。

Windows でも Meadow で emacs lisp をいじることをお勧め(個人的な意見だけどね)

251 :デフォルトの名無しさん:02/06/26 02:23
>> 249 これは経験から言っているのですが、多くの言語(英語や日本語、
中国語、韓国語など、、)が入ったテキストを処理するプログラミング環境と
して現在、Emacsを凌駕する環境はちょっと見付からないのではないでしょ
うか。なぜかみんなエディタが言語に密接にくっついているというだけで、
表現が難しいけど「へたれ」な言語だと思っちゃう人が多いと私は思います。






252 :ななしさん:02/06/26 02:24
Allegro CL
http://www.franz.com/products/

Meadow
http://meadow-faq.sourceforge.net/

Emacs Lisp 関連文書
http://www.gnu.org/manual/emacs-lisp-intro/emacs-lisp-intro.html
http://www.gnu.org/manual/elisp-manual-20-2.5/elisp.html (emacs20用)
http://www.gnu.org/manual/elisp-manual-21-2.8/elisp.html (emacs21用)
http://www.gnu.org/manual/emacs-20.7/emacs.html (emacs20用)
http://www.gnu.org/manual/emacs-21.2/emacs.html (emacs21用)


253 :デフォルトの名無しさん:02/06/26 02:33
>>248
> 浮動小数点演算はプロセッササポートがないと並列化が出来ない
> OO実行が出来ない
このOOってアウトオブオーダーだっけ?

> 整数へのキャストが高負荷
> なので、トータルで劣る場合も多い。
う〜ん、わからん。

> それから、除算に関してはFPUで行った方がたいていの場合
> オーバーヘッドを考慮しても高速
いやこれは面白いね。



254 :デフォルトの名無しさん:02/06/26 02:36
>> 251 いや実はいま、アラビア語を始めようと思っているんだよね。
なんていうか、我々いわゆる(アメリカの手下としての)西側の国にとっての
最後の外国というか、異文化というか。


255 :254:02/06/26 02:49
そんでどうせ外国語やるならなんかとんでもない(たとえばアラビア語)を
やってみろって昔、ちょっと冴えてる友だちに勧められたんだよね。
ついでに「ななしさん」ってなんかその人とは別だけど友だちがどこかで
使っていたハンドルネームだったような。。
(ってみんなこの発言は全部無視してくれ。)



256 :249:02/06/26 04:24
>>251
なんで漏れにレスしたのでしょうか?
全然話のつながりが見えないんですが

257 :デフォルトの名無しさん:02/06/26 04:27
>>249 おお悪い。別にレスとか誰に返事するとか考えてなかったよ。
なんとなく頭に浮かんだことを酔っ払った頭でうわごとみたいに
言ってみただけだ。スマソ。




258 :257:02/06/26 04:39
そんで、こういうのも実生活上けっこう問題になるんだよな。
自分はその話と話の脈略がなんとなくあると思って、(連続した話題)
として話すんだけど、他の人は ポカーン? みたいな。そういうのないか、みんな?



259 :デフォルトの名無しさん:02/06/26 06:40
( ゚д゚)ポカーン

260 :ななしさん:02/06/26 08:58
( ゚д゚)ポカーン

ところでさ、なんかちょっと前に「Lisp はじめる〜」とか言う人がいた気がするんだけどさ、
http://www.glug.org/people/ttn/software/elisp-tutorial/
とかどうよ?だって、GNU の正式なチュートリアルはながいからね。
http://www.gnu.org/manual/emacs-lisp-intro/emacs-lisp-intro.html

とりあえず
http://www.glug.org/people/ttn/software/elisp-tutorial/elisp-tutorial.tar.gz
を展開して、でてくる lesson01.el を Emacs で開いて指示に従って逝けば、
なんか lisp がわかったようなわからないようなきがしてくるとおもうんだけど。

261 :ななしさん:02/06/26 09:00
>260 英語ヘタレな漏れにも読めたんで、quick start としてはいいんでないかい?
                           とか言ってみるテスト。

262 :ななしさん:02/06/26 09:21
ちなみに、 Emacs Lisp ネタは下のスレのほうが参考になるかも

Emacs Lisp
http://pc.2ch.net/test/read.cgi/tech/1004551074/l50

#なんで朝から 2ch にいるんだろ…

263 :デフォルトの名無しさん:02/06/26 11:39
アラビア語は国連の公用語だし,よく研究され学習環境
も整った「金になる」言語ですよ。

264 :ななしさん:02/06/26 11:47
Emacs & 多言語環境の話題は↓がいいんでないかい?
Emacs総合スレ
http://pc.2ch.net/test/read.cgi/linux/1021865124/l50
と誘導してみるテスト。
このスレの住人ってやさしいからさ、誰もいわないみたいなんで。

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になってほしい…



268 :デフォルトの名無しさん:02/06/27 13:38
こうして標準は「RnRS」から「RnRS+SRFI」へと変わってゆくのでした……。

269 :デフォルトの名無しさん:02/06/27 13:54
詳細調べないまま書き込んでスマソなんだけど,
SRFIって手続きやマクロで実現できるものなの?
それとも処理系に手を加えないとダメなものもある?
foldとかはただの手続き群,単一型ベクタは処理系に手を加えなければならない,
といった感じがするのだけど.

270 :267:02/06/27 15:48
>>269
srfiによる。マクロ一つで出来るものもあれば、処理系をいじる必要の
あるものもあり。各srfiのreference implementationの項に注が書いてある。
そのへんの区別も含めて、あんまり厳密なこと言いっこ無しよ、みたいな
ノリなんじゃないかなあ。srfiは。


271 :デフォルトの名無しさん:02/06/27 18:15
いつの間にか(?) gauche が deb化されてる。
でもバージョンが古い。0.4.6 って。。。

272 :デフォルトの名無しさん:02/06/27 19:05
schemeの機能を満たしてて括弧のネストがなければ最高なんだが。

273 :デフォルトの名無しさん:02/06/27 20:48
>>272
括弧に注目してはいけない。Lisp プログラムは字下げで読むのです。
括弧が無いという点では、Python もなかなか良い言語だと思います。
というか、しっかり関数分割された Lisp プログラムは括弧はそれほど
ネストしませんよ。


274 :ななしさん:02/06/27 20:54
>271 うん。漏れ最新版を deb にしてるんだけど、
ドキュメントとかちゃんとまだ書いてなくって未公開。

メンテナさんには 「upstream バージョンあがってまふよ〜 」 って言ってあるんだけど…

275 :デフォルトの名無しさん:02/06/27 22:28
>というか、しっかり関数分割された Lisp プログラムは括弧はそれほど
>ネストしませんよ。
カッコの合計数が増えるという罠


276 :273:02/06/27 23:40
>>275
バレたか。でもまー f(x) がネストするよりは読みやすいと思うけどね。


277 :デフォルトの名無しさん:02/06/27 23:51
lispの括弧が多いってさ、普通の言語と比べて
一番外側の括弧が余分なだけじゃないの?

278 :273:02/06/28 00:05
>>277
それは non-nil かも。他の言語でも、多かれ少なかれ、頭の中で入れ子構造を
展開してるんでしょう。Lisp の場合はそれが形となって表われているだけ
だと思う。


279 :デフォルトの名無しさん:02/06/28 01:24
>>272
そんなあなたに Dylan をすすめる。
http://www.cs.indiana.edu/hyplan/jsobel/forschemers.html

280 :デフォルトの名無しさん:02/06/28 01:29
>>277
一番外側じゃなくて一番外側(プログラム自体)と二番目(一文一文)だと思う。
この二番目が曲者。これが大量にあるおかげで括弧が大幅に増えてる。

281 :デフォルトの名無しさん:02/06/28 01:30
>>279
Dylanは処理系が糞すぎるのが欠点。コンパイル時間がかかりすぎ。
しかもHelloWorldが数メガって・・・

282 :デフォルトの名無しさん:02/06/28 02:24
>>281 Dylanってたした、FunctionalObjectだったかな、
商用のベンダーが存在して、そのエディターはコンパイルしたあとに
どれだけ最適化が行われたか色分けしてくれるらしいよ。
Webのどっかに紹介記事があったと思ったけど。


283 :峯島雄治:02/06/28 05:22
最近、たびたび夜にこの2ちゃんねるに、ばかな書き込みをしておりました、
峯島雄治と申します。どうももしわけありませんでした。



284 :283:02/06/28 05:31
何か言いたいということがあれば、0468 35 8420 までお電話ください。
33歳ヒッキーです。


285 :デフォルトの名無しさん:02/06/28 08:55
なんでこのスレに書き込むんだよう

286 :デフォルトの名無しさん:02/06/29 01:07
>>283
もし251, 257さんであれば早目に病院に行かれた方がよいかと思います…。

287 :ななしさん@お腹いっぱい:02/06/29 06:29
lisp では後置再帰をしばしば使いますが、
C コンパイラでも後置再帰を使うことは有効なのでしょうか?
つまり後置再帰であることを認識してスタックを無駄に消費しないコードをはいてくれる
C コンパイラというのもあるのでしょうか?

288 :ななしさん@お腹いっぱい:02/06/29 07:26
>287 ごめん、tail recursion って末尾再帰っていうんだね…
勝手に訳語作ってた YO 。逝ってきます。

289 :デフォルトの名無しさん:02/06/29 07:53
単純な末尾再帰に限っていえば、最近のC/C++コンパイラは最適化でスタックを積まなくなる。
が最適化オプション次第で挙動が大きく変わるようなコードは推奨されんだろうな。
とりあえず知ってる限りでgccとかVC++あたりは。

290 :デフォルトの名無しさん:02/06/29 08:08
VC++は.NET/6.0ともに末尾再帰の最適化無し

291 :ななしさん@お腹いっぱい:02/06/29 08:14
やぱーり、 Scheme マンセーですか。

292 :273:02/06/29 09:38
Common Lisp の関数を調べるより、Scheme で自分で書いた方が
早くて綺麗だったりする。個人での使用なら速度も十分だし。


293 :デフォルトの名無しさん:02/06/29 09:56
>>292
漏れはまだ本に載ってるような勉強用のコードしか書いたことないんですが、
例えばどんなものを書くときに scheme は便利ですか?

294 :273:02/06/29 10:33
>>293
C で書くと超面倒、でも Perl で書くと先々不安なもの。
あとはメタ言語を作ろうとする時。



295 :sage:02/06/29 10:49
>>292
>Scheme で自分で書いた方が早くて綺麗
実はそれって、言語のポピュラリティという面では
不利なんじゃないかと思う次第。

熟練者は簡単に欲しい関数が書ける
→誰も共通ライブラリみたいなのを作ろうとしない、
あるいはマイライブラリで満足
→初心者はライブラリの少なさにガクゼン。
自分でいちいち書かなくちゃならないのがめんどくさくて挫折。

まあ、srfiなのかな。進むべき方向としては。



296 :295:02/06/29 10:51
>>295
うわ、sageの使いかた間違えたよ。はづかちい。


297 :デフォルトの名無しさん:02/06/29 10:55
Schemeが成熟したらダメだろ。
これ以上複雑化していったら、気軽に作れる物じゃなくなって
実装者が減ってしまう。

298 :デフォルトの名無しさん:02/06/29 12:33
>>294
1行目をもう少し具体的にお願いしまつ。

299 :273:02/06/29 15:23
>>298
扱うデータ構造がネストしているような場合、例えば non-destructive に
再帰的に reverse したいような場合、C だとメモリ確保/解放が面倒です。
Perl でも出来るんですが、ランタイムエラーにならずに処理を進めて
くれちゃったりするので困る事があります。

あとは REPL (read-eval-print loop) の存在が大きいかな。素早く定義
して、素早く動作確認できるのが魅力的。コンパイルする必要もないし。

C, Perl, Scheme を日常的に使いわけているので、「これは Scheme しか
できない!!」ってのを挙げられなくて申しわけないけど。



300 :デフォルトの名無しさん:02/06/29 19:05
>>299
REAL を一瞬パールと読んでしまった。。

>C, Perl, Scheme を日常的に使いわけているので
括弧いいですね。私はまだどれも初心者用の本に載っているようなプログラム
しか書けませんが。どの言語も好きですけどね。もっと修行してきます。

301 :デフォルトの名無しさん:02/06/29 23:10
REPLて略初めて聞いたよ。


302 :デフォルトの名無しさん:02/06/29 23:23
>例えば non-destructive に
>再帰的に reverse したいような場合、
これってどういう意味?

破壊しないで、再起的に、・・・reverseってどういう意味?

303 :デフォルトの名無しさん:02/06/29 23:33
>>302
つーかおれはこの意味もわからんのだが。
>Perl でも出来るんですが、ランタイムエラーにならずに処理を進めて
>くれちゃったりするので困る

304 :273:02/06/29 23:50
>>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 を使うのは
先々不安って言ったんですよ。


305 :303:02/06/30 00:05
>>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))


306 :303:02/06/30 00:09
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;
 }
}

307 :273:02/06/30 00:10
俺版。どっちの方が良いんだろう?

(define (rev tree)
(reverse
(map (lambda (s)
(if (list? s) (rev s) s))
tree)))


308 :デフォルトの名無しさん:02/06/30 00:22
>>299
その「扱うデータ構造」ってのは大抵ファイルとかから取りこむんだよな?
そーするとパーサ書くのが大変な気がするんだが、どうなん?
最初からリストで書かれていればともかく、普通そんなこと無いだろうし、、

309 :303:02/06/30 00:29
>>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))

310 :303:02/06/30 00:32
>>308
パーサというか、トークン化できればどうにでもなると思うよ。

311 :273:02/06/30 00:51
>>309
map-* ってのは結構使えるかも。map-append とか。


312 :273:02/06/30 00:53
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);
}

だよね?

314 :デフォルトの名無しさん:02/06/30 01:00
非破壊って書いてあるだろ

315 :デフォルトの名無しさん:02/06/30 06:39
(define (rev s)
(if (list? s)
(reverse (map rev s))
s))


316 :315:02/06/30 07:25
(define (rev s)
(if (list? s)
(map! rev (reverse s))
s))

reverse! はどう書くの?

317 :273:02/06/30 09:06
どんどん洗練されていく

318 :315:02/06/30 10:31
map! なんてなかった。
(define (map! f s)
(do ((t s (cdr t)))
((null? t) s)
(set-car! t (f (car t)))))
で置き換えて。


319 :srfier:02/06/30 10:54
>>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))


320 :デフォルトの名無しさん:02/06/30 12:53
>>57
>実装上じつは、ループで済んでしまうのでしたぁ!!!!!

Loopとrecueseは、末尾呼びだしのgoto(?)への置き換えという「簡単な」最適化をするだけで
理屈だけじゃなく実装上も等価になるからこそ、Lisperは堂々とrecurseしまくれる。
難しい最適化でもなんでもなく、単純な置換で済む。コストは極めて低い。

詳しいことは、Shiroさんとこの、「なんでも再帰」と「Schemeの実装におけるスタックフレーム」を。

あと、C(の標準的な姿)では末尾再帰の最適化はしにくいかもね。

ただ、一方で、

>>55
>recursion ならスッキリ書けるものをわざわざ汚いループ構文や制御変数を使って

という意見も片手落ち。
rubyみたいに内部ireraterが有れば、十分綺麗だし、
関数に、その関数が終ったら次に続けるべき「なにか」を
渡さなくてもいいので、かえってすっきり。

321 :デフォルトの名無しさん:02/06/30 13:29
>>320
> 関数に、その関数が終ったら次に続けるべき「なにか」を
> 渡さなくてもいいので、かえってすっきり。

これどういう事?


322 :デフォルトの名無しさん:02/06/30 13:40
PLT Scheme v200 あげ。

comp.lang.scheme に流れたアナウンスには

The documentation includes the on-line book:
Dorai Sitaram. "Teach Youself Scheme in Fixnum Days". 2000-2002.
http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html

とあるけど、fixnum days っていわれたって、あなた……。


323 :デフォルトの名無しさん:02/06/30 14:23
>非破壊って書いてあるだろ
そんなのは
list.add(entry[i].clone())
とするだけだろうが。


324 :デフォルトの名無しさん:02/06/30 20:56
LISPの、定義された関数がたくさんのっているサイト
ってありますか?教えてください。

325 :デフォルトの名無しさん:02/06/30 22:10
>>3あたりの仕様書見るとかじゃだめ?

326 :デフォルトの名無しさん:02/06/30 23:40
Common Lisp より先に Scheme をやった方が、綺麗な関数が書けるように
なるかも。後者が綺麗なので前者を学習する気がなくなるという副作用付き。


327 :デフォルトの名無しさん:02/07/01 00:01
common lispが汚いって
どの辺が汚いのかな?

当方schemeオンリー

328 :326:02/07/01 00:22
>>327
Scheme が綺麗なだけ。


329 :デフォルトの名無しさん:02/07/01 00:28
>>320
> あと、C(の標準的な姿)では末尾再帰の最適化はしにくいかもね。

意味がわからん。
容易に、最適化がやりにくいスタイルで書ける、と言うくらいの意味?

330 :gauche 派:02/07/01 00:37
みなさんの好きな scheme 処理系は?

331 :デフォルトの名無しさん:02/07/01 00:37
Dr.

332 :デフォルトの名無しさん:02/07/01 11:41
>>330
Guile。何でもあり風なところが

333 :ななしさん@お腹いっぱい:02/07/01 13:27
>326 漏れ Emacs Lisp しかつかったことないよ〜 \(`д´)/うわぁぁぁん

334 :デフォルトの名無しさん:02/07/01 16:56
>>330
Gaucheがいいです。2バイト文字対応やsrfiに順次対応している
など、scheme本流を意識している点が◎。日本人の作者である点
もいいですよん。
http://www.shiro.dreamhost.com/scheme/index-j.html

335 :デフォルトの名無しさん:02/07/01 21:21
guile かな。mit-scheme にしようとしたけど、Unix システムコールが
見当たらなかったのでやめた。


336 :326:02/07/01 23:48
>>333
御安心ください。私も Emacs Lisp, Scheme, Common Lisp の順番で
学習しましたカラ。Common Lisp は現在進行形。


337 :デフォルトの名無しさん:02/07/01 23:52
SICP 読んでる途中なんだけど>>114さんの紹介に魅かれて Onlisp も読み始め
た。無謀かなぁ? SICP は 4章の後半まで読んで stream って何だっけ?って
なってまた始めから読んでます(汗

338 :ななしさん@お腹いっぱい:02/07/01 23:56
http://www.shiro.dreamhost.com/scheme/gauche/index-j.html
Gauche 0.5.7 あげ。

339 :デフォルトの名無しさん:02/07/02 00:32
(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)

340 :デフォルトの名無しさん:02/07/02 00:38
(define (come! scheme)
(display scheme) (newline)
(for-each (lambda (x) (display x) (display "━━"))
'(キタ (゚∀゚) (∀゚ ) (゚  ) (  ) (  ゚) ( ゚∀) (゚∀゚)))
(display "!!!!!") (newline))


341 :326:02/07/02 01:13
↑プログラミングを楽しむ事が重要である事を示す良い例


342 :デフォルトの名無しさん:02/07/02 07:06
>>339-340
動くやつ書いてちょ

343 :_:02/07/02 09:17
>>324
gaucheでは動いたよ。シンボルに8-bit charを通す処理系なら
動くんじゃない?


344 :デフォルトの名無しさん:02/07/02 11:05
>>343
あ、そういうことじゃなくて、顔が右向きのから左向きのに変わっていく、み
たいなのがあったら面白いかなぁと。

で、自分でやってみようかと思ったけど一回書いた文字を消すのって無理かも
しれないですね。

345 :デフォルトの名無しさん:02/07/02 11:53
>>344
(define (come! scheme)
(for-each (lambda (x) (cls) (display scheme) (newline)
(display "キタ━━") (display x) (display "━━!!!!!") (newline) (wait 10))
'((゚λ゚) (λ゚ ) (゚  ) (  ) (  ゚) ( ゚λ) (゚λ゚))))

こんな感じか?
clsとwaitは誰か定義して。


346 :343:02/07/02 11:57
>>344
あ、そういうことか。
ポータブルに書くのは難しいけど、gaucheならこんな感じでどう?
sys-selectはタイミング調整ね。

(define (come!)
 (for-each (lambda (x) (display x) (display "\r") (flush) (sys-select #f #f #f 200000))
 '((゚∀゚_) (∀゚ ) (゚  ) ( _ ) (  ゚) ( ゚∀) (_゚∀゚)))
(come!)




347 :デフォルトの名無しさん:02/07/02 13:12
>>346
おーすごい!
でも krxvt だと俺のフォント設定(東雲)が悪いせいで目が表示されない(汗
gnome-terminal でちゃんと見れました。

;; 3行目の最後に閉じ括弧 1つ足りないですよね?

348 :デフォルトの名無しさん:02/07/02 21:50
えーと。dynamic-windって、どういう使い方するものなんでしょうか?いまいち謎。

349 :デフォルトの名無しさん:02/07/02 22:00
ttp://www.kt.rim.or.jp/~kbk/guile/guile_23.html

350 :デフォルトの名無しさん:02/07/02 22:30
>>348
open/close を自動化させたい時に便利。call-with-* シリーズを書く場合
なんかにどうぞ。でも、よーく R5RS を読んでみると call-with-* には
向かないのかも知れないけど。


351 :デフォルトの名無しさん:02/07/02 22:33
>>339-349
なにやってんだおまいら!

352 :デフォルトの名無しさん:02/07/02 22:34
>>349
これって thunk のとこの
>(call-with-current-continuation escape)
って scheme 的にはありなの? gauche では
>(escape)
にしないとエラーになったけど。


353 :デフォルトの名無しさん:02/07/03 07:47
>>352
escapeは0個以上の可変長引数を取る手続きのはずだから、
call-with-current-continuationに渡しても問題ないはず。
gaucheのバグじゃない?


354 :デフォルトの名無しさん:02/07/03 09:02
>>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日あれば十分なような・・・



356 :デフォルトの名無しさん:02/07/03 12:55
文法だけなら10分デス

357 :デフォルトの名無しさん:02/07/03 15:38
>>356
それはない。セルとリストの概念だけで数十分はかかる。

358 :デフォルトの名無しさん:02/07/03 15:50
他の言語をやってれば10分で分かるだろ

359 :デフォルトの名無しさん:02/07/03 15:57
どこにでも出きますね。○○言語なんて10分とか言いだすやつ。
どうせ文法知ってるだけのくせに。

360 :デフォルトの名無しさん:02/07/03 18:53
>>357
セルとリストの概念は、文法じゃないんじゃない?


361 :デフォルトの名無しさん:02/07/03 21:03
こういう話題は荒れるだけのような気がしま

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
>どうせ文法知ってるだけのくせに。
それ以外に何が・・・・痛い


365 :336:02/07/04 00:10
文法知ってるだけでプログラムが書けるんですか。凄い才能ですね。


366 :デフォルトの名無しさん:02/07/04 00:23
Cで会話できるよ。

367 :デフォルトの名無しさん:02/07/04 00:24
(´∀`)マターリ

368 :129:02/07/04 04:54
>>130
Danke.
ついでに。
Debianで「ledit」というパッケージになっているツールを使えば、
対応していないソフトでも括弧の対応を取ってくれるようになります。
ただし、行を超えては駄目。

369 :デフォルトの名無しさん:02/07/05 01:34
10分とか言ってる奴も実は数日ぐらいはかけて本読んだりプログラム作ったり
人から教えてもらったりして理解した罠。

370 :デフォルトの名無しさん:02/07/05 01:36
調べながら書くにしても、基本的な道具立ては分かっていないと辛いよね。

371 :ななしさん@お腹いっぱい:02/07/05 09:28
結局、自然言語を覚えるのと同じ過程を踏むんじゃないのかな。
漏れ的には弁証法的スパイラルを昇っていく過程だと思う。

372 :デフォルトの名無しさん:02/07/05 23:25
どなたかCommonLispのdirectory関数の使いかたがのってるURL知りませんか?

373 :デフォルトの名無しさん:02/07/06 00:01
言語は理論じゃない.実践を経て覚えるものさ.…多分.

374 :デフォルトの名無しさん:02/07/06 00:15
>>372
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html


375 :デフォルトの名無しさん:02/07/06 04:19
文法が簡単つっても、
関数の場合は
(演算子 被演算子...)
で説明は済むが、
構文はlambdaやletとか特殊な括弧の使い方するやつが多い。
((lambda args ...) values)
とか。関数シンボルの代わりに関数定義をそのまま書けたりするってのは、
非常に直感的だとは思うけどね。

376 :354:02/07/06 04:36
>>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))

378 :デフォルトの名無しさん:02/07/06 05:59
>>377
ちょっと前にcomp.lang.schemeに投稿されてたsequenceのコードがおもしろかったよ
http://groups.google.com/groups?dq=&hl=ja&lr=&ie=UTF-8&threadm=45e6545c.0206181018.ddb2991%40posting.google.com&prev=/groups%3Fdq%3D%26num%3D25%26hl%3Dja%26lr%3D%26ie%3DUTF-8%26group%3Dcomp.lang.scheme%26start%3D50


379 :336:02/07/06 08:00
>>377
Paul Graham 氏の On Lisp や、SICP が参考になると思います。
前者は Common Lisp ですけど。


380 :デフォルトの名無しさん:02/07/06 08:01
>>377
そのflatはエレガントだねえ。
ちょっと感動した。

381 :デフォルトの名無しさん:02/07/06 08:06
>>377 Winston の Lisp 本かな、漏れが 見たのは。

382 :336:02/07/06 08:20
>>380
たしかに。雑音が全く無い。すばらしい。


383 :デフォルトの名無しさん:02/07/06 08:35
(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 はちょっと邪道かな。でも便利だし

384 :デフォルトの名無しさん:02/07/06 09:51
(素の)schemeではファイルを消すことができないと読んだのですが、例えば
「無」を書きこむことでファイルを消す、みたいなことはできるのでしょうか?
それともR5RSの範囲ではどうやっても無理なんですか?R5RS+SRFIならできる
とか?

385 :デフォルトの名無しさん:02/07/06 10:39
すでに存在するファイルに書き込むときの挙動は未規定だった気がします(上書きするかもしれないし追記するかもしれない?)

386 :無名λ式:02/07/06 13:19
>>377
関数型言語だけど、
`Monads for functional programming'
http://www.research.avayalabs.com/user/wadler/papers/marktoberdorf/marktoberdorf.ps.gz
のparserは面白い。


387 :デフォルトの名無しさん:02/07/06 14:29
values とかいう手続きが返す多値って、リストやベクタとは違うの?別物?何の必要によって?

388 :デフォルトの名無しさん:02/07/06 14:45
>>387
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%c2%bf%c3%cd


389 :デフォルトの名無しさん:02/07/06 14:59
>>387
assocなんて、多値だったら嬉しくねぇ?
(成功or不成功, 見つかった値)

Cのfopen(3)なんかだと、pointerの0が「不成功」の役割を担ってるよねぇ。
無理やり二つの型を圧縮してるから、0の意味が分かりにくくなっているわけだ。

ただ、assocを多値にするとsetfはいやーんなままだねぇ。


390 :デフォルトの名無しさん:02/07/06 15:09
>>388
さんくす。参考にしま・・・。

391 :デフォルトの名無しさん:02/07/06 15:50
>>389
やっぱり、 list でも大して変わらない気がする…
>>388 の、関数の戻り値を直接他の関数に渡す、って云う使い方は魅力だけど…
普通の list でそう云う事をしたい気がするな…
Lisp だし。

392 :682:02/07/06 17:16
MIT Scheme で複数の式を
いっぺんに評価するにはどうすればよいでしょうか?

393 :初心者λ:02/07/06 18:09
(define (set-xy)
(begin
(define x 1)
(define x 2)) )

(set-xy)

を評価しても

x ; Unbound variable : x
y ; Unboune variable : y
となってしまいます.
どこがいけないんでしょうか

394 :初心者λ:02/07/06 18:11
>393

(define (set-xy)
(begin
(define x 1)
(define y 2)) )
の間違えでした

395 :デフォルトの名無しさん:02/07/06 18:29
>>393
set-xyの中で define した x と y は set-xy の中だけだから。

396 :デフォルトの名無しさん:02/07/06 18:34
>>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))


397 :デフォルトの名無しさん:02/07/06 19:04
R5RS の letrec の定義をトレースしてみると面白いね


398 :初心者λ:02/07/06 19:08
>>393 >>394
ありがとうございました

399 :デフォルトの名無しさん:02/07/06 23:33
scheme (gauche) で less もどきを作っているんですが、space キーが押され
た瞬間に次のページを表示させるためにはどうしたらいいですか?
read-char は enter が入力されるまで待っているので少し希望と違うんです
が。


400 :デフォルトの名無しさん:02/07/06 23:53
>>399
言語の選択を誤っているような。


401 :デフォルトの名無しさん:02/07/07 00:03
>>400
C じゃないと無理ですかね?勉強用にはとりあえず Unix コマンドもどきを作
るのが定番かなと思ったので。「もどき」なのである程度のもので我慢するこ
とにします。

402 :377:02/07/07 01:39
>>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))

403 :デフォルトの名無しさん:02/07/07 03:53
>>399
enterを待っているのはread-charではなく、システムの端末ドライバでしょう。
gauche.termiosモジュールに端末コントロールの関数がひととおり揃って
いるので、lessの間だけ入力をraw modeに切替えてみては。
エラー時に端末のモードを戻すのを忘れずに。

ちなみにtermiosへのインターフェースを持っているSchemeはけっこう
多いますよ。

>>400
言語の問題じゃなくてライブラリの問題ですな。わかります?


404 :400:02/07/07 09:57
>>403
言語とライブラリは一心同体。gauche に充実した termios インタフェースが
あるなら話は別ですけど。


405 :399:02/07/07 10:22
>>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))

406 :デフォルトの名無しさん:02/07/07 10:31
>>404
君、言語とライブラリーの仕様の区別ついてないだけじゃなくて、
さらに実装も混同してるんだね…Jesus!

407 :400:02/07/07 11:38
>>406
楽しそうですね。


408 :デフォルトの名無しさん:02/07/07 21:51
windowsなら、kernel32.dllから適当な関数持ってきて叩けばいいと思うけど、
unixだとどうなるのかな。

ってもう解決した感じだね。

409 :399:02/07/07 23:35
>>408
Unix(Linux) の場合は端末ドライバのモードを変えてやればいいようです。C
FAQ の 19章にそのまんま載っていて、gauche でもほぼ同じ方法を使えました。
試していないけど cygwin 使えばそのままできそうですね。

でも標準入力を less もどきに渡すとエラーになるんですよね。読み込むデー
タも標準入力、キーボードからの入力も標準入力なのでだめなんでしょうね。
難しいなぁ。


410 :デフォルトの名無しさん:02/07/08 01:01
>>409
stdinを使わずに/dev/ttyを開いてみれば?

411 :399:02/07/08 06:47
>>410
おー、素晴しい。ビンゴです。
キーボードからの入力を /dev/tty から受け取るようにしたらうまくいきました。

412 : ◆SChEMeHI :02/07/09 10:23
どう?

413 :デフォルトの名無しさん:02/07/09 10:25
なにが?

414 :デフォルトの名無しさん:02/07/09 10:51
412 : ◆SChEMeHI :02/07/09 10:23

415 :デフォルトの名無しさん:02/07/09 11:31
>>414
(・∀・)スゴク イイ!


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の例書き直しちゃったよ。

418 :デフォルトの名無しさん:02/07/10 23:52
Lisp について調べてると、なにかと Paul 氏が出てきますね。
やっぱ成功したせい?


419 :デフォルトの名無しさん:02/07/11 10:00
>>418
何を成功させたんですか?

420 :デフォルトの名無しさん:02/07/11 18:04
>>419
商売。
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
を参照。

421 :デフォルトの名無しさん:02/07/11 19:30
ほとんど関係ないんだけど、安西先生いま塾長なのね。ちょっとびっくり。
あの本は高校の図書室にあった。読まなかったけど。

422 :名無しさん@Vim%Chalice:02/07/11 23:38
みんなこれ知ってる?
ttp://www.laplata.ne.jp/javalisp/

423 :デフォルトの名無しさん:02/07/12 00:04
何でこのサイトには改行がないんだ。
俺の Mozilla が悪いのか?
読みづらいったらありゃしない。

424 :デフォルトの名無しさん:02/07/12 00:28
IEも同じ。

425 :デフォルトの名無しさん:02/07/12 10:17
原稿料いくらもらったのかなー

426 :デフォルトの名無しさん:02/07/12 17:54
塾長ってどっかの塾?

427 :デフォルトの名無しさん:02/07/12 18:15
慶応義塾

428 :デフォルトの名無しさん:02/07/12 23:55
ワシが男塾塾長(略

429 :デフォルトの名無しさん:02/07/14 02:49
LISPで作られたWebブラウザって無いの?

430 :デフォルトの名無しさん:02/07/14 08:56
>>429
Emacs/W3


431 :デフォルトの名無しさん:02/07/14 11:12
Common Lisp で文字列と数の相互変換をしたいんですけど、適当な関数が
みあたりません。Scheme でいう string->number, number->string のような
関数があればと思うんですけど、他になんか定石があるんでしょうか?


432 :431:02/07/14 11:28
read-from-string で出来ました。お騒がせしました。


433 :デフォルトの名無しさん:02/07/14 21:22
R4RSに書いてある低水準マクロ。syntax-rulesじゃない方のやつ。
あんな説明じゃ解らない。
syntaxって何。quote の構文的な相当物って意味わからんし
identifierってシンボルと違うの??
誰か教えて・・・

434 :デフォルトの名無しさん:02/07/15 02:48
>>433
>syntax-rulesじゃない方
ってなに?
define-macro?
syntax-case?
おれはdefine-macroしか知らん。

435 :デフォルトの名無しさん:02/07/15 05:29
>>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。


436 :デフォルトの名無しさん:02/07/15 22:54
Lisper の皆様は、自分の作ったプログラムが「ステップ数」だけで
評価されたらどうしますか? まぁ、そんな企業にいないだろうけど。


437 :デフォルトの名無しさん:02/07/16 02:50
ttp://home.adelphi.edu/~sbloch/class/272/scheme.shtml

438 :デフォルトの名無しさん:02/07/16 03:06
>>436
括弧の数で評価するように働きかける

439 :デフォルトの名無しさん:02/07/16 03:13
>>436
そもそも「ステップ数」の定義って何?

440 :デフォルトの名無しさん:02/07/16 03:19
>>438
(・∀・)イイ!!

441 :デフォルトの名無しさん:02/07/16 03:23
>>438
S式中の括弧を増やすテクを教えてください。

442 : :02/07/16 03:53
>>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 :デフォルトの名無しさん:02/07/16 04:13
>>444
っていうかそれ、ふつーなのかよ。

446 :デフォルトの名無しさん:02/07/16 06:07
>>445
inline-expand & macro-expandでの公開は、結構普通みたいです。
LISPの利点の1つかも。

447 :デフォルトの名無しさん:02/07/16 06:21
>>446
フランジャーのほうが良い。

448 :デフォルトの名無しさん:02/07/16 06:26
>>447
2段オチだとしても、
つまんないし、わかりにくいよ

449 :デフォルトの名無しさん:02/07/16 06:32
>>441
>'(a b c d e)
>==> '(a . (b . (c . (d . (e . ())))))
こういうpretty-print作ってくれ



450 :436:02/07/16 06:48
>>439
微妙です。それも是非議論したいです。
プログラム全体をパースして、それで得られる Lisp オブジェクトの総数
とか。駄目?


451 :デフォルトの名無しさん:02/07/16 06:54
関数呼び出しの数とか、
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処理系ない?

455 :452:02/07/16 20:43
>>453
write ですね。

456 :デフォルトの名無しさん:02/07/16 21:10
>>454
DrScheme じゃだめ?

457 :433:02/07/16 21:48
>>435
さんくす!R4RS眺めつつ、実際に試しつつ、だんだん理解出来てきた気がする!

でもまだちょっと
(bound-identifier=? (generate-identifier 'x) (generate-identifier 'x)) => #f
これよくわからん。 'x を指定する意味は何。

・・・ところでsyntax-caseって?

458 :454:02/07/16 23:53
>>456
ダメじゃダメじゃ。
あんな不細工なの使ってるのあっちの学生ぐらいだよ!
センスなさすぎ。
ちうか、日本人が作ってくれんかのう?英語チンプンカンプンなので。エヘ。
それとemacs勢のやつらは、emacs使いすぎ!
独立しろよー、この大馬鹿モン供があ!
IPAはイパーイ金出すぞー

459 :454:02/07/16 23:56
ちうわけで、今細々と作ってます。
ああめんどっちい

460 :デフォルトの名無しさん:02/07/17 00:05
IDE って必要ですか? 具体的にどんな機能を期待するわけ?


461 :デフォルトの名無しさん:02/07/17 00:14
>>460
そうきたか。

>IDE って必要ですか?
馬鹿か、おめえは!
そんぐらい自分で判断しろや。ギギ

とりあえずフォームにテキストボックスやらボタンとか貼っつけて、
括弧書きながらあーだこーだ悩みたいですなあ!
ちうか、日本語対応してる独立したリソースエディタって何で無いの?
へんなクズばっか。もういや。

462 :460:02/07/17 00:19
> とりあえずフォームにテキストボックスやらボタンとか貼っつけて、
> 括弧書きながらあーだこーだ悩みたいですなあ!

そんなの、メタ言語を作れば良いんじゃないの?


463 :デフォルトの名無しさん:02/07/17 00:19
>へんなクズばっか。もういや。
禿げしく同意。

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
ダメ人間かも。


469 :デフォルトの名無しさん:02/07/17 01:55
>>467
だめ、
     (for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r)))))
の内側にある方が末尾再帰じゃない。

470 :デフォルトの名無しさん:02/07/17 01:57
>>452>>467
末尾再帰版誰か書いて。

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)))))

なんだか無駄な気がしますが。

472 :デフォルトの名無しさん:02/07/17 02:18
>>471
ちがーーう。
そんなんでOKなら、なんでも末尾再帰に出来ちゃうでしょ。

末尾再帰は本質的にはループと一緒なの。
ループで書けないものは末尾再帰で書けない。

まあ、スタック使えば不可能ではないけどエレガントさ 20pt ダウンくらい。

473 :デフォルトの名無しさん:02/07/17 02:35
car側再帰、cdr側末尾再帰になってるから、listを処理するなら>>467で充分
なんじゃないかな。
car側が深すぎて再帰だとマズーな場合は>>472が言ってるように泥臭く書く事
になるだろうけど。


474 :デフォルトの名無しさん:02/07/17 02:41
(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))))


475 :467:02/07/17 03:10
>>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)))))

要は、処理系が末尾再帰と認識して、ループに変換して
くれるかどうかが知りたいのですが。

476 :デフォルトの名無しさん:02/07/17 03:15
単純なループにはできそうにないのでは

(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))))


477 :デフォルトの名無しさん:02/07/17 03:29
>>474,>>476 は r を変えてないからダメでしょう。
>>475のように処理されると思いますよ。
car部の処理があるから、そこのところで末尾再帰じゃなくなるだけで。

478 :477:02/07/17 03:30
>>467>>475のように
に訂正

479 :デフォルトの名無しさん:02/07/17 03:44
>>475
>>474 とか >>476 とかちゃんと読まないでレスするから
的外れかも知れないけど、SICPのコンパイラ作るところとか見た?
それを見れば分かるけど、 >>467 の場合、内側は普通の再帰のまま
外側はループになるよ。
で、>>467をいくら書き直して(例えばスタック使って強制的に)末尾再帰しても
実行効率とかメモリー効率が良くならないよ。

480 :479=472:02/07/17 04:24
>>475
俺が>>472 で「ループ」と言ったのは正確には
「再帰を使わないループ」という意味。不正確な言い方してゴメン。
で、そういうことだから>>475 はダメ。

それから、>>479 は良く見たら>>477が同じこと言ってたね。

で分かりやすく書いてみる。

よく「末尾再帰はループになる」って言い方するけど、
コンパイラ:「末尾再帰ハケーン!!ループにしますた。」
じゃなくて、実際には。
コンパイラ:「末尾呼び出しハケーン!!ジャンプ命令にしますた。」
って事なの。
だから *結果的に* 末尾再帰はループになるし、
相互再帰とかも素直に処理される。
(もちろん単なるジャンプじゃなくて引数の受け渡しとかの問題が有るけど
それは置いといて)
だから、「for-each-pair は末尾再帰関数か?」という問いには
NO と答えるしか無いけど、
「for-each-pair の2回の再帰呼び出しが普通に呼び出されるか?」
という問いもやはり NO になる。
外側の方の再帰呼び出しはジャンプ命令になる。
すると、結局for-each-pairは、
「ループがあってその中で自分自身を1回だけ呼び出している。」
そんな関数にコンパイルされる。
だから>>477の言ったようになる。

481 :デフォルトの名無しさん:02/07/17 05:07
フラットなリストでしてみても速度とメモリの効率はよくないだろうなあ。

(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)))


482 :481:02/07/17 05:34
flatはこうか?

(define (flat x)
(cond ((list? x) (apply append (map flat x)))
((pair? x) (flat (list (car x) (cdr x))))
(else (list x))))


483 :デフォルトの名無しさん:02/07/17 14:02
>>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の定義ってなんであんなデカイの?
解析しようとして挫折しました。

485 :457:02/07/18 01:58
>>483
いろいろぐーぐってたら、こんなん出ましたけど、もしかしてその本かなぁ?
http://www.scheme.com/tspl2d/index.html

486 :467:02/07/18 03:02
>>480
わかりやすい説明ありがとうございます。
>>467 の関数を処理系はループ(ジャンプ命令)に変換するが、
末尾再帰関数とは呼ばないということですね。勉強になりました。

>>479
SICP 読んでみます。

487 :485:02/07/18 07:33
>>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しないようになってるの?


489 :デフォルトの名無しさん:02/07/18 12:25
>>485
正解。 483 があげてるのは、その訳本(村上雅章訳)。


490 :デフォルトの名無しさん:02/07/18 14:59
最近 CD-R を「くだー」と読むようになりました。

491 :デフォルトの名無しさん:02/07/18 17:09
↑チョトワラタ

492 :467:02/07/18 17:10
>>487
>>467 の関数は「末尾呼び出し(つまり、ループに変換される)」が、
「末尾再帰関数」ではない。ということが言いたかったのです。

493 :デフォルトの名無しさん:02/07/18 20:51
(CDR 焼済)

494 :デフォルトの名無しさん:02/07/19 10:40
C の

while(1){
処理A;
if(終了条件)
break;
処理B;
}

これを、scheme ですきっり書く方法を教えて下さい。
どうして、scheme の do などには return がないんだ。


495 :デフォルトの名無しさん:02/07/19 10:55
>>494
(処理A)
(do () ((終了条件))
(処理B) (処理A))

これかなあ。処理Aが二回でてるのはよくないけど。


496 :494:02/07/19 11:07
とりあえず、call/cc を使えばできるんです。

(call/cc (lambda (return)
(let loop ()
(proc-A)
(if (end? )
(return ))
(proc-B)
(loop))))

でも、長いんです。


497 :デフォルトの名無しさん:02/07/19 11:12
(do ((a (処理A 初期値) (処理A (処理B a))))
((終了条件 a)))
になるように処理A、処理B、終了条件を書くとか。

(do ((a 初期値 (処理B a)))
((終了条件 (処理A a))))
こうなれば一番いいけど。


498 :494:02/07/19 11:37
>>497
理解できません。ごめんなさい。


499 :494:02/07/19 11:41
ちなみに Common Lisp なら

(loop
(proc-A)
(if (end? )
(return val))
(proc-B))

んー、実にシンプル。
さらに return は便利で。

(defun foo ()
...
(if a
(return val))
... )

のように関数から途中で抜けれる。
こんな便利な return を無くしたのも
それなりの理由があると思うのです。
なにしろ、 SRFI にもないですから(確か)。


500 :495=497:02/07/19 11:43
(define (super-a) (処理A) #t)

(do ()
((and (super-a) (終了条件)))
(処理B))


501 :recurser:02/07/19 11:44
>>494
漏れはよくこう書くな

(let loop ()
 処理A
 (if 終了条件
   結果
   (begin 処理B (loop))))


502 :recurser:02/07/19 11:46
>>499
returnが言語仕様に入ってないのは、ユーザライブラリとして実装
すべしというポリシーなんじゃないの?


503 :デフォルトの名無しさん:02/07/19 12:04
>>496
>でも、長いんです。
マクロにでもしやがれ

504 :497:02/07/19 12:08
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 は次の変化のところに
バラバラにして入れることになる。


505 :494:02/07/19 12:43
この形のループはダイクストラさん曰く 1と1/2回ループと言って、
0回以上のループと1回以上のループを含意する重要なループです。

SRFIにすらないので、関数型言語らしい書き方があるかも思っていたけど、
ないみたいですね。

>>500 関数にするのならもう少しシンプルになりますよ。

>>502,503
なんてたって、schemeには継続とマクロと末尾呼び出しがありますね。

>>504 副作用ありだと問題がありますよ。


506 :497:02/07/19 12:57
あれこれしなくても処理Aと終了条件を一つの関数にまとめればよかった。
while (処理A+!終了条件)
処理b;

(define (end?) (処理A) (終了条件))

(do ()
((end?))
(処理B))


507 :デフォルトの名無しさん:02/07/19 22:41
>>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

508 :not 501:02/07/20 00:58
>>505
俺は>>501がいいと思うがどうよ?

509 :デフォルトの名無しさん:02/07/20 03:17
Gauche 0.6 age

510 :デフォルトの名無しさん:02/07/20 04:07
>>508
同意。綺麗にまとまってる。

511 :デフォルトの名無しさん:02/07/20 10:41
この本、
ttp://www.amazon.co.jp/exec/obidos/ASIN/0415298199/photoinfo-22/249-9143721-5914721
面白そうなんだけど、えらく高くて買うのに躊躇してます。
だれか読んだ人、感想教えて。

512 :デフォルトの名無しさん:02/07/20 10:49
Gauche のロードマップはあと残す所 0.7 のみ。
まじスゲーよ。


513 :デフォルトの名無しさん:02/07/20 10:56
ロードマップて何?

514 :デフォルトの名無しさん:02/07/20 11:48
全国ロードマップ

515 :デフォルトの名無しさん:02/07/20 16:27
そろそろ、gauche を deb にして、sourceforge に
おいてやろうって親切な方はいないだろうか。

>>2-7 のようなリンクもいいが、scheme なアンテナもほしー

とか、言ってみるテスト


516 :デフォルトの名無しさん:02/07/20 17:10
ttp://prdownloads.sourceforge.net/gauche/Gauche-0.6.tgz

517 :デフォルトの名無しさん:02/07/20 21:05
>>515
とりあえず checkinstall なんてどう? deb 作ってくれるよ。


518 :487:02/07/21 21:36
with-input-from-file とかってやつは、継続を使って脱出/復帰しても
ファイルが閉じられはしないようなことが R5RS に書いてありましたが、
閉じられはしないだけで current-input-port は切り替わるんでしょうか?
それとも、そのまま?

519 :名無しのゴーシュ使い:02/07/23 01:35
>>512
ロードマップのページもちょっとずつ変化してるね。
前は version 0.7.0 は GTk サポートのみだったような。

GTk へのインターフェイスが出来れば Guile が不用になるので、
とっても嬉しいです。>> 作者樣

520 :index-j.html:02/07/23 11:14
(´-`).。oO(practical scheme へのリンクが切れてますよぉ > 作者様)

521 :ななしさん@お腹いっぱい:02/07/24 17:55
Gauche の deb は漏れも up-to-date なパッケージを作ってるんだけど…
もちろん漏れと漏れの友人だけのために。
Debian での正式メンテナは 0.5x くらいからとまったままみたい…どうよ?

522 :デフォルトの名無しさん:02/07/24 19:00
>>521

公開して下さい。


523 :デフォルトの名無しさん:02/07/24 19:08
Debian の場合 Gauche はどの文字コードでコンパイルするんだ?
全部コンパイルして、gosh-euc, gosh-utf, gosh-sjis てな感じにして、
インストールするときのダイアログで gosh からどれにシンボリックリンク張るか尋ねるのか?

gauche-dev って何が入ってるの?

セロ弾きのゴーシュ万歳!!


524 :名無しさん@Emacs:02/07/25 08:13
LispってEmacsだけのものじゃなかったのですね。
なんだかLispにますます興味が沸きました。

525 :デフォルトの名無しさん:02/07/25 12:09
Guileの make-shared-substring みたいなのって、gaucheにない?

(string=? key (substring pool s e))
みたいな処理が含まれたループかなんかだと、
使い捨ての文字列をいちいち生成するのはかなり馬鹿らしいと思うんだけど。

526 :デフォルトの名無しさん:02/07/25 14:11
>>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の話しなのか
わかりずらいのですが・・・

528 :デフォルトの名無しさん:02/07/25 21:19
必要ないだろ。
ここはLispとSchemeと兼用だし。
それだけ話題が少ない。

529 :デフォルトの名無しさん:02/07/25 22:27
>>525
Gaucheの部分文字列はcopy-on-writeで管理されているので、
変更を加えない限り自動的に共有されるってどこかに書いてあったような


530 :デフォルトの名無しさん:02/07/25 23:55
それ今読んでますた。
http://www.shiro.dreamhost.com/scheme/gauche/memo-str-j.html

531 :デフォルトの名無しさん:02/07/26 18:14
Structure and Interpretation of Classical Mechanics http://mitpress.mit.edu/SICM/book.html

532 :名無しさん@Emacs:02/07/27 10:14
Lispマシンを使っていた世代の人に質問なのですが、
それは、どうして廃れてしまったのでしょうか?
速度でしょうか?それとも「シェルスクリプトの方が
Lispより圧倒的に簡単だったから」という理由からでしょうか?

当時を知る人に昔話でもしてもらえたらなーなんて思います。

533 :デフォルトの名無しさん:02/07/27 10:25
>>531
Classical Mathematicsだとばっかり...
「おもこ」してました。

534 :デフォルトの名無しさん:02/07/27 12:47
>>532
他言語、他システムとの親和性が低かったから。
閉じたプロジェクトでは大きな力を発揮したが。

535 :デフォルトの名無しさん:02/07/27 13:02
>>532

http://www.shiro.dreamhost.com/scheme

のどこかで Lispマシンの衰退の理由が書いてあった気がする。
まあ、google で "Lispマシンの衰退"とかで調べたら。


536 :デフォルトの名無しさん:02/07/27 14:21
>>532
ソフトウェアエミュレーションでも十分速くなったからでは?

537 :デフォルトの名無しさん:02/07/27 15:57
>>533
ハウサーハケーン

538 :デフォルトの名無しさん:02/07/28 10:12
初学者です。
こんなデータ(http://namazu.org/~satoru/reference/books.db)をアプリ
に取り込んで処理をしたいです。
(load "./books.db)なんてやっちゃうと、「評価できない」と言わ
れます。(quote (load "./books.db))じゃないしー。
どーすればいーのでしょー。


539 :デフォルトの名無しさん:02/07/28 10:15
>>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も、見た目非破壊にすることができたと思います。
すぐに例は思いつきませんが。

543 :デフォルトの名無しさん:02/07/28 23:58
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)))) になる。


546 :545:02/07/29 08:43
(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)) になる。


547 :デフォルトの名無しさん:02/07/29 10:49
comp.lang.scheme に投稿してる人の signature 見ると面白いのがありますね。

(reverse (concatenate 'string "pj.oc.oof@" "egoh"))
=> hoge@foo.co.jp

;; 無限ループ
((lambda (x) (x x)) (lambda (x) (x x)))

;; あと 2ch の過去ログにあったやつ
((call/cc call/cc) (call/cc call/cc))

というわけで何か面白いネタ募集。

548 :デフォルトの名無しさん:02/07/29 20:36
自作の scheme 処理系が r4rstest.scm をパスしません・・・
なぜか SECTION 6 5 6 で引っかかるの。
ソースを追っても何をテストしてるのか解読できません。
へるぷみ〜。

>>544
> (let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let))
見るだけで鬱だ・・・

549 : :02/07/29 22:25
r4rstest.scm は R4RS のテストですよ。
R4RS の 6.5.6 章を見てください。
数値を文字にして、その文字を数値にしたのが、元の数値と同じであるとか。

550 :デフォルトの名無しさん:02/07/30 01:20
>>549
あの辺の「数」の実装、まともにやろうとすると頭禿げそうな。
そういえば、bignumの16進数の出力とかってどうやるの?
いちいち16で割り算してったら日が暮れそうな気がするけど。

551 :デフォルトの名無しさん:02/07/30 01:23
普通に8bit右シフトじゃん?

552 :525:02/07/30 01:31
gaucheは説明によると、substringがポインタ&レングスコストな
代わりにstring-set!が遅いと書いてあるね。
って、string-set!した時点で新しいオブジェクト作るってことは、
それ参照してる変数全部書き換えすんの?
非現実的な気がするんだけど。
受けオブジェクトがあるのかな。

[複数の参照先]→[受けオブジェクト]→[文字列の実体またはポインタ]

553 :デフォルトの名無しさん:02/07/30 01:33
>>551
普通って、bignumで8bit右シフトなんて簡単にできるの?

554 :デフォルトの名無しさん:02/07/30 01:34
>>553
なにも全体をシフトする必要ないじゃん


555 :デフォルトの名無しさん:02/07/30 01:36
>>554
どういうアルゴリズムですか?
例えばshort(0〜9999)とかで分かれてた場合は?

556 :デフォルトの名無しさん:02/07/30 01:41
>>554
うーん、おれ頭悪いんで、例として
12345678901234567890(これは10進表現)
というbignum値(short配列で(0〜9999の範囲)で格納されている)があった場合、
それをどうやって16進出力するかって例をお願いします。

557 :デフォルトの名無しさん:02/07/30 01:43
>short配列で(0〜9999の範囲)
コレがすんげー意味不明

558 :デフォルトの名無しさん:02/07/30 01:46
>>557
short bn[];
の各要素に入る値が0から9999ってことじゃないの?
これのメリットは10進ならそのまま出力できるって事。

559 :デフォルトの名無しさん:02/07/30 01:50
普通のbignumってshortの範囲全部使い切るじゃん
BCDじゃ演算速度がた落ちだろ。

560 :556:02/07/30 01:52
>>559
なにが普通なのかよくわからないです。

いまのところ、
>>558さんの言う通り、>>556の12345678901234567890という値なら
short bn[] = {1234,5678,9012,3456, 7890};
というのを考えてました。

561 :556:02/07/30 01:54
>>559
じゃあ、0〜65535の範囲を使うとして、
それを10進で出力する方法を教えてください。

562 :デフォルトの名無しさん:02/07/30 01:56
内部表現は普通↓のようにすると思うが。

LSB <-・-> MSB
0AD2 EB1F A98C AB54


563 :デフォルトの名無しさん:02/07/30 01:57
>>561
普通に10で除算した剰余を使う。


564 :556:02/07/30 01:58
>>562
いや、方向はとりあえずどうでもいいんですけど。
>>562のshort bn[] = {1234,5678,9012,3456, 7890};
も実際は逆になるでしょうし。

565 :556:02/07/30 01:58
>>563
それって遅いんじゃないですか?
もっと良い方法があるかと思ったんですが。

566 :デフォルトの名無しさん:02/07/30 01:58
>>564
方向はどうでも良いが、値が違うと突っ込みが入らないように書いただけ。

567 :556:02/07/30 02:00
>>566
突っ込みませんので教えてください。

568 : :02/07/30 02:01
>>561
ありがちなのは、10000で割りながら余りを4桁ずつ出していく方法。
同様に、10000進数を16進にするなら、4096で割りながら余りを
3桁ずつ出していけばいい。

569 :デフォルトの名無しさん:02/07/30 02:02
>>567
高々除算の数千回から数万回、I/Oに比べたらずっと速い

570 :556:02/07/30 02:05
やはり割り算しかないみたいですね。
結局一度に割る数を多めに取るということでしょうか。
半端な値の処理とか考えると禿げそうですね。
ありがとうございました。

そろそろスレ違いっぽいのでこれで終わりにします。


571 :デフォルトの名無しさん:02/07/30 02:10
そういうのは自分で作っても実りがあまり無いから、
既存のライブラリ使った方がいいよ、多分。
ハゲるよ(w

572 :心配だなー:02/07/30 02:14
処理系自作してる間に禿げた人いる?

573 :デフォルトの名無しさん:02/07/30 02:22
CINTの作者は禿げてるよ!

574 :デフォルトの名無しさん:02/07/30 02:35
すとらうすとらっぷもはげてるよ

575 :デフォルトの名無しさん:02/07/30 02:54
俺もはげてるよ

576 :548:02/07/30 03:13
内部表現は16進で、10で割りながら表示してます。重いです。
そーか、10000ずつ割るとかやれば少し速くなるんだ・・・気付カナカッタ。
ありがとう >>568 さん。

577 :デフォルトの名無しさん:02/07/30 09:24
sawfishでお馴染みの librep は bignum に gnu の数学ライブラリ使ってる。

カリー化な Lisp って何がありますか?




578 :デフォルトの名無しさん:02/07/30 14:59
>>577
http://srfi.schemers.org/srfi-26/srfi-26.html

Gauche には部分適用可能な高階手続きが用意されているhttp://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_75.html#SEC75

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$で書くことはできますか?
ってことを聞きたかったんです。

583 :デフォルトの名無しさん:02/07/30 17:20
>>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)))
これ?

585 :デフォルトの名無しさん:02/07/30 20:14
(define (flip f)
(lambda (x y . z) (apply f y x z)))

586 :デフォルトの名無しさん:02/07/30 21:26
scheme処理系の(C/C++での)作り方を解説してるページとかってあります?

587 :デフォルトの名無しさん:02/07/30 23:40
>>586
参考になるかどうかわからんけど。

Schemeを作ろう第1回
http://www.jah.ne.jp/~naoyuki/Writings/VScheme1.html

588 :デフォルトの名無しさん:02/07/31 10:49
>>582
gosh にも cut なるんだし、なぜ pa$ にこだわるの?


589 :デフォルトの名無しさん:02/07/31 22:42
Schemeの勉強を一通りした初学者がコード読むのに適した
アプリケーション、おすすめを教えてください。
できたらGaucheで。初期設定ファイルから初期設定、オブジェ
クト指向、DBなどが使われていると嬉しいです。
(Wiliki.scmは読んでいます http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi





590 :デフォルトの名無しさん:02/07/31 22:58
>>589
「Scheme の勉強」って文法ですか?
それとも背景にある Lisp の慣習や定石も含まれていますか?


591 :デフォルトの名無しさん:02/07/31 23:29
>>590
「Schemeの勉強」は文法だけです。具体的には湯浅太一さん
の「Scheme入門」を読みました。しかし、これだけではオブ
ジェクト指向、Webフレームワークには勝てないんです。(^^;
定石は是非とも知りたいところです。



592 :デフォルトの名無しさん:02/07/31 23:35
>>586
ここのページも分かりやすいですよ。
Lisp制作講座
http://www.roy.hi-ho.ne.jp/pastel/home/Lisp/index.html

593 :590:02/08/01 00:40
>>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
>>592
なんでそんなにかかるんだよ!


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
>>593
>>595
Lispなんて結局は使えない。

>>597
Lispなんて結局は7行プログラム言語。

600 :デフォルトの名無しさん:02/08/01 12:29
600記念カコキ

601 :デフォルトの名無しさん:02/08/01 13:33
ありがとうございます。なんとなくわかりました。598

602 :デフォルトの名無しさん:02/08/02 13:38
>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
>>603
gcでのマークはどうするの?

605 :デフォルトの名無しさん:02/08/02 15:01
>>604
(progn
 (message "Parallel GCとかじゃなければ、計算中は0でいいでしょ?")
 (if paranoia
  (yes-or-no-p "って返事で、的を射てるんでしょうかね?)))

606 :602:02/08/02 16:09
>>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)
とか。


608 :デフォルトの名無しさん:02/08/02 17:15
(24ビットタグアーキテクチャの資産は生きてるのね…)

609 :デフォルトの名無しさん:02/08/02 17:24
λ計算のいい本あります?


610 :602:02/08/02 17:30
>>607
やっとわかってきました。ありがとうございます。
あとは自分で考えてみることにします。

#define fixnump(p) (3&(long)(p)==3)

#define fixnump(p) ((long)(p)&3==3)
にしないと正しい結果が出なかったんですが、理由はよくわかりません(汗


611 :デフォルトの名無しさん:02/08/02 18:18
Cでは、x & y == z は x & (y == z) になるという、イヤな優先順位が。念為。


612 :デフォルトの名無しさん:02/08/02 18:20
>>610
んん。
#define fixnump(p) ((((long)p)&3)==3)
じゃないとマズくない?

613 :602:02/08/02 18:41
>>611-612
あ、そうですか。
今手元に本がないんで後でちゃんと調べるつもりだったんですが、適当なこと
を書いたかもしれません。すみません。
#define fixnump(p) (3&(long)(p)==3)
がダメなはずはないでしょうか?自分のプログラムが間違っていただけかもし
れません。

それと何度も質問ばっかりで申し訳ないんですが、、
#define atomp(p) (1&(p))
#define cellp(p) !atomp(p) // pairp
ポインタのアドレスの一番下のビットがたまたま1になっていてこの判定が逆
になってしまう可能性があるように思うのですが、そういうことはないんでしょ
うか?


614 :デフォルトの名無しさん:02/08/02 18:52
>>613
> ポインタのアドレスの一番下のビットがたまたま1になっていて
ヒープデータをポインタのサイズ、もしくはセルのサイズに
必ずアラインするようにしておく。
そうすれば、ポインタ4バイトのアーキテクチャなら、
有効なポインタの下2ビットは常に0。

必ず0

615 :デフォルトの名無しさん:02/08/02 19:00
>>614
そのへんのことは
http://www.gnu.org/software/guile/docs/data-rep.html
ここが参考になるかもしれない。

616 :デフォルトの名無しさん:02/08/02 21:41
>>614-615
なるほど。みんなそれを前提にしてたんですか。思わず溜息ものです。
過去ログの話もいまいち飲み込めなかったのが全部すっきりしました。
これが常識なんでしょうか。すごいなぁ。

>>615さんの紹介してくれたページにもその辺のことが書いてありますね。
これから続きを読んできます。
みなさんいろいろありがとうございました。

617 :デフォルトの名無しさん:02/08/02 22:22
>>616
つーか、ワード境界を跨いでワードを配置しないのは、
システムプログラマの常識。アセンブラの勉強しなされ。

RISCだとそもそも一発でread/write出来ないのが多いし、CISCでもペナルティがある。

そもそもmalloc(3)はワード境界から割り当てる実装が多い。(つーかしないのある?)

618 :デフォルトの名無しさん:02/08/03 09:37
>>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ならわかるのですが、
なにかこのクラスをとって自信が情報工学勉強してる自信がなくなって
きました。

ならやめろとかいわないでね。


620 :デフォルトの名無しさん:02/08/03 20:22
>>619
インタプリタを使える環境にあるんでしょ?
括弧の一番内側から1ステップづつ実行してみるのがよろし。
この課題について言えば、Cと違って関数もオブジェクトに
なることが理解できたらすぐわかると思う。あと括弧に慣れること。

この課題がどういうレベルかというと、英語でいうならアルファベットを
読めるかどうかを確認するレベルかなあ。



621 :デフォルトの名無しさん:02/08/03 20:28
>>620
Cでも関数ポインタあるんですが。
違いは、それをインラインで書ける、動的に生成できるってことで。


622 :デフォルトの名無しさん:02/08/03 20:30
>>619
620 氏の言う通り、単純に慣れの問題だと思われ。
一度慣れてしまえば、スラスラ解けますよ。僕は理工系の学生ではないですけど。

623 :620:02/08/03 21:58
>>621
> Cでも関数ポインタあるんですが。
そういやそうだな。
そしたら最初のやつはlambdaも出て来ないから
わかりそうなもんだが…もしかしてquoteで引っかかる?


624 :デフォルトの名無しさん:02/08/03 22:14
>>623
もしかしたらCをわかってるつもりなだけで
(((intern("a") == intern("b") ? car : cdr)(cons(cdr, car))))(list(3, list(2, 1)))
なんてのを見ても動作が理解できないとかだったりするかも。
(キャストは省略してます。)


625 :619:02/08/04 04:13
実は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さんがいってる動作も
ぜんぜんわかりません・・・・

626 : :02/08/04 04:26
>>625
これは理解できる?

(eq? 'a 'b) => #f
(if #f car cdr) => cdr
(cdr (cons cdr car)) => car
(car '(3 (2 1))) => 3

627 :619:02/08/04 05:08
>>625
わかりやすく解説ありがとうございます。

なぜ(cdr (cons cdr car)) ->car
になるのでしょうか?リストの中でcarは最初、cdrは
残りというのはわかるのですが、このリストの中身、
(cons cdr car)のcar->cons, cdr->cdr carとは違うのですか?

628 :619:02/08/04 05:09
>>626さんと間違えました。すいません。

629 :619:02/08/04 05:27
調子にのってると思われるかもしれませんが、できれば
こちらの解説もおねがいできないでしょうか?

(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 されるのをみると、与えられてる
ものが逆になってるということだけわかるんですが・・・


630 :デフォルトの名無しさん:02/08/04 05:30
>>626
> (if #f car cdr) => cdr
> (cdr (cons cdr car)) => car
これ違うんじゃ。。。quoteついてないからcdrやcarの中身だと思われ。


631 :デフォルトの名無しさん:02/08/04 05:54
>なぜ(cdr (cons cdr car)) ->car になるのでしょうか?

gosh> (cons cdr car)
(#<subr cdr> . #<subr car>)

gosh> (cdr (cons cdr car))
#<subr car>

あのさ、自分で試すことはできないの?

632 : :02/08/04 07:18
>>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)

633 :619:02/08/04 07:42
>>631, 632

ありがとうございます。動作がわかりました。
自分はDr Schemeをウィンドウズ上で走らせてるんですが、
自分でインプットしてるんですが、どういうふうに動作してるのか
わからなくて・・・ありがとうございました。

634 :デフォルトの名無しさん:02/08/04 12:52
string->number, number->string がどーしても上手く実装出来ん。
気が狂いそうだ。うきーっ!

635 :メロンパン:02/08/04 16:49
>634

いったい何が問題なんだ?

636 :619:02/08/04 19:34
また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週間後にテストなんです・・・
テストの形式は上にあげたような例題を少し変えてテストがでてくるので、
どういうふうに動作してるか理解してないととけないんです・・・
わがままですが、解説おねがいできないでしょうか・・・

637 :デフォルトの名無しさん:02/08/04 20:02
>>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?

638 :デフォルトの名無しさん:02/08/04 20:41
>>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



639 :デフォルトの名無しさん:02/08/04 22:32
DrScheme v2.0.1 available

640 :634 & 548:02/08/04 22:55
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> と表示させるべきなんでしょうか?どうなんでしょ?

641 :デフォルトの名無しさん:02/08/04 22:57
間違えた。こうです。
(define x 0)
(define y (delay x))
(write y)
(set! x 1)
(write (force y))

642 :栗棒:02/08/05 01:19
Dr Schemeって重いんだよね。winのやつなんて他のアプリ立ち上げてると
かたまるときがあるし。それは俺のxpが問題なだけかもしれないけどw


643 :名無しさん:02/08/05 03:26
>>642
Cygwin 入れて Gauche にしる!!
DrScheme が重いのは同意。

644 :栗棒:02/08/05 04:35
gaucheねー、グラフィックに慣れてる俺としてはなかなか
むずかしいんだよね。なんせwinマンセーだからw

でもDr Schemeつかっててブラウザ立ち上げると少しの間かたまるんだよね。
メモリ512Mもあるのに。ヽ(`Д´)ノウワーン(´・ω・`)ショボーン

645 :栗棒:02/08/05 04:38
linuxかfree bsdにスキームってはいってないの?最初から。

646 :デフォルトの名無しさん:02/08/05 05:23
いまどきのLinuxならguileってschemeが入ってるよ。たいがい。

647 :デフォルトの名無しさん:02/08/05 05:54
>>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 :デフォルトの名無しさん:02/08/05 14:40
>>644
http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/Scheme/
これ、試してみれば?

651 :デフォルトの名無しさん:02/08/05 17:53
>>650
エッセイ2時間かけて読み終えたハァハァ。
色々紹介されてた本買ってみようかな。

652 :デフォルトの名無しさん:02/08/05 18:00
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以外の世界では書かれてないのか?


653 :648:02/08/05 20:14
>>649
人のコードみて勉強しようと思ったんですが、甘いっすか?
甘ちゃんっすか? 俺ってダメなやつっすか?

...がんばってスクラッチからやってみます。しょぼーん。

654 :デフォルトの名無しさん:02/08/05 20:55
>>653
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi
http://sourceforge.net/projects/wiliki/

WiLiKi (Wiki クローン) とかどうですか?
よく分からないけど掲示板ぽいから参考になるかも。
ソースも手に入るみたいだし。

655 :648:02/08/06 02:50
どうもありがとうございます。これはGaucheの人の作品ですか。
チャレンジしてみます。

656 :デフォルトの名無しさん:02/08/07 14:12
SICP第二版(日本語)読んでるんですけど、
3.1.1 の make-account の定義に dispatch が
存在するのは間抜けだと思う人居ませんか?

グローバルシンボルの withdraw を
局所手続き withdraw に変換するため
というのは分かるのですが、
これでオブジェクト指向だと言われても
これではメソッドを追加するたびに
メソッド本体とdispatchを書き換える必要があり、
いまいち美しくないと思うのです。

657 :デフォルトの名無しさん:02/08/07 14:40
で?

658 :656:02/08/07 17:00
つまり、もうちょい綺麗な書き方無いのかね、ということです。
予想される解答としては

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と同様、
解決方法が求められている課題はあるね。

660 :640:02/08/07 20:14
Passed all tests! やたっ!おめでとう自分。
前書いた暗黙のフォース云々は勘違いでした。ごめんなさひ。

661 :デフォルトの名無しさん:02/08/07 20:38
>>660
おめでたうございます。
いいなぁ。どんな処理系のソースとか参考にしました?
>>640さんだけじゃなくて処理系作ったことある人に聞きたいです。
(特に最初に作った時に参考にしたもの)

662 :!660:02/08/08 03:57
>>661
規模が小さい上にツボをしっかり押さえてる処理系
・mini-scheme
・AM-scheme
・SECDR-scheme
かなり昔の処理系で、作者は全部日本人ですね。
これらはgcも手書き。ただ、ちょっと遅いかも。
最初に参考にするならmini-schemeかと。

663 :660:02/08/08 20:34
>>661
基本的にはあまり参考にしてませんです。
gaucheのソースなんか眺めてみたりしましたけれど、
他人のソースって読みにくい。あまり参考にならなかったり。
それより日本語で書かれたドキュメント類の方が何かと参考になります。

664 :デフォルトの名無しさん:02/08/09 18:02
>>663
やっぱcellは8バイトですか?
その場合gcのマークフラグはどうするんですか?


665 :663:02/08/09 20:00
>>664
今の自分の実装では、コンスセルを1個作ると・・・えーと・・・32バイト。ヒープを食います。
も少しこのあたり改善しないとだめかなぁ?

666 :デフォルトの名無しさん:02/08/10 11:45
shemeでソートを勉強したいんだけどどこかいいHPしってる?
バブルソート、クイックソート、などなど。ソースみて、時間かければ
なっとくできると思うんだけど、自分じゃ作れないから。

667 :デフォルトの名無しさん:02/08/10 12:03
>>666
slib のソースに sort.scm というのがあります。
(何 sort かちゃんと見てませんけど)

あと
http://www.scheme.com/tspl2d/
の Chapter 9.2 List Sorting に merge sort があります。(英語ですが)

668 :デフォルトの名無しさん:02/08/11 00:36
SICP第二版(日本語)読んでみたいと思っているのですが、
ざっと見ただけなのですが、今の自分の知識では無理だと思ったので
これを読みこなすために前提となる知識、または知っておいた
方が良い知識があれば教えて頂けないのでしょうか。

669 :デフォルトの名無しさん:02/08/11 00:56
「知識」なら、読み始める前に特に必要は無い。
処理系は用意しといてね。
そいから、一緒にトライしてくれるひとが、身近にいるといいかも。

670 :デフォルトの名無しさん:02/08/11 01:01
それと陰で支えてくれる女子がいてくれたらうれしいのう

671 :668:02/08/11 01:15
>>669 処理系は用意しといてね
今じぶんが持っているのは、Petite Chez Schemeと、
ChezEditというエディタなのですがこれで良いでしょうか。

>>670
残念ながらいません。おまけにプログラムに興味を持っている
男さえも周りにいません。

672 :デフォルトの名無しさん:02/08/11 02:12
俺たちは身近な人ではないが、いつでも質問・雑談・答え合わせに来るがよい。

と勝手にこのスレを代表してみる。

673 :デフォルトの名無しさん:02/08/11 04:42
                \ │ /
                 / ̄\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
               ─( ゚ ∀ ゚ )< Dr Scheme〜〜〜!
                 \_/   \_________
                / │ \
                   ∩  ∧∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \ ( ゚∀゚)< Dr Scheme Dr Scheme!
Dr Scheme〜〜!   >( ゚∀゚ )/ |    / \__________
________/ |    〈 |   |
              / /\_」 / /\」
               ̄     / /

674 :デフォルトの名無しさん:02/08/11 18:40
典型的な手続き言語厨なので、
どうも思考がついて行かれん。
どしたらLisp頭になれんの?


675 :デフォルトの名無しさん:02/08/11 20:08
>>674
例えばどのあたり?
Lispも手続き型言語だと思い込んでみたら?

676 : ◆.RANK1Kg :02/08/11 20:14
俺は手続き型が体に染み付いているので、
Lisp(Scheme)を勉強しても、Lispが書きやすいと
思えるようにはならなかったが、C++やJavaのコードが
少し綺麗になった。
もう少し勉強したらLispの方が書きやすくなるのか?

>>675 >>674氏は上記のような状況を望んでいるのだと
思われ。したがってそれでは無意味かと……。

677 :デフォルトの名無しさん:02/08/11 21:03
hoge(hage(boge(), bage()), hego(), bego());

678 :真性厨:02/08/11 21:31
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
こういうかっこいいことを言ってみたいです。

漏れ見たいな香具師が、
手続き型言語の数十行のコードを必死で書いてるのを横目に、
「ふっ。」といって
瞬時に同機能のLispコード書いちゃうみたいな。

679 :デフォルトの名無しさん:02/08/12 02:53
>>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年目なもので。プログラムは
奥が深いです。

684 :デフォルトの名無しさん:02/08/12 12:47
> バイナリーサーチツリーを書け、括弧がいくつあるか
> 調べるファンクションを書け、infixをpostfixに直すファンクションを書けなど、

2週間でこれはきついですね。こういうのでscheme嫌いになる人が出たら残念。

685 :デフォルトの名無しさん:02/08/12 16:13
質問
GUIと日本語が使えるSchemeって、ありますか?
(Stklosのwinバイナリは、日本語が通らないです)

686 :デフォルトの名無しさん:02/08/12 19:01
質問
UnixとWindowsで使えて
GUIと日本語(出来ればUTF8がいいな)が使えて
GPLじゃないバイナリがつくれて
フリーなSchemeって、ありますか?

687 :デフォルトの名無しさん:02/08/12 19:10
Lisp Patrick Henry Winston とBertbold Klaus Paul Hornっていう本を
人工知能の分野で有名な北野さんがすすめてましたがいい本なんですか?

688 :デフォルトの名無しさん:02/08/12 19:19
>>685,686
とりあえず、過去ログ読んでみたら。


689 :デフォルトの名無しさん:02/08/12 20:53
>>658 >>686 >>688
ないと思います。

690 :デフォルトの名無しさん:02/08/12 21:03
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
なんですが。

691 :デフォルトの名無しさん:02/08/12 21:20
>>690
浮動小数点数の演算で演算誤差が発生して、1.4 と微妙に値が異なってしまうためです。
(= 1.96 (* 1.4 1.4))
ってやってみてください。これが #f なら、(* 1.4 1.4) は 1.96 ではないので、1.96 と表示されるのは誤りです。

692 :691:02/08/12 21:21
訂正
誤:演算誤差が発生して、1.4 と微妙に値が
正:演算誤差が発生して、1.96 と微妙に値が


693 :690:02/08/12 22:45
>>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
つーか、浮動小数点をイコールで比較すんのは間違ってる気が。

695 :デフォルトの名無しさん:02/08/12 23:45
>>693
いわゆる浮動小数点数で誤差が発生するのはある意味常識・・・ご存知ない?
そもそも 1.4 は浮動小数点数で正確に表現出来ないんです。

696 : ◆.RANK1Kg :02/08/13 00:02
なんでguileだと中途半端にうまくいくんだろう?
表示精度と内部保持精度が違っていて、四捨五入してごまかしてるとか?
(だったら 1.960000... とでもしてほしいが)

内部精度全桁表示させる方法はありますかね?

>>694 検証実験で = を使ってるだけでは。

697 :デフォルトの名無しさん:02/08/13 01:11
>>696
> 表示精度と内部保持精度が違っていて、四捨五入してごまかしてるとか?
そう。表示精度が低いから同じ表記になってしまうだけ。
本当は異なる値は異なる表記をしなければならんそーです。

> 内部精度全桁表示させる方法はありますかね?
面倒そう・・・この辺り↓も読むと、この問題をややこしそーに思わせてくれます。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Gauche%3a%b3%c8%c4%a5%c9%e2%c6%b0%be%ae%bf%f4%c5%c0%b1%e9%bb%bb%a4%ce%c6%e6&l=en

698 :デフォルトの名無しさん:02/08/13 21:39
なんで数値だけ特別扱いなんだよ。
他の言語では小数点付きと整数は別扱いになってるだろーが。

699 :デフォルトの名無しさん:02/08/13 22:00
DrSchemeについてくるゲームとかってどうやって遊ぶの?
普通にopenしてexecuteボタン押しても何も起こらないし。

700 :デフォルトの名無しさん:02/08/13 22:29
↑ここで聞かずに作者に聞けよ。

701 :デフォルトの名無しさん:02/08/13 22:40
>>698
特別扱い?なんじゃそりゃ?

702 :デフォルトの名無しさん:02/08/13 23:18
>>701
気付かないアホがいるとは思わんかった(藁

703 : ◆.RANK1Kg :02/08/13 23:23
>>700 作者に聞く前にマニュアル読めよ。

まあ、英語なのが問題なんだろうけど。つーわけで
>>699
うちでは、拡張子が ss なファイルをopenしてexecuteすれば、
blackjackやmineは行けますが?(OS:Win2000)
PLT\collects\game\games.ss はランチャですね。

704 : :02/08/14 00:07
>>702
全然意味がわからん。

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なので、あんまり意味ないかなと思いました。
ただ、新規セグメントの確保は、後者がオブジェクトの移動が無いので
速そうだなと、この辺りで速度差が出ないか気になっております。

707 :デフォルトの名無しさん:02/08/15 03:05
mark-and-sweepよりstop-and-copyの方が良くない?
というか、セルとポインタには後者で、大きめのメモリには前者で使い分けるのが
手軽でよさそう。

708 :706:02/08/15 03:21
>>707
お早い回答ありがとうございます。
この辺はなんだか複雑なので、どちらかで一元化出来ないものかと考えて
おりました。
vectorやstringなどを別領域に取るのは良いアイデアですね。

前者のみを使うとなると作りはシンプルになりそうですが、
毎回copygcを呼ぶのは速度的に不利な感じなので、セル単位など、
連続領域が必要にならない間はmark&sweepを使う事を考えております。
(それでも足らなかったら大きめの領域を確保してcopygcを使う。
この辺が2度手間で逆に遅そうですが。)

709 :デフォルトの名無しさん:02/08/15 03:26
Generational Copy GCを使えばそんなに遅くならないって
Appelちゃんがいってたよ。


710 :706:02/08/15 03:33
あと、再帰的な参照をされたvectorオブジェクトについても悩んでおります。
これはmini-schemeでは解決されていませんでした。
(そもそもmini-schemeにはvectorが存在しない。)

#(#(#(#(#(#(#(....)..)..)..)..)..)..)

この様な非常にネストの深いvectorオブジェクトの各要素のマーク
を考えると、mini-schemeで使われている、クヌースの非再帰マーク
アルゴリズムそのままでは対処できないとわかりました。
(素直にvectorのmarkを再帰関数で組んでしまうとスタックオーバーフローしてしまう。)
今のところ、vectorオブジェクトにgc専用のvectorのチェーンポインタを付けて、
vectorの要素全部を後でいっぺんにマークする(意味伝わるかな・・)方法を考えて
いますが、他に良い方法はあるでしょうか。

711 :706:02/08/15 03:38
>>709
世代別コピーgcは難易度が高すぎて、自分はいまだ理解できずにいます。
理屈を考えると速そうなのは解るんですが・・・。

712 :706:02/08/15 03:45
頭痛くなってきたのでもう寝ます。

713 :デフォルトの名無しさん:02/08/15 11:46
gauche(0.6.1)@cygwin が、windows版バイナリでとってきた emacs-21.2 の
M-x run-scheme でうまく動かないんだけどうちだけ?

cygwin でコンパイルした guile-1.4.1 だとちゃんと動くんだけど。


714 :712:02/08/16 03:28
結局両方作って比較することにしました。
時間があればですが。

715 :scheme 小僧:02/08/16 17:45
scheme の internal define について質問です。

(define (my-proc arg1 arg2)
(define a (foo arg1))
(define b (foo arg2))
(define c (bar a b)))

というように同じ internal define で先に定義したもの(a,b)を使って
他のもの(c) を定義するのは正しくないのでしょうか?

http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3a%c6%e2%c9%f4define%a4%ce%c9%be%b2%c1%bd%e7&l=jp
を見て悩んでいます。

試したところ、
guile, scm ... エラーになる
gauche, stk ... エラーにならない
でした。

通らないと結構面倒くさいのですが、let* を使えってことでしょうか。

716 :デフォルトの名無しさん:02/08/16 18:24
>R5RS的にもエラーが正しい。
って書いてありますね。

gauche の場合は「手抜き」のせいでエラーにならないんでしょう。stk は知
らないけど。

そもそも変数を定義するのに define は普通使わないと思いますが、、
>通らないと結構面倒くさいのですが、let* を使えってことでしょうか。
というのは何で?

717 :scheme 小僧:02/08/16 18:44
>>716
> >R5RS的にもエラーが正しい。
> って書いてありますね。

やっぱし、そうですか。ありがとうございました。

> そもそも変数を定義するのに define は普通使わないと思いますが、、
> >通らないと結構面倒くさいのですが、let* を使えってことでしょうか。
> というのは何で?

どうも、C などになれちゃっているせいか、先頭で define して
名前を与える方が見易く思ってしまうんですよね。
let だと一段括弧が深くなるというのもありますが、もしかしたら
emacs 使っているので色がつくからかも知れません。
let でも束縛する識別子に色をつけてくれないかなぁ。


718 :デフォルトの名無しさん:02/08/16 18:53
>>717
私も全部 define で済んだ方が嬉しいな…
今は letrec* とか書いて使ってるけど…

719 :デフォルトの名無しさん:02/08/17 00:39
>>718
letrec*ってどういう挙動?
普通にlet*で関数書いておけばいいんじゃないの?

720 :デフォルトの名無しさん:02/08/17 01:08
internal definitionは letrecと等価だからね。 初期値を求めるのにそこで bindする変数の値を使ってはいけない罠。 おれもめんどうだなあ、と思ったことあるけど。 それにしても letrec* は初耳。

721 :デフォルトの名無しさん:02/08/17 01:20
話が逸れるが、letの原型がlambdaだから、
let*の関数版(引数を左から右へ評価する)lambda*ってのも、
あって良いんじゃないかと思う。

722 :デフォルトの名無しさん:02/08/17 01:26
>>721
どうやって展開すんの?
((lambda*(a b c) ...) x y z)
↑みたいにインラインで書かれたらマクロ無理だよね?

723 :デフォルトの名無しさん:02/08/17 01:32
↑そうだった。
最低名前でアクセスする必要がありそうだな。
無名マクロが記述できれば便利なんだが。

724 : ◆.RANK1Kg :02/08/17 01:34
>>721 どういう意味ですか?具体例を見てみたいです。

>>718-720
ttp://www.kt.rim.or.jp/%7ekbk/guile/guile_21.html#SEC53
ここの set! の説明に letrec* が登場するけど、ミス?

原文: http://www.delorie.com/gnu/docs/guile/guile_53.html

725 :デフォルトの名無しさん:02/08/17 01:39
CGIプログラムを書く場合、HTMLとS式の変換関数があれば
便利かなと。
S式->HTML はいけそう。でも、HTML->S式は私にはむつかそう。

http://www-6.ibm.com/jp/developerworks/xml/020208/j_x-matters14.html
これみたく、関数型の特徴って出ます?


726 :デフォルトの名無しさん:02/08/17 01:48
この逆の処理ですね。さてどうしよう。

(tree->string
(html:table :width "100%" :cellpading 0 "content here"))
=>
"<table width=\"100%\" cellpadding=\"0\">content here</table>\n"
http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refj_257.html#SEC257より)


727 :デフォルトの名無しさん:02/08/17 01:49
>>725
書いた本人ですが、
ちょっと前のここの過去ログにhtml->sexpr, sexpr->htmlがあります。
一応可逆変換可能です。(コンテンツによっては不完全。)
まあ参考程度にはなるかも。
もうちょっと本格的にやりたいならDSSSLを勉強するとか。

728 :デフォルトの名無しさん:02/08/17 02:20
Part4はなんか荒れてるな

729 :デフォルトの名無しさん:02/08/17 07:13
>>719-720
let* だと再帰する関数が書けないから、それにだけ対応させてみた自作 macro。
複数関数の相互再帰には対応できてないけど、少しは便利。

>>724
> ここの set! の説明に letrec* が登場するけど、ミス?
文脈的に、ミスだと思う。

730 :デフォルトの名無しさん:02/08/17 11:24
Jakartaが混乱するjava世界のゆるやかなベクトルになってるよう。
Schemeでも、こんなのをつくるってどうよ。もちろん、一つに収斂
させるんじゃなくってね。
賛同してよん。

731 :デフォルトの名無しさん:02/08/17 12:03
やだ

732 :デフォルトの名無しさん:02/08/17 18:15
>>730
インドネシアの首都ジャカルタ
が、どうしたって?

733 :デフォルトの名無しさん:02/08/17 18:23
サムイネタでageんなよ…

734 :デフォルトの名無しさん:02/08/17 18:25
ジャカルタはカルタの進化した形

735 :デフォルトの名無しさん:02/08/18 04:16
evalんじゃねえ!

736 :デフォルトの名無しさん:02/08/18 04:54
eqんじゃねえ!

737 :デフォルトの名無しさん:02/08/19 19:42
>>713
こちらは Meadow だけど、 .emacs で
(setq scheme-program-name "C:/cygwin/bin/gosh.exe -i")
みたいに -i をつけるとうまく動くよ。

738 :デフォルトの名無しさん:02/08/20 15:01
一つお伺いしたいことがございます。
このスレで何回か話題に上っている

SECDR-scheme

というものを拝見したいのですが、検索しても
発見できません。

よろしかったらお教え願えませんでしょうか。
お願いします。


739 :デフォルトの名無しさん:02/08/20 17:35
>>738
以前、niftyのFPLにありました。
たしかインターネットからでもダウンロード可能だと思います。

740 :738:02/08/20 18:11
>>739 さん

お教えいただきありがとうございます。

>以前、niftyのFPLにありました。
>たしかインターネットからでもダウンロード可能だと思います。

もしかして、niftyの会員にならないとダウンロードは不可能
ということはございませんか。

ttp://www.nifty.ne.jp/forum/fpl/

には以前伺ったことがございましたが、どうしても発見できませんでした。

折角お教え頂きましたのに、ご好意を無為にするようなことを
書き込んでしまい、すみません。


741 :デフォルトの名無しさん:02/08/20 20:34
(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)

742 :デフォルトの名無しさん:02/08/20 21:21
>>741
(define (kons x y)
 `(,x . ,y))

743 :デフォルトの名無しさん:02/08/20 21:22
>>741
ほう! car, cdr はプリミティブ手続きではなくライブラリ手続きだったのか。

744 :デフォルトの名無しさん:02/08/20 21:25
consもか・・・なるほどなるほど。そんなこと思い付きもしなかったな。凄い凄い。

745 :デフォルトの名無しさん:02/08/21 02:36
SECDR-Scheme
http://www.42ch.net/UploaderSmall/source/1029864917.dat

746 :デフォルトの名無しさん:02/08/21 02:39
龠 λλλλλ....サザエサーンハ ユカイダナー


747 :738:02/08/21 14:39
>>745 さん

ありがとうございます。頂戴いたしました。
ようやく拝見することができ、感激しております。

お手数をお掛けしてしまい、すみませんでした。

739 さんを始め、皆様には大変ご迷惑をおかけしました。
お詫びになるかどうかわかりませんが、Javascriptで
作成されたSECDマシンが紹介されているページです。

ttp://www2.neweb.ne.jp/wd/michiaki/lambda.html

お騒がせしてしまい、すみませんでした。


748 :デフォルトの名無しさん:02/08/21 20:25
sicp日本語81ページのtransform-painterがなにやってのか
わかりません。よって、おしえてください。

本文の図形言語のコード+rubyによる描画アプリを↓にうpしました。
http://www.geocities.co.jp/SiliconValley-Cupertino/3100/sicp/pictlang/impl.tar.gz

749 :デフォルトの名無しさん:02/08/23 07:45
lisp使って自動プログラミングさせたりとかやってる人いません?
要件入れると適当なコードが出てくる様なやつ。
そこまですごいことはできないのかな。

750 :デフォルトの名無しさん:02/08/23 21:39
自動プログラミングって何?

751 :名無しさん:02/08/24 01:09
つーか自動プログラミングなら要件なんか入れないで自分で考えるだろ。

752 :デフォルトの名無しさん:02/08/24 03:25
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の処理系ってあるの?

756 :デフォルトの名無しさん:02/08/24 16:04
clisp

757 :デフォルトの名無しさん:02/08/24 16:22
Alleglo Common Lispもなかったっけ

758 :デフォルトの名無しさん:02/08/24 16:44
じゃあunixのlisp処理系はナニがある?

759 :デフォルトの名無しさん:02/08/24 16:46
アレグロ馬鹿高いので、だめぽ

760 :デフォルトの名無しさん:02/08/24 16:53
フリーが(・∀・)イイ!!

761 :名無しさん:02/08/24 19:52
>>755
http://www.jsdlab.co.jp/~kamei/
にある xyzzy というエディタは Windows 用の clisp 処理系
を搭載している。

http://www.geocities.co.jp/SiliconValley-Oakland/1680/xyzzy_lisp.html
んで、ここに遊びかたが書いてあるから、しばらく遊んで、次からは
検索してから書き込むようにしようね。

762 :デフォルトの名無しさん:02/08/25 00:20
cmuclマンセー

763 :デフォルトの名無しさん:02/08/25 01:10
ガイシュツ?
ttp://members.tripod.co.jp/zzyyb/


764 :デフォルトの名無しさん:02/08/25 01:28
Franz Lisp

765 :デフォルトの名無しさん:02/08/25 01:30
gcl
clisp

766 :デフォルトの名無しさん:02/08/25 01:41
>>763
「SCMソースハック」がいいですね。

767 :デフォルトの名無しさん:02/08/25 12:38
>>766
「日本人覚醒計画」もいいですね。

( ゚д゚) < 日本人が嫌いだ。


768 :デフォルトの名無しさん:02/08/25 13:16
common lispっつーのは何?結局処理系なの?

769 :デフォルトの名無しさん:02/08/25 13:26
>>768


↓に詳しく書いてあります。
http://www.ipa.go.jp/SYMPO/SYMPO99/pdf/1_61_5.pdf
http://www.google.co.jp/search?q=cache:0BUa6YDWFowC:www.ipa.go.jp/SYMPO/SYMPO99/pdf/1_61_5.pdf+common+lisp+scheme+%E6%96%B9%E8%A8%80&hl=ja&ie=UTF-8


770 :デフォルトの名無しさん:02/08/25 14:06
sbclは?


771 :デフォルトの名無しさん:02/08/25 15:51
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 は上のページに載っているマクロです。


772 :771:02/08/25 16:00
あ、すみません。何も考えずにコードのっけちゃいました。
上のやつは例の URL にあるやつそのままなので、そのサイトのやつを見てく
ださい。

あ、while2 とかなってるし…。それと下のマクロですが break のことしか考
えてなかったの忘れてました。break しかできません。


773 :デフォルトの名無しさん:02/08/25 16:05
continue/break付きwhileは過去ログにあるよ

774 :771:02/08/25 16:30
>>773
すみません、過去ログ調べてませんでした。
Part1 にある define-macro で書いてあるやつですよね。

define-syntax と syntax-rules では break のようなキーワードを使うマク
ロをどう書くんだろうと思って、cond のマクロ定義などを参考に考えていた
んですが分からなかったので質問したんですが。syntax-rules は難しいです
ね。define-syntax 使う人はあまりいなんでしょうか?

775 :デフォルトの名無しさん:02/08/25 16:38
>>771
R4RSの低水準マクロの例に載ってる loop-until-exit を改造すればいーんじゃない?

776 :デフォルトの名無しさん:02/08/25 16:41
>>774
syntax-rulesでは無理です。シンボルは呼び出し側から入力しないと、衝突を回避するために改名されちまいます。

777 :771:02/08/25 16:45
>>776
そうなんですか。cond の else みたいに syntax-rules の引数に渡せばでき
るのかと思ってました。
できないんであればおとなしく define-macro を使うことにします。

778 :デフォルトの名無しさん:02/08/25 16:49
>>777
else は束縛されてないから・・・
let の変数リストや lambda の引数リストでレキシカルに束縛すると、それを参照する識別子とトップレベルを参照する自由な識別子は別物になってしまうのです。

779 :デフォルトの名無しさん:02/08/25 20:04
・・・・gensymって何?

780 :デフォルトの名無しさん:02/08/26 05:40
ユニークなシンボルを生成するんだよ、ぼけ。

781 :デフォルトの名無しさん:02/08/26 13:00
syntax-rule/case使いこなしてる人いる?
なんかどう見てもdefine-macroのが簡単なんだが・・・
rule/caseのアドバンテージって、インテリジェントな
シンボル衝突回避ぐらいでしょ?

782 :デフォルトの名無しさん:02/08/26 21:50
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 は定まらない → コンパイル時には展開できない → 実行時に展開ということになるのですけれど、理解あってます?

783 :デフォルトの名無しさん:02/08/26 23:11
>>782
;; 間違ってるかもしれないのであまり信用しないでちょ…

実際に実行してみましたか?この場合 bar は引数を 1個要求するのでは?
で、compile のできる処理系では多分 compile 時に macro 展開しますが、
(bar #f) ;; とか書いてあるところを
(foo) ;; という形に書き替えるだけなので、
その時点で foo が定義されていようといまいと問答無用に展開するのではな
いでしょうか?


784 :782:02/08/26 23:50
> 実際に実行してみましたか?この場合 bar は引数を 1個要求するのでは?
あー、うー、ええと、ご指摘通り、実際には実行してみてません。間違ってるかも。
手元に define-macro の使える処理系がちょっと無くて・・・gaucheなら使える?入れてみよかな・・・
あのコードはその場の思いつきで書いたので適当です。言いたいことが伝われば。
自作の処理系に実装するのに、どういう形にするのがいいかなと考えてるです(まぁコンパイルといってもバイトコードです)。

・・・今思い付いた。Lisp の defmacro も調べてみよ。

785 :デフォルトの名無しさん:02/08/27 02:13
>>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を勉強し始めたのは良いのですが、
微分について考えろといわれ、わけがわからなくなってしまいました。
フィボナッチとか、ハノイの塔は理解できたのですが・・・。

くだらない質問ですみません。参考にしたいのでソースを下さい・・・。

787 :デフォルトの名無しさん:02/08/27 09:46
SICP のどっかにあったよ。

788 :786:02/08/27 10:22
>>787
探しているんですが、全然見つかりません。
微分って「Differentiation」で良いですよね?

789 :デフォルトの名無しさん:02/08/27 10:36
>>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)睨めばすぐわかるだろ?


791 : デフォルトの名無しさん:02/08/27 10:43
>>786
Common Lispでよければ。

(defun differential (x)
 (nreverse (maplist #'(lambda (x) (* (car x) (length x))) (reverse (cdr x)))))

792 :789:02/08/27 10:56
後半誤解でした。すみませぬ。

793 :786:02/08/27 11:12
皆さん、ありがとうございます。
先ほどから考えてはいるのですが、中々解決しません。
ですが、SICPなどで調べながら、何とかやってみます。

>>790
微分の問題などは苦手ですが、
一応、概念は分かっているので何とかなると思います。

>>789
入力形式も変えてやってみたいと思います。確かに不便そうなので・・・。

>>791 ありがとうございます。参考にさせていただきます。

794 :786:02/08/27 12:06
たびたびすみません。
「SICP2.3.2」の例題をを実行したいのですが、
(deriv exp var)にどのように入力すれば実行できるのでしょうか?

795 :デフォルトの名無しさん:02/08/27 12:10
>>789
ちゃんと逆順になってるよ。

796 :デフォルトの名無しさん:02/08/27 12:12
>>794
宿題スレじゃね─ぞ! (゚Д゚)ゴルァ

797 :デフォルトの名無しさん:02/08/27 12:13
2.3.2を全部読むと載ってますよ。
(deriv '(* x y) 'x)
とか。

# 英語版辛そう。がんがってください

>>795 >>792

798 :786:02/08/27 12:16
>>797
いや、それが書いてある通りに(deriv '(* x y) 'x)
とか入力しても、動かないんです。
reference to undefined identifier: variable?
と言われます。

DrSchemeを使ってるんですが・・・。

799 :795:02/08/27 12:17
>>797
…すまん、吊ってくる。

800 :デフォルトの名無しさん:02/08/27 12:32
宿題スレじゃないけど、lisp独習者の助けや自分の勉強にもなるだろうと
思って答えてるが、このレベルの質問はこれで最後ね。
典型的な 教えて君 的質問をされたので。

だから、2.3.2を全部読んでから来てくれ。SICPってそういう本なの。
いわゆるトップダウン方式の開発だから、下位の手続きが実装されるまで
実行できません。

> reference to undefined identifier: variable?
これも読めないのに英語版読むとは。日本語版買ったら?
defineされてない識別子 variable? への参照がある、って意味ね。

801 :786:02/08/27 12:36
>>800
すみません。出直してきます。
ありがとうございました。

802 :デフォルトの名無しさん:02/08/27 22:54
こんなのでしょ。
だれか末尾再帰になおして。

(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ならコンマ秒で変換できるだろうな。
宇宙刑事の蒸着並。

806 :デフォルトの名無しさん:02/08/27 23:18
変数名を考えるのに 5 分以上かかった。


807 :802:02/08/27 23:21
できなくてスマン。

808 :デフォルトの名無しさん:02/08/27 23:41
>>807
そう落ちこむな。
末尾再帰変換はある程度パターンがあるから
そのうち一条寺烈にもなれるよ。

809 :デフォルトの名無しさん:02/08/28 01:51
car とcdrってどう読むの?カーとシーディーアールでいい?

810 :デフォルトの名無しさん:02/08/28 01:52
ttp://www.f2.dion.ne.jp/~ryo.oka/html/cresteaju/enemy/boss4.html
ここの一番下参照。

811 :scheme 小僧:02/08/28 03:38
802 -> 803 のような変換は簡単だけど
意図が分かりにくくなるように感じて
自動的にやってくれないかなあと思うことがあります。
そんなことないですか?

812 :802:02/08/28 09:36
申し訳ないので他のやり方で作ってみました。

(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))))))


813 :デフォルトの名無しさん:02/08/28 14:41
>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理解するのに微分積分って知ってる必要ありますか?

815 :デフォルトの名無しさん:02/08/28 16:26
たぶんありません。

816 :デフォルトの名無しさん:02/08/28 16:27

>>814
一般常識としては理解する必要あります。

817 :デフォルトの名無しさん:02/08/28 16:29
関数言語っていうだけで、f(x)みたいなのはしらないとできないんですよね?
いや、当方shcmeってあんまり何か知らないんですが。そもそも関数型言語って
なにか知らないから。f(x)みたいなことですか?関数型言語って

818 :デフォルトの名無しさん:02/08/28 16:34
>>817
多分君には一生縁の無い言語

819 :デフォルトの名無しさん:02/08/28 16:46

「f(x)みたいなこと」とは何を指してるのか?

820 :デフォルトの名無しさん:02/08/28 18:19
>>818
まあそういうなや。>>817 は工房とかかもしれんし。
手続き型言語を教える前に関数型言語を教えろって話もあるくらいだし……。

だけど、厨房工房(あるいは文系)向きのscheme入門書ってあるかな?
複素数や関数を例題として使ったりしないヤツ。
そういうのは関数型の魅力が伝わらないから難しいかな。

821 :デフォルトの名無しさん:02/08/28 20:54
Schemeにおとといから参戦しました。よろしこ。
現在、おそらく初心者のだれもがつまづく(それとも俺だけ?)
「評価」を勉強中。
リストのボックス表記ってぱずるみたいでおもろいです。

822 :デフォルトの名無しさん:02/08/28 21:51
Scheme で「(f x) みたいなこと」を覚えました。
やる気と普通の脳味噌があればできる。

823 :デフォルトの名無しさん:02/08/28 23:28
リアル厨房です

824 :デフォルトの名無しさん:02/08/28 23:44
>>823
それがどうした?

825 :デフォルトの名無しさん:02/08/29 20:02
>>820
入門書としていいのはscheme手習いでしょうね。ってもう絶版?
リスト遊びはどうかな。elispだけど。

826 :デフォルトの名無しさん:02/08/29 22:32
>>824
>>820の「まあそういうなや。>>817 は工房とかかもしれんし」
に対する返答ではないかと思われーの。

827 :デフォルトの名無しさん:02/08/30 00:22
>>825
つーかさ、そう言うときは図書館利用しろよ。
入門書ならなおさら。絶版でも結構置いてあるよ。

828 :デフォルトの名無しさん:02/08/30 12:50
"The Structure and Interpretation of the
Computer Science Curriculum"
http://people.cs.uchicago.edu/~robby/publications/papers/htdp-sicp-fdpe2002.pdf
で、
コンピュータサイエンスの入門書としては
SICPより How to Design Programs の方が
優れていると主張しているけど、
How to Design Programs を読んだって言う話自体を聞かない。
オンラインで読めるのに。


829 :デフォルトの名無しさん:02/08/30 14:29
がんばって読んでみるよ。
SICPはどこまで読んだかわからなくなったし。

830 :デフォルトの名無しさん:02/08/30 14:34
http://www.kt.rim.or.jp/~qfwfq/rhiz-pi/
これ使ってる人いる?

831 :デフォルトの名無しさん:02/08/31 08:40
>>828
ソレ16ページしかないよぉ。
全部は読めないの?


832 :821:02/08/31 14:53
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の実現をおこないます?

833 :デフォルトの名無しさん:02/08/31 16:17
>>832
やりたい事が良く分かんないけど…こんな感じ?

(define (pop)
(if (null? *stack*) 'empty
(let ((x (car *stack*)))
(set! *stack* (cdr *stack*))
x)))


834 :デフォルトの名無しさん:02/08/31 17:11
>>832でもいいように思うけど・・・
局所変数はset!で変えられないの?

(define (pop)
(if (null? *stack*) 'empty
((lambda (x) (set! *stack* (cdr x)) (car x)) *stack*)))


835 :834:02/08/31 17:27
もうひとつ*stack*は消せたか。

(define (pop)
(let ((x *stack*))
(cond ((null? x) 'empty)
(else (set! *stack* (cdr x)) (car x)))))


836 :821:02/08/31 20:40
833さん、834さんどうもありがとうございます。
834さん、これだと思うとおりにうごきました。ありがとうございます。
>832でもいいように思うけど・・・
それがErrorがでるんですよ、SCMでもためしてみたんですが...

833さん、および834さんの835での回答ですが、
Letはまだ学習していない項目ですので、
そこをみてからためさせていただきます。
とりあえず先に礼をいいます。ありがとうございました。

837 :834:02/08/31 20:56
>>836
うちのSCMだと832でうまくいったよ。
なんでだろうねえ。


838 :821:02/08/31 21:26
う、漏れのうちまちがいか??
だとしたら、おお騒がせのおおばかもんか?おれ。


839 :デフォルトの名無しさん:02/09/02 12:01
'cons'の語源って、もしかしてconcentrationですか?
あ、でも綴りが違う。

840 :デフォルトの名無しさん:02/09/02 12:33
>>839
constructから。
Cf. John McCarthy: "History of Lisp", Feb. 1979.
http://www-formal.stanford.edu/jmc/history/lisp/lisp.html


841 :デフォルトの名無しさん:02/09/02 12:55
>>831
How to design programsを読むなら、
http://www.htdp.org/
から。

>>828
のは、論文か何か。内容は、

SICPは、色々な問題、プログラム、概念について書いてあるけど、
問題に対してどのようにプログラムを作っていけば良いのかについては
書かれていない。
SICPで扱われている問題の多くは数学や工学の特定の領域の知識が必要なので、
初学者はプログラムの事より数学とかの部分に時間を使わなければならない。
で、プログラムの問題と特定領域の知識の話をごっちゃにしてしまう。

みたいな感じかな。


842 :デフォルトの名無しさん:02/09/02 13:24
>>841
そこがSICPの面白いところだと思うが、それが邪魔なことも確かにあるわな。
"How to design programs"もよく出来てるな〜。

843 :839:02/09/02 19:35
constructでしたか。
ありがとうございました。

844 :デフォルトの名無しさん:02/09/03 00:35
lispで一行野郎ってないよな
例えばコマンドラインから-eで引数文字列を評価することにして、
lisp.exe -e "((lambda 〜)....)" < hoge.txt
とかさ
できなくはないんだろうけど、括弧とキーワードだけでかなり取られるし


845 :デフォルトの名無しさん:02/09/03 00:37
Lispで使い捨てのプログラムを作らない。

846 :デフォルトの名無しさん:02/09/03 01:53
>>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とか良く使いそうなのまで長いよ。
だれか短い名前考えて


849 :デフォルトの名無しさん:02/09/03 20:29
(define strcpy string-copy)
(define strlen string-length)
(define strcat string-append)
こんなんでどう?

850 :デフォルトの名無しさん:02/09/03 20:33
(define sr string-ref)

851 :デフォルトの名無しさん:02/09/03 20:55
エディタで補完できれば問題なし

852 :848:02/09/03 20:58
>>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

853 :848:02/09/03 21:00
わ、切れてるよ・・・

↓他に考えた名前。
with-input-from-file -> wiff
with-output-to-file -> wotf
substring -> substr
lambda -> la
define -> de
define-macro -> dm

854 :848:02/09/03 21:08
続き
begin -> seq
display -> disp
newline -> eol
write-char -> putc
read-char -> getc
(display ...)(newline) -> (puts ...)
(la()...) -> (la0 ...)

855 :デフォルトの名無しさん:02/09/03 21:14
>>848
Arc の登場を待つ
http://www.paulgraham.com/arcll1.html

> ("hello" 2)
\l

856 :848:02/09/03 21:16
続き
char=? -> ch=
char-ci=? -> ci=
integer->char -> i2c
list->string -> l2s
number->string -> n2s
いちいち矢印書くのはめんどい。

ネタ切れ。

857 :848:02/09/03 21:18
>>855
それね、実際やるとバグだかなんなんだか
わかんなくなるよ。(eval改造して実験済み)

858 :848:02/09/03 21:54
最後。
単純に名前置き換えしただけだと、
あとで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
ttp://backno.mag2.com/reader/BackBody?id=200208170150000000095630000


860 :デフォルトの名無しさん:02/09/03 22:36
>>852-854
ええとね・・・いい加減、暗号じみてるから、やめたほうが・・・・
la とか de とか dm とか意味わからん。

861 :デフォルトの名無しさん:02/09/03 22:43
>>858
toplevel で define するんじゃなくて、 local に置き換えた方が便利そう。
名前がどんどん長くなってくのは、文脈とかの概念が使えないからだと思うし…
全体でやられると、本当に暗号になるからね…
名前空間が、もっと色々いじれたらいいんだけど…

862 :デフォルトの名無しさん:02/09/03 23:04
>>860
昔懐かしウィルオ・リスプはde,dmだったよ。たしか。

863 :デフォルトの名無しさん:02/09/03 23:08
つきつめるとTECOになるわな
そんでTECOでLispの処理系とかかいてください

864 :デフォルトの名無しさん:02/09/04 01:04
>>852
もしかして君職業キーパンチャー?


865 :デフォルトの名無しさん:02/09/04 02:41
いっそのこと、全部中置記法にして、文字セットも独自にして
記号をいっぱい増やして重ねうちとかできるようにすれば....


866 :デフォルトの名無しさん:02/09/04 03:26
Alleglo Common Lispってお値段はいくらぐらいなんですか?
使ってる人います?



867 :デフォルトの名無しさん:02/09/04 18:02
お値段は7桁中程です

868 :848:02/09/04 19:48
くだらないレスしかつかなくて悲しいよ

869 :デフォルトの名無しさん:02/09/04 20:15
>>868
それなり

870 :デフォルトの名無しさん:02/09/05 02:16
>お値段は7桁中程です

マジですか!!
会社でも買えないっすよ。
そりゃLISPが広まらないわけだ・・・


871 :デフォルトの名無しさん:02/09/05 06:59
(define (広める たくさんの人 Lisp)
(if (>= お値段 7桁中程) '広まらない
(begin (広める 隣の人 Lisp)
(広める (- たくさんの人 隣の人) Lisp))))


872 :デフォルトの名無しさん:02/09/05 10:22
www.schemers.org がいつもと違うのは何で?








873 :scheme 小僧:02/09/05 13:31
>>872
virtual host の設定しくってるみたいだね。
http://www.schemers.org/www.schemers.org/ ってやると
いつものがでてきます。
エラーも混じってるけど。

874 :デフォルトの名無しさん:02/09/05 14:05
使ったこと無いんでわからないんですが、
括弧の対応関係を表示できるエディタって、'#\('みたいなエスケープされた物
もちゃんと考慮されるんでしょうか?

875 :デフォルトの名無しさん:02/09/05 14:43
ものによるんじゃない。

876 :デフォルトの名無しさん:02/09/05 15:29
↑そんな解答だれにでもできると思う

877 :デフォルトの名無しさん:02/09/05 15:33
>>874
xyzzy0.2.2.227のLispモードは考慮してくれますた。

gvim(vim6.1.41)のは不完全ですた。
色はちゃんと付けてくれるものの、
対応する括弧へのカーソル移動の挙動が不審ですた。

878 :デフォルトの名無しさん:02/09/05 15:55
いつの間にか gauche-0.6.2-1 の deb がある。(゚д゚)ウマー

879 :デフォルトの名無しさん:02/09/05 16:17
今一番活発なのはGaucheの作者かな

880 :デフォルトの名無しさん:02/09/05 16:40
これどう?
http://www.flownet.com/gat/papers/lisp-java.pdf

881 :デフォルトの名無しさん:02/09/05 17:04
gaucheの.debってinfoがdirに登録される?
登録されない時ってどうすればいい?


882 :デフォルトの名無しさん:02/09/05 20:23
>>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
を使ってます。

886 :デフォルトの名無しさん:02/09/07 13:45
>>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)、完璧です。

888 :848:02/09/07 19:23
>>886
(de(read-from-string s)(wifs s(read)))
;with-input-from-string --> wifs

(read-from-string s)よりも、(wifs s(read))の方が短い。
わかるか?

889 :848:02/09/07 19:25
あ、感じ悪い書き方。
すまん。

890 :848:02/09/07 19:27
ちなみに
(dm (wifs s . body)
 `(with-input-from-string ,s(la0 ,@body)))

891 :デフォルトの名無しさん:02/09/07 20:12
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)"


892 :デフォルトの名無しさん:02/09/07 20:23
>>891
deとdmは定義した?


893 :デフォルトの名無しさん:02/09/08 13:30
>>888
> (read-from-string s)よりも、(wifs s(read))の方が短い。

(rfs s)の方が短い。
わかるか?

あ、感じ(略


894 :デフォルトの名無しさん:02/09/08 18:00
俺言語は自分の世界に引き込もって使え。

895 :デフォルトの名無しさん:02/09/08 19:25
あ、感じ悪い書き方。すまん。

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
こういうのあったら便利だと思うけど、どう?

897 :デフォルトの名無しさん:02/09/08 20:33
そもそも 'RECT って何さ。

898 :デフォルトの名無しさん:02/09/08 21:34
>>897
rectangle (長方形)

899 :デフォルトの名無しさん:02/09/09 00:48
RECT = 長方形としても >>896 はとっても意味不明なんですけど。

900 :デフォルトの名無しさん:02/09/09 01:51
シンボルの使い方とか間違ってるんだな。とりあえず。
それはいいとしても名前が意味不明。長さを示すのか座標を示すのか分からない。
お望みのコードを書いてやろうとして詰まった(藁

;;↓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)))

901 : デフォルトの名無しさん:02/09/09 02:38
>>900
ネタ? どうやったらそんな勘違いができるのか・・・
どう見たって>>896は構造体の情報を得るものだろ。

902 :デフォルトの名無しさん:02/09/09 09:29
>>901
>>900 のも構造体だと思うけど…
ああいう実装じゃ嫌なの?

903 :デフォルトの名無しさん:02/09/09 10:11
http://www.uri.sakura.ne.jp/~cosmic/yuno/develop/scheme/index.html

904 :デフォルトの名無しさん:02/09/09 10:42
>>901
趣味:2ch  特技:煽り
ですか? ちょっとCを知ってるからって何をやってるんだか。

>>902
バイナリファイルやAPIとのアクセスがスムーズなものが欲しいんじゃないかな。
自分も欲しいので考えているんだが・・・・・・はて?

905 :デフォルトの名無しさん:02/09/09 11:11
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するしかないと思いますよ。

908 :デフォルトの名無しさん:02/09/09 12:59
>>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
http://pc3.2ch.net/test/read.cgi/tech/1031559474/

913 :デフォルトの名無しさん:02/09/09 17:42
ちょっと早いですが
次スレです。

LISP Scheme Part6
http://pc3.2ch.net/test/read.cgi/tech/1031560687/

914 :デフォルトの名無しさん:02/09/09 19:04
mazi de hayai desu ne

915 :デフォルトの名無しさん:02/09/10 01:04
>>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のっててもいいじゃねえか!
とうちの会社のやつを洗脳したい気分。

でもどんなかんじの仕事? そんなに時間制約が厳しいのじゃないよね..


917 :デフォルトの名無しさん:02/09/10 11:14
LispOSをMachのOSサーバーとして実装しようと
息巻いてたScottさん、あれから元気にされてますか?

918 :デフォルトの名無しさん:02/09/14 19:43
保守age

919 :デフォルトの名無しさん:02/10/09 02:46
保守

920 :デフォルトの名無しさん:02/10/10 06:25
保守

921 :921:02/10/28 01:55
保守

922 :デフォルトの名無しさん:02/10/31 16:22
保守

923 :デフォルトの名無しさん:02/11/01 23:50
'メンテ

924 :デフォルトの名無しさん:02/11/02 18:53
ホシュ

925 :デフォルトの名無しさん:02/11/05 22:07
hos

926 :デフォルトの名無しさん:02/11/07 01:21
ホモ

927 :デフォルトの名無しさん:02/11/09 01:54
hosyu

928 :デフォルトの名無しさん:02/11/11 16:05
ほおう

929 :デフォルトの名無しさん:02/11/14 01:51
dag

930 :デフォルトの名無しさん:02/11/18 06:27


931 :デフォルトの名無しさん:02/11/19 01:28


932 :デフォルトの名無しさん:02/11/21 07:55


933 :デフォルトの名無しさん:02/11/23 11:47
龠 λλλλλ....サザエサーンハ ユカイダナー

934 :デフォルトの名無しさん:02/11/24 23:21
LISP サイキョー

935 :デフォルトの名無しさん:02/11/26 19:39
保守

936 :デフォルトの名無しさん:02/11/27 16:03
うひひ最下層・・

937 :デフォルトの名無しさん:02/11/29 19:55
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 !


938 :デフォルトの名無しさん:02/12/03 13:43
文法知ってるだけでプログラムが書けるんですか。凄い才能ですね。

939 :デフォルトの名無しさん:02/12/06 01:22
らむだっちゃ

940 :デフォルトの名無しさん:02/12/08 02:15


941 :デフォルトの名無しさん:02/12/15 04:00
ん、まだdat落ちしてないのか。

942 :デフォルトの名無しさん:02/12/20 17:23
終了
Pert 6へ


==============================================

943 :デフォルトの名無しさん:02/12/20 17:27
誘導
LISP Scheme Part6
http://pc3.2ch.net/test/read.cgi/tech/1040372403/l50

944 :デフォルトの名無しさん:02/12/21 02:41
↑誤誘導

945 :デフォルトの名無しさん:02/12/23 05:08
正誘導は >>913
そろそろ次々スレ


946 :デフォルトの名無しさん:03/01/09 02:58
ybb?

947 :デフォルトの名無しさん:03/01/09 03:40
宮崎はスーパーハカーのお友達がいるからこんなことしなくても関係ないだろ。

948 :デフォルトの名無しさん:03/01/09 04:22
>匿名性が失われたら

もう2ちゃんねるは疑似匿名掲示板です。
 

949 :デフォルトの名無しさん:03/01/09 13:58
特に問題ないっしょ。会社からとかでも

950 :デフォルトの名無しさん:03/01/09 14:39
2ちゃんねる が衰退していく

あるネット関連会社の社長は、
「いずれにしても2ちゃんねるは資金が底をつけば終わり。
あまり知られていないことだが、2ちゃんねる内部関係者によると今、
大手通信会社系が調査費名目で資金提供している。
だが、それが止まれば続けてはいけないだろう」
と証言する。
2ちゃんねるが判決によって力を失った場合、
資金提供の打ち切りも予想される。

http://ascii24.com/news/reading/causebooks/2002/07/01/636911-000.html


951 :デフォルトの名無しさん:03/01/09 17:42
======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
────────────────────────────

952 :デフォルトの名無しさん:03/01/10 08:33
>>521
素で選びましたが
な に
 
か?

953 :デフォルトの名無しさん:03/01/10 09:53
>>213
モーヲタは(・∀・)カエレ!!

954 :デフォルトの名無しさん:03/01/10 10:35
>>214
罠ですよ〜 罠(´Д⊂)

955 :デフォルトの名無しさん:03/01/10 11:05
>>566
>>566

956 :デフォルトの名無しさん:03/01/10 11:50
>>234
暇つぶしに役立ってるけど。

957 :デフォルトの名無しさん:03/01/10 12:20
pc3にも入れてくれ

958 :デフォルトの名無しさん:03/01/10 13:10


     言 い た い こ と も 言 え な い
           こ ん な イ ン タ ー ネ ッ ト じ ゃ


 

959 :デフォルトの名無しさん:03/01/10 15:33
> ハイエナ共の92%が鳥なので

マジすか。


仕事始めいってきます。


960 :デフォルトの名無しさん:03/01/10 17:01
悪いこと書かないから関係ないよ

961 :デフォルトの名無しさん:03/01/10 23:22
うぐぁ〜

962 :デフォルトの名無しさん:03/01/10 23:29
IP記録しようがしまいがしったこっちゃねえ!
俺は言う!












俺  は  無  職  で  童  貞  だ

963 :デフォルトの名無しさん:03/01/11 00:46
おまいら、これ見れ!
http://dailynews.yahoo.co.jp/fc/computer/2channel/

964 :デフォルトの名無しさん:03/01/11 00:52
えっと、無知で突っ込みを入れられるのを覚悟で。。

IPの記録が抑止にもなるなら、削除系の板のリモホ表示をやめて
みるのはどうでしょう。
依頼者のホストを削除板以外の板に晒されることもないでしょうし。

965 :デフォルトの名無しさん:03/01/11 10:14
つーかマジでいい加減に白よ

もう遅いし去るけど
「全然君達」わかってないね。
本当にわかっていないね。公安の中にスパイがいて話を聞いてるとは思えん(おき楽すぎて)
シャレにならない件とかあるから
管理人氏 色々と ログ等協議を願います。
キャッシュ、か。現金(謎

つーかもういいよ
何故か俺自身理解出来てないけど 本当に何故か皆さんが
ぼくを変に気になっている訳だろ。場合によっては天下の大マスコミ様までが。

以前から云ってる通り「早く」カタギしないとまずい。出来たら話だけ聞いて下さい


966 :デフォルトの名無しさん:03/01/11 10:48
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────

967 :デフォルトの名無しさん:03/01/11 11:40
管理費用が倍に増えちゃったのね

968 :デフォルトの名無しさん:03/01/11 12:15
逆にヤケになった馬鹿共が大暴れしたら、それはそれで面白い。
そういう祭りキボンヌ

969 :デフォルトの名無しさん:03/01/11 13:14
ぬんちゃく、か、、、



970 :デフォルトの名無しさん:03/01/11 13:43
2chが出来た当初なら大問題になっただろうけど
これだけ一般化しちゃうと問題ではなくなるのかもな
アングラな雰囲気は無くなったし、普通に利用する分にはIP記録されても困らん


971 :デフォルトの名無しさん:03/01/11 16:29
IPで個人情報が引き出せると思っている厨房を発見しますた

972 :デフォルトの名無しさん:03/01/11 16:36
【特別コラム】2ちゃんねるインサイドリポート
http://www.nikaidou.com/diary/index.html
http://www2.diary.ne.jp/user/166292/
http://www.nikaidou.com/bunko/2ch/01.html


973 :デフォルトの名無しさん:03/01/12 00:41
11 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:16 ID:rLfxQ17l
全レスです。

974 :デフォルトの名無しさん:03/01/12 00:52
2ちゃんねるも現実ですよ。

975 :デフォルトの名無しさん:03/01/12 03:29
【最後の砦】書き込めば今年合格できるスレ【神頼】
http://school2.2ch.net/test/read.cgi/kouri/1041636818/


976 :デフォルトの名無しさん:03/01/12 03:30
びっくらこいた

977 :デフォルトの名無しさん:03/01/12 10:58
タイーホか、そうか・・・
今のうちにエロ画像デリートしよう・・・
冷蔵庫のプリン食べよう。
もう、思い残す事は、ない・・・

978 :デフォルトの名無しさん:03/01/12 11:01
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。

二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm

ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。


979 :デフォルトの名無しさん:03/01/12 21:31
何度も訴えられたらたまらんからだろ


980 :デフォルトの名無しさん:03/01/12 21:35
>>マジレス(^_^;) ◆1Inrkvo4AY

そろそろ スルーして良いか?
お前ら("まともな2ちゃんのみんな"だっけ?)が
世界を制覇するのを楽しみにしてるよ!がんばってくれ!!

981 :山崎渉:03/01/13 19:04
(^^)

982 :デフォルトの名無しさん:03/01/13 23:35
↑逆夢だね。。。

278 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)