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処理系ない?

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

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)