CommonLisp Scheme Part13at TECH
CommonLisp Scheme Part13 - 暇つぶし2ch1:デフォルトの名無しさん
05/05/12 21:44:01
過去スレ
Part1: URLリンク(piza2.2ch.net)
Part2: URLリンク(pc.2ch.net)
Part3: URLリンク(pc.2ch.net)
Part4: URLリンク(pc.2ch.net)
Part5: URLリンク(pc3.2ch.net)
Part6: URLリンク(pc3.2ch.net)
Part7: URLリンク(pc5.2ch.net)
Part8: URLリンク(pc5.2ch.net)
Part9: スレリンク(tech板)
Part10: スレリンク(tech板)
Part11: スレリンク(tech板)
Part12: スレリンク(tech板)

関連リンクは>>2-10あたり

2:デフォルトの名無しさん
05/05/12 21:45:39
>>1
スレ立て代行して頂きまして、
どうもありがとうございました。。。

世の中、良い人も居るんだなぁ~とチョと嬉しくなりますた。

3:デフォルトの名無しさん
05/05/12 21:46:16
□参考リンク□

日本Lispユーザ会(日本語)
URLリンク(jp.franz.com)
ここにかなりの情報があります。
URLリンク(jp.franz.com)
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
URLリンク(www.sci.toyama-u.ac.jp)
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
URLリンク(www.geocities.co.jp)
判りやすいLISP入門サイト。

Schemeへの道(日本語)
URLリンク(www.stdio.h.kyoto-u.ac.jp)
ここはschemeの入門サイト。


4:デフォルトの名無しさん
05/05/12 21:46:28
□参考リンク□

日本Lispユーザ会(日本語)
URLリンク(jp.franz.com)
ここにかなりの情報があります。
URLリンク(jp.franz.com)
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
URLリンク(www.sci.toyama-u.ac.jp)
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
URLリンク(www.geocities.co.jp)
判りやすいLISP入門サイト。

Schemeへの道(日本語)
URLリンク(www.stdio.h.kyoto-u.ac.jp)
ここはschemeの入門サイト。

5:デフォルトの名無しさん
05/05/12 21:47:00
慶応の授業のページ・記号処理プログラミング 2001
URLリンク(buri.sfc.keio.ac.jp)

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

Scheme Hash(英語)
URLリンク(okmij.org)
S式でXMLを使える様にするSXMLなど

John McCarthy's Home Page
URLリンク(www-formal.stanford.edu)
LISPの生みの親、J・マッカーシーのページだそうです。

Association of Lisp Users
URLリンク(www.alu.org)
米国のLispユーザ会

6:デフォルトの名無しさん
05/05/12 21:47:30
□SICP関係□

SICP(英語)
URLリンク(mitpress.mit.edu)
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。

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

SICPの回答集
URLリンク(www.melt.kyutech.ac.jp)
URLリンク(pluto.aurorasd.co.jp)
URLリンク(www.ipl.t.u-tokyo.ac.jp)
URLリンク(www.sampou.org)

7:デフォルトの名無しさん
05/05/12 21:48:41
□その他□

Schemeで書かれた正規表現ライブラリ
URLリンク(www.cs.rice.edu)

幻の「入門Scheme」
URLリンク(www4.ocn.ne.jp)
オンラインで読める

各種scheme処理系をcygwin上からビルドする方法など。
URLリンク(www.geocities.co.jp)

Bit - Implantation compacte de Scheme
URLリンク(www.iro.umontreal.ca)
mini-schemeよりも小さい(?)bytecode変換系

Lisp 言語処理系: CAMPUS LIsP, Lemon version
URLリンク(aten.aial.hiroshima-u.ac.jp)
Cコードによるわずか1000行の実装

Cliki
URLリンク(www.cliki.net)
CommonLispのプログラムがたくさん紹介されているのでここを当たるべし。

8:デフォルトの名無しさん
05/05/12 21:49:14
encyCMUCLopedia
URLリンク(www.isr.ist.utl.pt)
cmucl以外でも有益なはず

CMUのLisp Repository
fURLリンク(ftp.cs.cmu.edu)
新旧様々なプログラムが置いてある

Tiny CLOS Tutorial
URLリンク(home.adelphi.edu)

Schemix
URLリンク(www.abstractnonsense.com)
Linuxのkernelへのパッチで、/dev/として扱えるTinyScheme

Bibliography of Scheme-related Research
URLリンク(library.readscheme.org)
Scheme関連の論文リンク集

9:デフォルトの名無しさん
05/05/12 21:50:32
その他よさそうなリンク

awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
URLリンク(www.accesscom.com)

Emacs Lisp 2
スレリンク(tech板)

* Hotdog Scheme URLリンク(rover.cs.nwu.edu)
 MS が金出してたみたい
* Bigloo URLリンク(www-sop.inria.fr)
 CLR 用のコードを吐けるようになったらしい

継続

なんでも継続
URLリンク(www.shiro.dreamhost.com)
Schemeへの道:継続
URLリンク(www.stdio.h.kyoto-u.ac.jp)
継続の使い方
URLリンク(www.geocities.co.jp)
継続の使用法
URLリンク(www.ice.nuie.nagoya-u.ac.jp)
CPS(継続渡しスタイル)の説明
URLリンク(www.csl.sony.co.jp)
Kahua: 継続ベースのアプリケーションサーバー
URLリンク(www.kahua.org)

10:デフォルトの名無しさん
05/05/12 21:51:06
仕様関係)
CLtL2: Common Lisp the Language 2nd edition
URLリンク(www-2.cs.cmu.edu)
CLHS: Common Lisp Hyper Spec
URLリンク(www.ai.mit.edu)
R5RS: Revised(5) Scheme(ja)
URLリンク(www.sci.toyama-u.ac.jp)

便利な情報リソース)
The Common Lisp Cookbook: いわゆる Cookbook
URLリンク(cl-cookbook.sourceforge.net)

小さい実装)
SECDR-Scheme: SECD machine model に基づく実装
URLリンク(lily.fan.gr.jp)
Minischeme: 1 ファイルに凝縮された Scheme 処理系
URLリンク(tinyscheme.sourceforge.net)
TinyScheme: Minischeme を色々弄ったもの
URLリンク(tinyscheme.sourceforge.net)
KI-Scheme, AM-Scheme, etc...
URLリンク(www.nifty.com)
LispMe: Palm 上で動く Scheme 処理系. これも SECD virtual machine.
URLリンク(www.lispme.de)

11:デフォルトの名無しさん
05/05/12 21:51:34
LISP Scheme Part9 (html化)
URLリンク(ruku.qp.tc)

独習 Scheme 三週間
URLリンク(www.sampou.org)
Schemeの教科書

よろずや
URLリンク(www.geocities.co.jp)
lispの実用的な情報が色々。

12:デフォルトの名無しさん
05/05/12 21:54:42
>>1-11 おつかれさまです

13:前すれ995
05/05/12 22:06:47
すまん駄目だった。
何も書かないってのはまずかったな。
かえってストレス溜まるわ。
>1乙

14:デフォルトの名無しさん
05/05/12 22:55:58
こいつらも貼っておこうぜ

Common-Lisp.net: 多くのプロジェクトがホスティングされてる
URLリンク(common-lisp.net)

Bill Clementson's Blog: Lisp関連の話題が中心のBlog
URLリンク(home.comcast.net)

Practical Common Lisp: S式の羅列で現実的な問題をどう解くのかそのギャップに悩まされてる人に
URLリンク(www.gigamonkeys.com)

15:デフォルトの名無しさん
05/05/12 23:02:53
>>13 乙です。

末尾再帰
(define fact
 (lambda (n)
  (letrec ((fact-tailrecursion
        (lambda (n prod)
              (if (= n 1)
               prod
               (fact-tailrecursion (- n 1) (* prod n)) ) ) ))
       (fact-tailrecursion n 1) ) )



上記の末尾再帰は、下記のiterationと等価。

(define fact-iteration
 (lambda (n)
  (do ((n n (- n 1))
     (prod 1 (* prod n)) )
     ((= n 1) prod) ) ) )


16:デフォルトの名無しさん
05/05/12 23:04:11
新スレわざわざ立てずとも、
末尾再帰最適化でなんとかならんのかw

17:デフォルトの名無しさん
05/05/12 23:07:54
継続があれば

18:デフォルトの名無しさん
05/05/12 23:09:10
とりあえず gc しときますね。

19:デフォルトの名無しさん
05/05/12 23:40:23
ゴミがまったくなかったらGCなんて無意味

20:デフォルトの名無しさん
05/05/13 09:23:04
ゴミのないものなどない
>1 乙

21:デフォルトの名無しさん
05/05/13 20:09:25
再利用できないゴミばっかだったらGCなんて無意味

22:デフォルトの名無しさん
05/05/14 22:25:15
                Prolog  →       …       → Progol
              /
μPlannner→Planner → Conniver→ Scheme → Common Lisp → ISO Lisp
              \      /      ▲このスレ
                Plasma  →    →    →    → ABCL → ...

Simula67→ Smalltalk70 → … → Smalltalk80 →     …          → Java , C# (w

目的指向プログラミング   論理プログラミング            帰納論理プログラミング
積み木の世界       Actor理論               並列オブジェクト 分散オブジェクト
                                                 マルチエージェント  セマンティックWeb

23:デフォルトの名無しさん
05/05/15 02:45:27
>>22は何?

24:デフォルトの名無しさん
05/05/15 02:55:24
gcされなくなるので参照しないこと

25:デフォルトの名無しさん
05/05/15 03:52:27
2ちゃんで異様に伸びてるスレって、
大抵ネイティブ住人はとうの昔に消えて、
荒しが初期のスレの拡大再生産してるだけだって噂、本当なんだな。

ここまで荒廃してるとは知らなかった。もうこねぇよ。じゃぁな


26:デフォルトの名無しさん
05/05/15 03:55:18
>>25は何?

27:デフォルトの名無しさん
05/05/15 04:07:19
>>22>>25

28:デフォルトの名無しさん
05/05/15 04:14:59
よくわかりませんが、ここに (gc) 置いときますね

29:デフォルトの名無しさん
05/05/15 10:32:03
>>22
いろいろ消し過ぎ....gcのバグか?

30:デフォルトの名無しさん
05/05/15 11:57:14
以下の処理が実行できない理由を教えて下さい。

(define a 33)
(letrec ((c a)(a 10)) c)


31:30
05/05/15 12:22:26
すみません。自己解決しました。

letrecで、cとaの未初期化領域が生成され、cには未初期化のaの値がはいる。
そのため、gaucheだと#undefがでてくる。

letrecの本質は、ローカル変数定義時にエラーを出さずに本体を実行するという部分にあるのですね。


32:デフォルトの名無しさん
05/05/15 12:29:16
>>31
 それは違う

33:デフォルトの名無しさん
05/05/15 15:51:50
recはrecurs-のrec

34:デフォルトの名無しさん
05/05/16 09:37:17
>>31
>letrecの本質は、ローカル変数定義時にエラーを出さずに本体を実行するという部分にあるのですね。
これは違うと思う。30の例はシンタックスエラーになるべきだと思うんだが。

> gaucheだと#undefがでてくる
ということは、もしかしてgaucheだと
(define a 33)
(letrec ((c a) (a 10))
 (set! c a)
 c)
--> 10
になるのかな?
そうなるとしたら、ちょっと不味いと思うんだが....どう?


35:デフォルトの名無しさん
05/05/16 09:41:09
>>34
それで10になるのは全然問題なさそうに思うんだけど、どうまずいの?


36:34
05/05/16 09:52:10
>>35
gaucheの#undefがどういう意味で出力されているのか知らないから聞いたんだけど、もしこれがletrec全体の評価結果として出力しているとしたら、これはシンタックスエラーを無視して実行していると思えたからなんだ。
これは、cにaを束縛しようとした時点で未定義変数への参照によるエラーが発生するべきだと思うからなんだけど....
これは正しいプログラムなら実行結果は同じになるからいいんだけど、schemeの勉強に使うにはちょっと不味いんじゃないかと思ったんだ。
実際、30は勘違いしたみたいだし。

37:デフォルトの名無しさん
05/05/16 10:43:01
補足:
R5RS 4.2.2 より
(letrec

38:デフォルトの名無しさん
05/05/16 10:46:37
補足:
R5RS 4.2.2 より
(letrec

39:デフォルトの名無しさん
05/05/16 12:11:05
>>36
エラーを出さなくてもR5RS違反ではないけどね。学習用として不親切ではあるな。



40:デフォルトの名無しさん
05/05/16 12:20:51
局所変数定義 letrec使ってエラーだエラーじゃないって?
頭が可笑しい人のレスか

41:デフォルトの名無しさん
05/05/16 12:32:23
letrec ではすべての局所変数が定義されてから初期化されますが、
初期化中に局所変数をアクセスするとエラーになってしまいますので注意。
すべての初期化が終わってからでないとアクセス出来ません。

letrec は、再帰関数を定義するのに使います。

(letrec
  ((fact (lambda (x) (if (> x 0) (* (fact (- x 1))) 1))))
 (fact 10))

42:デフォルトの名無しさん
05/05/16 13:15:00
学習用の DrScheme でもエラーにならないね。
(letrec ((x a) (a 1)) ...) を
(let ((x 未定義) (a 未定義)) (set! x a) (set! a 1) ...) のように展開
する実装では、チェックが難しいのかな。

43:デフォルトの名無しさん
05/05/16 13:36:54
エラーになる処理系ある?

44:デフォルトの名無しさん
05/05/16 16:07:24
SCM はエラー出すみたい。

45:デフォルトの名無しさん
05/05/16 21:36:19
>>9
>継続の使用法
>URLリンク(www.ice.nuie.nagoya-u.ac.jp)

これの学生さん卒業したのかな
2005 年 4 月以降どうなるか不明と書いてある

Bill Clementson's Blog も移動するみたいだね
URLリンク(home.comcast.net)

46:デフォルトの名無しさん
05/05/16 22:00:06
ああ。学生の頃の自分思い出して、やり切れない気持ちになった。
特にLispって研究テーマにはなりにくいよなぁ。
最近は、ソフトウェア実装屋を対象とした学部/研究科が増えてるらしいけど。

俺の友人で、どうしても哲学をやりたくて、社会人入学した香具師がいる。
まだ数年前、塾だか予備校で飯代稼ぎながら、いろいろ模索してた。
そこまで真剣に学問の道を考えるなら、きっと誰か拾ってくれるでしょ。と祈りたい(w

47:デフォルトの名無しさん
05/05/17 02:55:59
どっかで見た話題だなあと思ったら、似たのが sicp の練習問題にあるね。
letlec じゃなくて internal define だけど。
URLリンク(mitpress.mit.edu)

確か r6rs では internal define と関連して letlec* が追加されるとかいう話だけど、
未束縛の変数に左から順に set! していく、て実装だったら
そっちの方がやってる事に即している感じはするな。

48:デフォルトの名無しさん
05/05/17 13:10:19
r6rsって出るのかなぁ

49:デフォルトの名無しさん
05/05/17 13:17:03
今議論してるんだから、出るだろ。そのうち。


50:デフォルトの名無しさん
05/05/17 22:52:50
R6RSに含まれる機能は何でしょう?
おれが欲しいと思ってるのは

・名前空間
(せめてパッケージ)はぜひとも導入して欲しい。
いつまでも大域letで囲むなんて馬鹿げてる。

・多値のファーストクラス化
インタプリタの延長みたいな実装がほとんどの現状で
多値を効率よく扱える手段がないとまともに使いたくない。
(let ((v (values 1 2 3)))
(if (values? v)
 (value-ref v 2) ;; => 3
 (error "excepted values"))
とか。
せめて上のvalues?のように関数の返す値が多値かどうか
呼び出し側で判らないと使い物にならないだろう。

・関数呼び出し側の名前つき引数。
VBのアレは便利だろ?

あと
・キーワード、定義済マクロ名の参照はエラーにする
くだらん論争の種を潰す。

とか。

51:デフォルトの名無しさん
05/05/17 23:18:59
URLリンク(www.schemers.org)

52:デフォルトの名無しさん
05/05/17 23:39:22
>>51
>remove multiple values
正気かよ。

って、まだ決まってないのか。
消すんじゃなくて発展させる方向に行かないかね。
副作用記述減らせる手段の1つなのに。

53:デフォルトの名無しさん
05/05/17 23:49:43
>>50
> ・名前空間
> ・関数呼び出し側の名前つき引数。

Common Lisp で幸せ

54:デフォルトの名無しさん
05/05/17 23:51:41
いや、CommonLispに転向するぐらいならLISP辞めたほうがマシ

55:デフォルトの名無しさん
05/05/17 23:52:37
以降、CL厨が暴れます。。。

56:デフォルトの名無しさん
05/05/17 23:58:10
R6RS より CLtL3 をやってほしい

57:デフォルトの名無しさん
05/05/18 00:03:09
>>54
>副作用記述減らせる手段の1つなのに。
詳しく。

58:デフォルトの名無しさん
05/05/18 00:19:04
リスト内包表現が簡単に書けた。拡張可能だしhaskellより便利になり得る。
(define-syntax %inner-tuple
(syntax-rules (<-)
((_ (<- ret) form var val rest ...)
(%inner-tuple ret (set! ret (cons form ret)) var val rest ...))
((_ ret form () ()) (let ((ret '())) form (reverse! ret)))
((_ ret form (pred rest-var ...) (<- rest-val ...))
(%inner-tuple ret (if pred form) (rest-var ...) (rest-val ...)))
((_ ret form (var rest-var ...) (val rest-val ...))
(%inner-tuple ret
(let lp ((lis val))
(if (null? lis) '()
(let ((var (car lis))) lis
form (lp (cdr lis)))))
(rest-var ...) (rest-val ...)))
((_ ret form (var ...) (val ...) (var1 <- val1) rest ...)
(%inner-tuple ret form (var1 var ...) (val1 val ...) rest ...))
((_ ret form (var ...) (val ...) pred rest ...)
(%inner-tuple ret form (pred var ...) (<- val ...) rest ...))
))
(define-syntax tuple
(syntax-rules ()
((_ form args ...)
(%inner-tuple (<- ret) form () () args ...))))
(tuple (cons i j) (i <- (iota 10)) (j <- (iota 10)))

59:デフォルトの名無しさん
05/05/18 03:22:06
クロージャ用シンタックスシュガー?

60:デフォルトの名無しさん
05/05/18 05:09:08
多値なんて (関数引数と戻り値の対称性に関する神学的な論争を除けば)
パフォーマンスハックにすぎないんだから、ファーストクラス化しちゃったら
唯一のメリットが失われるじゃん。
>>50 みたいに扱いたいならリスト返すか、(receive v (values 1 2 3) ...)
で受ければいいだけだしさ。


61:デフォルトの名無しさん
05/05/18 23:48:39
神学的な論争こそがschemeの本質なのに!

62:デフォルトの名無しさん
05/05/19 00:00:16
否定はすまい

63:デフォルトの名無しさん
05/05/19 00:14:04
……………… き り と り せ ん ………………

64:デフォルトの名無しさん
05/05/20 01:34:32
合理性 → HASKELL
神学的論争 → SCHEME
実用性 → その他

65:デフォルトの名無しさん
05/05/20 02:10:31
実用性 → Common Lisp に決まってる

66:デフォルトの名無しさん
05/05/20 03:57:47
……………… き り と り せ ん ………………

67:デフォルトの名無しさん
05/05/20 22:23:21
久々にSchemeインタプリタ作った
やっぱええわ

68:デフォルトの名無しさん
05/05/20 23:25:37
久々にCommon Lispコンパイラ作った
やっぱ疲れるわ <湯浅>

69:デフォルトの名無しさん
05/05/20 23:31:35
「ええ、PM経験した僕も、一昨年は近山PMの下でスーパークリエータとしてデビューしました。
 はぎゃー君も誘ったんだけど、彼は真面目だから付き合ってくれませんでした。
 成果物は国際学会の発表ネタに使いまわしたんですけど、
 サスマン教授は『素晴らしい。是非このロボを譲ってくれないか』って激賞されちゃいましたよ」

だいたいマジ

70:デフォルトの名無しさん
05/05/21 00:09:28
おとなげない

71:デフォルトの名無しさん
05/05/21 00:17:04
いみふめ。

こだわらずに楽しい事をやろうとする精神、
そして応募して採択されたもん勝ちだよんとアピールする姿に、
なんか楽しくなっちゃったけどなw

72:デフォルトの名無しさん
05/05/21 00:23:16
重要なのは、言語でなくライブラリだよ

73:デフォルトの名無しさん
05/05/21 00:28:59
>>72
だよねー

74:デフォルトの名無しさん
05/05/21 00:42:32
また頭悪そうなのが粘着しはじめたな

75:デフォルトの名無しさん
05/05/21 01:46:28
言語仕様(意味論込)として、scheme 以上にすっきりした言語
ってなにがありんすか?


76:デフォルトの名無しさん
05/05/21 01:48:10
○ransk?

77:デフォルトの名無しさん
05/05/21 02:03:40
アセンブリ

78:デフォルトの名無しさん
05/05/21 02:05:48
万能チューリング機械

79:デフォルトの名無しさん
05/05/21 02:10:23
brainf*ck

80:デフォルトの名無しさん
05/05/21 02:25:38
>>50
>・名前空間
>(せめてパッケージ)はぜひとも導入して欲しい。
>いつまでも大域letで囲むなんて馬鹿げてる。
遅レスすまそ。let使ってパッケージもどきを作る方法があるの?
Schemeだとlet内でdefineしてもグローバルに反映されないから無理だと
思ってたんだけど(Common Lispならできる)。
モジュールじゃおおげさな時に使いたいので教えて。


81:デフォルトの名無しさん
05/05/21 07:56:06
横スレだが、わたしゃこうしてる。
(define export:foo #f)
(let () (define foo ...) ... (set! export:foo foo))
(define foo export:foo)

82:デフォルトの名無しさん
05/05/21 09:15:39
それならグローバルなハッシュテーブルに詰め込んでおく方が。

パッケージとは別に、CommonLisp風のset!(ローカルでunboundなら
グローバルにbindする)ができたら便利だとは思うが、Schemeじゃ多分無理。

83:デフォルトの名無しさん
05/05/21 09:29:09
俺はこうかな
(define foo #f)
(define bar #f)
(let ()
 (define hoge ...)
 (set! foo (lambda (...)...))
 (set! bar (lambda (...)...))
)
でも、最適化が効きにくくて>>81より遅くなりそうだな...(考え中)

>それならグローバルなハッシュテーブルに詰め込んでおく方が。
それってどんなやりかた?

84:デフォルトの名無しさん
05/05/21 11:15:02
えぇー、scm.libとかでやってる方法がデフォルトだと思ってた

85:デフォルトの名無しさん
05/05/21 11:20:08
(make-hash-table xxx-package)

(let (pi 3.141692)
(define hoge ...)
(hash-table-put! xxx-package 'foo (lambda (...) ...))
(hash-table-put! xxx-package 'bar (lambda (...) ...))
)

(define foo (hash-table-get xxx-package 'foo))
(define bar (hash-table-get xxx-package 'bar))

>>83 こんな感じ。実際こうやって使ったことないからちゃんと動くかわからないけど。
>>84 それはパッケージ管理?CommonLisp風のset!の提供の方?

86:84
05/05/21 11:40:44
>>85
パケージ管理の話してるんだろ、ここ?

87:84
05/05/21 11:57:22
slibの話のつもりだったんだけど・・・あれ?パッケージ管理してねぇや。。。スレ汚しすまそ

88:デフォルトの名無しさん
05/05/21 11:58:31
slibの話のつもりだったんだけど・・・あれ?パッケージ管理してるけど名前空間は分けてないや。。。スレ汚し^2すまそ

89:デフォルトの名無しさん
05/05/21 12:11:23
つまらんことで悩んでないで Common Lisp 使え

90:デフォルトの名無しさん
05/05/21 12:14:26
うぜ

91:83
05/05/21 15:17:48
>>85
なるほどそういう使い方があったのか THX!
すると例えば
(define-syntax define-package
 (syntax-rules (export)
  ((_ pkgname (export id ...) body ...)
    (begin (define pkgname (make-hash-table))
     (let ()
      body ...
      (hash-table-put! pkgname 'id id) ...)
     (define id (hash-table-get pkgname 'id)) ...))))
とやって
(define-package foo-package
 (export foo bar)
 (define hoge 9)
 (define foo (lambda (x) (- x hoge)))
 (define bar (lambda (y) (+ y hoge))))
とすれば
hoge => #unbound
(foo 10) => 1
(bar 10) => 19
となるわけか。
実装に依存したくない時はいいかも!


92:デフォルトの名無しさん
05/05/21 16:11:17
hash-table自体が実装に依存する罠
まあ後付で作れるけどさ

93:デフォルトの名無しさん
05/05/22 03:54:25
すごく遅くてもいいならalist使えばいい。


94:ミミ
05/05/22 19:28:26
Scheme でクラスを定義する場合、
メンバ変数の命名規則はどうしていますか?

Java や C++ だと m_var とか _var とか var_ とかで
命名すると思いますが、Scheme でアンダースコアは
あまり使われませんよね。

95:デフォルトの名無しさん
05/05/22 22:43:35
>>94
そうでもない。アンダースコアも普通に使うよ。

96:デフォルトの名無しさん
05/05/22 22:55:17
入力したlistを整数倍してlistで返すにはどうすればいいんですか?(list 3 4) → (list 6 8) みたいな感じです。
consでかえるようにならできたんですが。

97:デフォルトの名無しさん
05/05/22 22:56:18
map

98:デフォルトの名無しさん
05/05/22 22:58:57
>>96
(map (lambda (elt) (* elt 2)) (list 3 4))
--> (6 8)
ってことかな?

99:デフォルトの名無しさん
05/05/22 22:59:39
((cut map * 2 <>) '(3 4))
=> (6 8)
cut :: SRFI 26: Notation for Specializing Parameters without Currying


100:デフォルトの名無しさん
05/05/22 23:02:09
(map (lambda (n) (* n 2)) (list 3 4))
LISPなど全く知らない俺が適当に書いてみました

101:デフォルトの名無しさん
05/05/22 23:16:22
(define-syntax m-list
 (syntax-rules ()
  ((_) ())
  ((_ dat ...) (list (* dat 2) ...))))
(m-list 3 4)
--> (6 8)

102:デフォルトの名無しさん
05/05/22 23:23:36
(define-syntax rewrite-list
 (syntax-rules (list)
  ((_ n (list dat ...))
  (list 'list (* dat n) ...))))
(rewrite-list 2 (list 3 4))
--> (list 6 8)

103:ミミ
05/05/22 23:28:13
>>95
クラスのメンバ変数をアンダースコアで命名していますか?

104:デフォルトの名無しさん
05/05/22 23:36:35
クラスのメンバ変数など存在しない

105:デフォルトの名無しさん
05/05/22 23:46:45
ハイフォンが使えるのにアンダースコア使う理由って何?
と、LISPなど全く知らない俺が適当に聞いてみる

106:ミミ
05/05/22 23:50:28
>>104
どういうこと?

107:デフォルトの名無しさん
05/05/23 00:03:56
>>105
単に単語の区切りの意味でハイフンは使うから区別したいんじゃね?

108:デフォルトの名無しさん
05/05/23 00:08:48
>>107
わかるようなわからんような、実例プリーズ

109:デフォルトの名無しさん
05/05/23 03:27:32
すみません。scheme というか lisp 初めたばかりなのですが、
list と cons の意味がわかりません。
(cons 1 2) と (list 1 2) はどう違うんでしょうか。
両方とも car と cdr の結果は同じですよね?


110:デフォルトの名無しさん
05/05/23 03:36:08
>>109
car は同じだけど、 cdr は違うよ。

(car (cons 1 2))
1
(cdr (cons 1 2))
2

(car (list 1 2))
1
(cdr (list 1 2))
(2)


111:デフォルトの名無しさん
05/05/23 04:07:51
はい。
(cdr (list 1 2))
が (2) になるのはどういった理由かわからないのです…


112:デフォルトの名無しさん
05/05/23 04:18:46
あぁ、pair と list の項目を読んでみたら、なんとなくわかった気がします。
スレよごし、スミマセン。


113:デフォルトの名無しさん
05/05/23 08:34:12
>>112
cons は「core」で、list は「library」みたいな区別をしてみるのもいいかも.
「library」は「core」から導くことができるんだね. 例えば
list は (lambda x x) と等価とかね ( もちろん lambda は「core」).
後になって、define-syntax とかでマクロを組むときに、きっと役に立つよ.

雑談スマソ

114:デフォルトの名無しさん
05/05/23 09:25:14
わざわざオレ用語で説明せんでも。


115:デフォルトの名無しさん
05/05/23 11:07:33
>>113
lambda は「library」でいいじゃん
(define-syntax λ
(syntax-rules ()
((_ formals body1 body2 ...)
(let-syntax ((dummy (syntax-rules () ((dummy) #f))))
(define (proc . formals)
body1 body2 ...)
proc))))

116:3歳児
05/05/23 11:13:33
たんなることばのもんだいだと思いまちた

117:デフォルトの名無しさん
05/05/23 17:04:35
>>111
(cadr (list 1 2))が2になる、って言ったら解る?
(car (cdr (list 1 2)))と同じ。

あと、(list 1 2)は(cons 1 (list 2))と同じ

図で描くと解りやすいけど、図入りの本は持ってないの?

118:デフォルトの名無しさん
05/05/23 17:11:34
最もプリミティブなのは点対だからね。
(a b c) ってのは (a . (b . (c . ()))) の略だということを思い出そう。

119:3歳児
05/05/23 17:15:23
このすれのれべる、がくっとさがりまちたねぇ

120:デフォルトの名無しさん
05/05/23 17:28:09
>>114
R5RS読めば?

121:デフォルトの名無しさん
05/05/23 18:09:23
R5RSの「primitive」のことを「core」なんて命名してるからオレ言語と
揶揄されてるんじゃないの?

122:Scheme 初心者
05/05/23 23:57:52
>>115

define は lambda を使って定義できると思うのですが・・・

123:デフォルトの名無しさん
05/05/24 00:08:48
>>122
つか (define (f args...) body...) って (define f (lambda (args...) body...) の省略形だから(ry

124:デフォルトの名無しさん
05/05/24 00:21:28
let も lambda で書ける

125:112
05/05/24 00:40:23
>>115 >>123

1変数関数の場合で、例えばフィボナッチ数列を
求める関数をdefineを使わないで定義したいときは、

(((lambda (f)
((lambda (p)
(f (lambda (arg) ((p p) arg))))
(lambda (p)
(f (lambda (arg) ((p p) arg))))))
(lambda (fib)
(lambda (n)
(if (<= n 1)
1
(+ (fib (- n 1)) (fib (- n 2)))))))
10)

で定義できるから、lambdaがprimitiveでdefineはlibraryじゃないの?
マジで初心者だから教えてよママン!

126:デフォルトの名無しさん
05/05/24 01:53:11
>>125
基本的には正しい。lambdaがあれば変数の束縛もできるからdefineの代用になる。

127:デフォルトの名無しさん
05/05/24 02:18:50
トップレベル以外はな

128:デフォルトの名無しさん
05/05/24 08:02:54
トップレベルもset!があればR5RS的には○。IEEE的には●でなかったっけ?

129:デフォルトの名無しさん
05/05/24 09:21:37
R5RSだと、define で割り当てされてないと set! はエラーじゃなかったっけ

130:?デフォルトの名無しさん
05/05/24 11:52:15
R5RS 5.2.1 の最後の段落の日本語訳によれば
「Schemeの実装によっては、初期環境として、可能なあらゆる変数がなんらかの場所に束縛されており、そしてその場
所の大多数が未定義値を入れている、という環境を使う。このような実装ではトップ・レベル定義は代入と全く等価である。」
とあるんだけど....
これはそういう実装でもかまわないって意味なのかねぇ?

131:デフォルトの名無しさん
05/05/24 11:59:00
そういうこと。


132:デフォルトの名無しさん
05/05/24 16:24:30
手元の処理系 (Gauche、Guile、PLT Scheme) では、未定義変数の参照、変更
はいずれもエラーになったな。>>130 からするとエラーにしなくてもかまわない
みたいだけど、そういった処理系ある?

133:デフォルトの名無しさん
05/05/24 19:45:26
petite chezではエラーにならないようだ。
SCMもオプションでそうできた記憶があるけど未確認ですまぬ。

134:デフォルトの名無しさん
05/05/24 21:25:05
schemeのquasiquote書いてみました。これで合ってます?

(define-syntax qq
 (syntax-rules (quote quasiquote unquote unquote-splicing)
  ((qq x)           (qq "in" 0 x))
  ((qq "in" lv (quote x))   (list 'quote (qq "in" lv x)))
  ((qq "in" lv (quasiquote x)) (list 'quasiquote (qq "in" (1 . lv) x)))
  ((qq "in" 0 (unquote x))   x)
  ((qq "in" (1 . lv) (unquote x))
   (list 'unquote (qq "in" lv x)))
  ((qq "in" 0 (unquote-splicing x))
   x)
  ((qq "in" lv ((unquote-splicing x) . xs))
   (append (qq "in" lv (unquote-splicing x)) (qq "in" lv xs)))
  ((qq "in" lv (x . xs))    (cons (qq "in" lv x) (qq "in" lv xs)))
  ((qq "in" lv #(x ...))    (list->vector (qq "in" lv (x ...))))
  ((qq "in" lv x)       (quote x))))


135:デフォルトの名無しさん
05/05/28 00:57:22
LISP の歴史
URLリンク(community.computerhistory.org)

INTERLISP の絵が可愛い

136:デフォルトの名無しさん
05/05/28 04:29:05
>>135
可愛いね。壁紙にしよう。

137:デフォルトの名無しさん
05/05/28 09:20:32
すごく2chのAAっぽいんだが。

138:デフォルトの名無しさん
05/05/28 09:24:53
>>137
2chのやりすぎ(w

139:デフォルトの名無しさん
05/05/28 15:42:08
>>136
壁紙には風太くんの写真だよ。

140:デフォルトの名無しさん
05/05/30 01:33:40
やった、LISP をものにしたぞ!

141:デフォルトの名無しさん
05/05/30 03:57:12
>>140
悟れた?

142:デフォルトの名無しさん
05/05/30 09:14:27
Windows/VC++版のGauche-0.8.3w-03公開記念age


143:デフォルトの名無しさん
05/05/30 22:20:33
あはは、やっとWindowsで動かないと糞だってことが透過したか
その調子でCMUCLのWindowsポーティングも頼むよ

144:デフォルトの名無しさん
05/05/30 22:32:25
>>143
取り敢えず、ここら辺りから頑張ってみれ。

URLリンク(www.caddr.com)

145:デフォルトの名無しさん
05/05/30 22:36:20
15年位前の記憶だけど、
CMUCLはKCLと違って、
RISC CPU (SPARC)専用にチューニングされてるから
Intelには移植しにくそう・・・つう風評を聞いたな。

146:デフォルトの名無しさん
05/05/30 22:39:08
こっちの方が良かったかな。

URLリンク(www.dridus.com)

一年もあれば何とかなるんじゃなかろうか。

147:デフォルトの名無しさん
05/05/30 22:44:37
いまどき、CMUCL移植までして動かすアプリって何なんだろ?
当時は 制約ベースのGUIツールキットとか、音楽関係で動かしたいアプリがあったような記憶があるけど。

148:デフォルトの名無しさん
05/05/30 22:47:00
>>146
もしかして、シグウィン上で動かしているの?
折れ、cygwin嫌いなんだよな。 昔、ノーパソに入れたら恐ろしく遅かったから。。
多分、日本語も今市だし。

149:デフォルトの名無しさん
05/05/30 22:48:13
いや、君が嫌いだろうと好きだろうと、俺は別に構わんが。

150:デフォルトの名無しさん
05/05/30 23:06:14
>>145
今でも CMUCL のメインのメンテナは SPARC 使いだね。
メインのプラットフォームは x86 と言って間違いないと思うけど。

151:145
05/05/30 23:07:54
>>144
なるほど。
SPARCベッタリのCMUCLとは別に、
移植性の高いCMUCLクローンを
Pythonベースのクロスコンパイラを種に
ブートストラップ方式で作る、つうプロジェクトっすか。

  CMU CL:カーネギー氏とメロン氏が鉄鋼業で貯めたお金で作った大学のCommon Lisp
  SB CL: 例の 鉄でガッポリ儲けた所が作ったのとよく似たCommon Lisp

っすか。なんじゃこのネーミングセンスはw

152:デフォルトの名無しさん
05/05/30 23:14:49
>>150 ・・・今じゃx86で動くんですか。DOS Extender時代(pre Linux時代)とは隔世の感だなぁ

153:デフォルトの名無しさん
05/05/30 23:22:13
ずいぶん前にSchemeのContinuationの実装方法をここで議論した事があったんだけど、
議論と思ってたのは俺だけ、実はお相手は随分なプロヘッショナルな方だったのね。
某所でプロが揃い踏みしてるの見て、ちょっとビビってしまった(いやいや俺もプロだし・・・何のプロだろう?

154:Schemer
05/05/30 23:22:18
Lisper からみたら Schemer ってどうみえるのでしょうか?
自分の中では、

 Lisp = 松下(統制されている)またはブリーフ(チソポが窮屈)
 Scheme = ホンダ (自由にしてる)またはトランクス(チソポがフリー)

という感じがする。

155:153
05/05/30 23:22:52
あらら、一瞬にしてレベルが低下してるし

156:デフォルトの名無しさん
05/05/30 23:31:50
Lisp遣い・・・・・・数式処理や並列計算、専用ハード設計、あと駅スパートシステムとかWebアプリのプロヘッショナル
Scheme遣い・・・実物見た事ないっす。厳選された奇妙な形のブロックでお城を建てる哲学者?

157:デフォルトの名無しさん
05/05/30 23:32:28
>>151
鉄はカーネギーで、メロンは銀行だよ。だからスチール(鉄)バンク(銀行)。
最近は SBCL の方が UNICODE やネイティブスレッドの採用など、CMUCL
よりも使い易くなってると思います。移植性も良いし。

SPARC は tagged arithmetic があるから Lisp コンパイラを作り易いという
話だけど、ユーザーベースから言ったらやっぱり x86 な訳で、開発者にも
Linux 使いが多い感じ。あと、意外にも Mac ユーザが多いっぽいね。

158:デフォルトの名無しさん
05/05/30 23:35:49
>>157
すまそ、Steel Bank Common Lisp Developper MLの一通目を斜め読みするのがやっとで、
バンクをなんとなく無視してますた。

> SPARCは tagged arithmetic
そうそうw 
SUN のSPARC関連論文漁ってると、SPARCは最初からLispのサポートを視野に入れていたとか見た。
・・・Java CPUは一体どうなったんだろう(w

159:デフォルトの名無しさん
05/05/30 23:37:05
>>154
Schemer: "Buddha is small, clean, and serious."
   Lispnik: "Buddha is big, has hairy armpits, and laughs."

Nikodemus 氏のシグニチャだけど、名言だね。

160:デフォルトの名無しさん
05/05/30 23:41:22
>>158
ググると、Lucid Common Lisp の為に用意されたって記述があるけど
真偽の程はどうでしょう。
Lucid の社長さんって Sun に居た気がしたけど、今どうしてるのかな。

161:デフォルトの名無しさん
05/05/30 23:53:24
>>159
綺麗でかわいいブッダと、
腋毛ボウボウの豪傑ブッダかよ!

科学では、少ない原則でより多くの事柄を説明できる理論を採用する。
すると、Schemeが示そうとしているScienceは一体なんなんだろう。。。

>>160
Lucid 社長・・・わかんない。名前は聞いた事あるけど。
最近、Lisperの臭いをくんくん嗅ぎ分けながら業界のたくってるんだけど、
Frantz社長の名前くらいしか聞かなかった。あとは元Symbolicsで今は紺猿の人とか。

162:デフォルトの名無しさん
05/05/31 00:06:15
閑話休題


163:デフォルトの名無しさん
05/05/31 00:42:03
Lucid は今の LispWorks じゃないかな。
以前評価したときは Allegro より高速だった(on x86)けど、日本ではマイナーかな。

164:デフォルトの名無しさん
05/05/31 07:51:23
tagged arithmeticって、何?

165:デフォルトの名無しさん
05/05/31 07:57:43
6月19日-22日に開催されるInternational Lisp Conference 2005のスピーカーリストには、
Richard Gabriel, Sun Labs (Menlo Park, CA)
って書いてある。現在も、Sunにいるらしい。
URLリンク(www.international-lisp-conference.org)

166:デフォルトの名無しさん
05/05/31 13:01:32
>>164
32bit wordの下位2ビットをタグとして扱うことができる。

167:flatline@Vim%Chalice ◆r6EONKKhcc
05/05/31 18:24:40
サイト移転しますた
URLリンク(user.ecc.u-tokyo.ac.jp)

168:flatline@Vim%Chalice ◆r6EONKKhcc
05/05/31 18:24:55
サイト移転しますた
URLリンク(user.ecc.u-tokyo.ac.jp)

169:デフォルトの名無しさん
05/05/31 18:38:51
・・・確かに「lispは25歳以下のスポーツ」と呼ばれるだけの事があるなw

170:デフォルトの名無しさん
05/05/31 20:01:18
>>169 それはつらいなあ.私はヘキサでもギリギリだ.

171:デフォルトの名無しさん
05/05/31 21:56:57
URLリンク(i.loveruby.net)

上のページの Y-Combinator を,練習を兼ねて Common Lisp に移植してみました.

(setf (symbol-function 'Y)
#'(lambda (f)
((lambda (proc)
(funcall f #'(lambda (arg) (funcall (funcall proc proc) arg))))
#'(lambda (proc)
(funcall f #'(lambda (arg) (funcall (funcall proc proc) arg)))))))


(setf (symbol-function 'fact0)
#'(lambda (f)
#'(lambda (n)
(if (zerop n)
1
(* n (funcall f (- n 1)))))))


(funcall (Y #'fact0) 5) => 120

...やっぱり大変だ,これ.もっといい書き方はないものでしょうか.


172:デフォルトの名無しさん
05/05/31 22:52:36
(setf (symbol-function ... はムリムリ感が強いなあ。

(defvar Y
(lambda (f)
((lambda (proc)
(funcall f (lambda (arg) (funcall (funcall proc proc) arg))))
(lambda (proc)
(funcall f (lambda (arg) (funcall (funcall proc proc) arg)))))))

(defvar fact0
(lambda (f)
(lambda (n)
(if (zerop n)
1
(* n (funcall f (- n 1)))))))

(funcall (funcall Y fact0) 5) => 120

173:デフォルトの名無しさん
05/05/31 23:07:36
>>172 なるほど,無理に関数側にセットするより,funcall を使う前提で変数
側にセットした方が,かえって自然ですね.

しかし,funcall が林立するのは,どうしようもないのかなあ.

174:デフォルトの名無しさん
05/05/31 23:13:58
evalが林立するよりはイイw

175:デフォルトの名無しさん
05/06/01 00:34:04
Gauche 0.8.4 キタ━━(゚∀゚)━━ッ!!


176:デフォルトの名無しさん
05/06/01 03:35:54
>>159
さしずめ Scheme 屋は三論の学僧で Lisp 屋は禅坊主ってところっすか。
仲が悪くてもしかたないな。

>>173
確かに関数をぐるぐる渡していくとなると面倒ですよね。
CPS とかでちょっと書いてみる位でも結構うんざりしたり。
#`(f ...) -> (funcall f ...) とかなリーダマクロでも書いてみるとか。あんま変わらないか。

177:デフォルトの名無しさん
05/06/01 11:10:12
私は Scheme から入ったのだけど,他の Lisp の良さも知りたいなあ.
Schemer と Common Lisper は仲が悪いみたいだけど,どちらも Lisp 文化の
主要な担い手なのだから.Scheme の方が短いコードでその優秀性を示しやす
いのか,こういう場では Scheme のよさが目立ちがちな気がする.だけど,
Common Lisp の優秀性もぜひお教えいただきたいものです.

自分の知っている例だと,かの「グリーンスパンの第10法則」のグリーンスパ
ン氏の blog から
URLリンク(philip.greenspun.com)

「Common Lisp はロバストで効率的.Scheme ではハイパワーマシンでもこな
せなかった処理を,Common Lisp だと非力なマシンでも成し遂げることができ
た」

こんな感じで,自分の知っている言語の良さを出し合っていけたらなあ,と思
うのです.Scheme や Common Lisp や,スレ違いだけど Emacs Lisp までも.

(Y-Combinator を Emacs Lisp に移植しようとして,動かない原因がしばら
くわからなかったのは秘密.気が付いてみたら当たり前.動的スコープだから
クロージャにならないのだもの...絶対に無理)


178:デフォルトの名無しさん
05/06/01 12:52:55
ところで,Common Lisp で,末尾再帰の最適化をやってくれる処理系って,ど
んなものがあるでしょうか?xyzzy がバージョンアップしたみたいなので,試
してみたのだけど,やっぱりスタック数40,000 程度でオーバーフロー.

(defun tail-rec (x y)
(if (<= x 0)
y
(tail-rec (- x 1) (+ y 1))))

(tail-rec 40000 0) => オーバーフロー

Petite Chez Scheme だったら 100,000,000 でも軽々動くのに.こういうのは
再帰にせず,堂々と loop で書くのが Common Lisp 的なのだろうか.

(define (tail-rec x y)
(if (<= x 0)
y
(tail-rec (1- x) (1+ y)))

(tail-rec 100000000 0) => 100000000


179:デフォルトの名無しさん
05/06/01 13:04:24
>>178
Allegro CLは大丈夫だったよ。

180:デフォルトの名無しさん
05/06/01 13:06:37
>>178
> ところで,Common Lisp で,末尾再帰の最適化をやってくれる処理系って,ど
> んなものがあるでしょうか?

インタプリタではほとんどの処理系がやってない。
コンパイラではほとんどの処理系がやっている。

181:デフォルトの名無しさん
05/06/01 13:10:37
clispもcmuslも大丈夫じゃない?
xyzzyのことはわからないけど、一般的にソースの頭に
(optimize speed)
と書いておくと末尾再帰をループ扱いしてくれるとか。
速度も上がるだろうしメモリも定量で済むはず。

182:デフォルトの名無しさん
05/06/01 13:58:05
>>178
CLispで試してみた。>>180氏の言うとおりだった。

[1]> (defun tail-rec (x y)
    (if (<= x 0)
      y
     (tail-rec (- x 1) (+ y 1))))
TAIL-REC
[2]> (tail-rec 40000 0)

*** - Program stack overflow. RESET
[3]> (compile 'tail-rec)
TAIL-REC ;
NIL ;
NIL
[4]> (tail-rec 40000 0)
40000
[5]> (tail-rec 10000000 0)
10000000

183:デフォルトの名無しさん
05/06/01 14:52:06
>>182
ディスアセンブルしてみませう。


184:178
05/06/01 17:11:03
ありがとうございます.今度 Debian に CLisp でもインストールしてみます.

Scheme だと
・まずは普通に再帰で書く
・うまく動くようになったら,末尾再帰にして最適化

という書き方をすることが多いですが,
Common Lisp だと加えて
・コンパイル

という一連のステップで行けばよいということですね.

さて,問題は xyzzy です.(optimize speed)も効かなかったし,残念ながら
バイトコンパイルしても最適化されませんでした.どのようにコーディングし
たら良いものか.やっぱり loop しかないのかなあ...と,そろそろスレ違い
ですが.


185:デフォルトの名無しさん
05/06/01 22:49:23
>>184
Common Lisp では末尾呼び出しの最適化が保証されてないんだから
特定の処理系に依存させたくないのなら
> Common Lisp だと加えて
> ・コンパイル
ではなく、繰り返しに展開しないと。

186:デフォルトの名無しさん
05/06/01 23:22:59
>>184
clisp + emacs + slimeでWin上でも結構快適と思うけど。emacsもxyzzyも
メモリ消費量は変わらない。 ディスク消費量はemacsの方が多いが。。

なぜかWin上では、clisp 2.33.2ではslimeが動かなかったので、2.33.1にしたら
ちゃんと動いた。

187:デフォルトの名無しさん
05/06/01 23:30:18
gauche 0.8.4 cygwin で (- (/ 1 2)) が-0.5にならないよ。 -1/2 (- 0.5) は ok

188:デフォルトの名無しさん
05/06/02 00:03:46
>>177
Y-Combinatorにはならないのだろうが、
lambdaだけで再帰を書くのなら動的スコープのほうが楽じゃない?
(funcall
((lambda (f) (lambda (x) (funcall f x)))
(lambda (x) (if (= x 0) 1 (* x (funcall f (- x 1))))))
5)

120

ところで自由変数使わずに束縛変数だけ使うのなら
動的スコープも静的スコープも一緒じゃないの?
ちょっとEmacs LispでY-Combinatorやってみるよ。

189:デフォルトの名無しさん
05/06/02 01:00:57
>>15 みたいな格好の閉じ方を初めて見たんだけど、手動でスペース開けてるのかな?
読みやすい様な、読みにくい様な...

しばらく真似してみよ.

190:デフォルトの名無しさん
05/06/02 04:31:42
>>184
トランポリンでも仕込んでみるってのはどう?

191:デフォルトの名無しさん
05/06/02 04:39:47
>>187
俺んとこではなるよ。そっちでは何が返ってるんだ?


192:デフォルトの名無しさん
05/06/02 09:12:17
>>190
今は「トランポリン」がイディオムの名前だってこと知らない人多いかもよ?


193:デフォルトの名無しさん
05/06/02 09:23:34
トランポリンというと、gccで入れ子関数を作ったときなどにスタックに
生成される小さなコードのことしか思い出さない。イディオムとしての
トランポリンてどういうの?

194:デフォルトの名無しさん
05/06/02 10:07:13
「なんでも継続」
URLリンク(www.shiro.dreamhost.com)
を参照してちょ


195:178
05/06/02 10:46:43
>>185
> ではなく、繰り返しに展開しないと。

うう,再帰を繰り返しに展開するのって,面倒くさいし,バグの元になりませ
んか?やっぱり,汎用性を目指すなら,初めから繰り返しで書いた方がいいの
かなあ.しかし,再帰のほうがきれいで扱いやすいし... Common Lisper の皆
さんは,普段どのようにお書きなんでしょうか?

>>188
> ところで自由変数使わずに束縛変数だけ使うのなら
> 動的スコープも静的スコープも一緒じゃないの?

それはないです.例えば >>172 の fact0 という関数は lambda 式を返すけど,
その式の最後の行の f は,fact0 の外に出たら,動的スコープだと何にも束
縛されなくなっちゃうでしょう?(と言うか,実行するとそのエラーがでる)

しかし,動的スコープの方が歴史的には古いのだから,もしかしたら動的スコー
プのための Y-Combinator が先に存在していたのかもしれません.私が知らな
いだけで.

>>192 今は「トランポリン」がイディオムの名前だってこと知らない人多いか
>もよ?

それは私です.Google検索したら見つかったのが「何でも継続」だったので赤
面.身になってないなあ.


196:178
05/06/02 11:08:23
>>186
> clisp + emacs + slimeでWin上でも結構快適と思うけど。

じつは,いろいろ思うところがありまして,将来的に個人的な環境をなるべく
Linux一本に移行したいと思っているのです.ただ,slime は全然知りません
でした.大変便利なものをお教えいただき,ありがとうございました.

URLリンク(www.geocities.co.jp)


197:デフォルトの名無しさん
05/06/02 12:31:34
漏れはWindowsでもEmacs(Meadow)だなぁ。xyzzyって使ったことないけど良いの?

198:デフォルトの名無しさん
05/06/02 14:02:50
emacsそのものが使いたいのでなければ、
Windows用のemacs風エディタとしてはかなり素敵。

199:デフォルトの名無しさん
05/06/02 14:12:00
Emacs を使う理由の半分以上は本物の Emacs だから、なんだよね。
豊富なライブラリがあるから離れられず、ダイナミックスコープ氏ねと
思いながら Emacs Lisp パッケージのメンテナンスをして、それが...
のスパイラル。

200:デフォルトの名無しさん
05/06/02 14:31:06
使ってみよかと思うが公式Webページは無いのか?>xyzzy

201:デフォルトの名無しさん
05/06/02 14:38:09
URLリンク(www.jsdlab.co.jp)
URLリンク(xyzzy.s53.xrea.com)

202:デフォルトの名無しさん
05/06/02 18:22:12
xyzzy は,とんでもなく非力なマシンでもそこそこ動いてくれるのがいい.

203:デフォルトの名無しさん
05/06/02 18:45:53
とことん非力って486でHDが100MBくらいのマシンのこと?
10年前のスペックだな。

204:デフォルトの名無しさん
05/06/02 20:16:41
さすがにそれはきびしいだろうけど、Windows98 が何とか動く程度のマシンなら、
普通に使えてる。確か Pentium の メモリ32メガ。


205:187
05/06/02 23:28:18
>>191
0.5 が返ります。
ちなみに WINXP HOME SP2 で gcc 3.3.3 。mingw版も駄目 Athron 650
(print (- (/ 1 2))) => 0.5
(print (- (- 1 2)))=> -1
(print (- (+ 1 2)))=> 3
(print (- (* 1 2)))=> 2
(print (- (expt 2 2)))=> -4
(print (- (- 1)))=> -1
(print (- (- (- 1))))=> -1
(print (- (+ (- 1))))=> -1
(print (- (and 1 1)))=> -1
(print (- (or 1 1)))=> -1
(print (/ (/ 1 2)))=> 2.0
(print (/ (- 1 2)))=> -1.0
(print (/ (+ 1 2)))=> 0.3333333333333333
(print (/ (* 1 2)))=> 0.5
(print (/ (- 1)))=> -1.0
(print (/ (- (- 1))))=> -1.0
(print (/ (+ (- 1))))=> -1.0


206:デフォルトの名無しさん
05/06/02 23:55:40
そこまで分かってるならふつーにバグ報告すればいいじゃない
ここに書く意図が分からない

207:デフォルトの名無しさん
05/06/03 00:34:01
バグ報告したことないし。

208:デフォルトの名無しさん
05/06/03 00:51:46
ソース確認して直せば即終了やん

209:デフォルトの名無しさん
05/06/03 13:02:21
xyzzy の話を引っ張るんですけど,確かに軽くていいエディタだと思います.
私も便利に使わせていただいてます.だけど,Common Lisp インタプリタとし
ては,ちょっと遅いのではないでしょうか?

;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp
(defun tarai (x y z)
(if (<= x y)
y
(tarai (tarai (1- x) y z)
(tarai (1- y) z x)
(tarai (1- z) x y))))

(tarai 12 6 0) => 12

これの実行に65秒かかりました.バイトコンパイルしても30秒.
(Celeron 2.6GHz, 756MB RAM)

Petite Chez Scheme なら1秒前後で終わるのですが.


210:デフォルトの名無しさん
05/06/03 13:15:29
tarai懐かしいな。
久しぶりに回してみた。((tarai 12 6 0) @ Athlon FX-55)

clisp インタプリタ 12秒
clisp コンパイラ 1.7秒
gcl インタプリタ 12秒
gcl コンパイラ 1.4秒

プチチーズ優秀だね。

211:209
05/06/03 13:46:23
なるほど,xyzzy Lisp が速いとは言えないけれど,比べた Petite Chez
Scheme が速すぎるから,びっくりするような相対値になったのですね.
Gauche とかだとどうなんだろう.

Emacs Lisp でも試してみようと思ったけれど,エラーになって動かない.
(error "Lisp nesting exceeds max-lisp-eval-depth")
Emacs はなかなかよく分かりません.

あと,野暮かも知れませんが,一応,
Chez Scheme     => しぇすきーむ
Petite Chez Scheme => ぷてぃとしぇすきーむ
Paul Graham     => ぽーるぐれあむ
が原音に近いのではないかと.


212:デフォルトの名無しさん
05/06/03 14:22:05
clisp 2.33.2: インタプリタ 15秒、コンパイラ 2.6秒
Emacs 21.3: インタプリタ 10.4秒、コンパイラ 4.7秒
Gauche 0.8.4: 3.3秒
SBCL 0.9.1: 0.4秒
(tarai 12 6 0) @ Pentium 4 2.4GHz

> (error "Lisp nesting exceeds max-lisp-eval-depth")
再帰の深さが変数 max-lisp-eval-depth を超えたってことなんで増やせばいい

213:210
05/06/03 15:28:20
defunの行とifの行の間に (declare (fixnum x y z)) を入れると gcl のコンパイラのみ
1.4秒→1.2秒になったがその他は変化無し。思ったほど効かないな。

214:デフォルトの名無しさん
05/06/03 16:18:46
>>212
cmuclの結果も知りたい。

215:デフォルトの名無しさん
05/06/03 16:38:47
lisp-worksでやってみた。
インタプリタだと66秒、コンパイルすると1秒以下になった。

216:212
05/06/03 17:03:28
>>214
CMUCL 19a:
インタプリタ: 92秒
コンパイラ: 0.55秒
コンパイラ (declare (type fixnum x y z)): 0.23秒
コンパイラ (declare (optimize speed)): 0.53秒
コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.23秒

SBCL 0.9.1:
コンパイラ: 0.42秒
コンパイラ (declare (type fixnum x y z)): 0.31秒
コンパイラ (declare (optimize speed)): 0.38秒
コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.21秒

217:209
05/06/03 20:23:37
いろいろな方にベンチを実行していただき,ありがとうございます.大変参考
になりました.

ところで,おまけとして,ラムダ式による遅延評価版を書いてみました.
(参考)URLリンク(www.shiro.dreamhost.com)

;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp
;;;遅延評価版
(defun tarai (x y z)
(if (<= (funcall x) (funcall y))
(funcall y)
(tarai (lambda () (tarai (lambda () (- (funcall x) 1)) y z))
(lambda () (tarai (lambda () (- (funcall y) 1)) z x))
(lambda () (tarai (lambda () (- (funcall z) 1)) x y)))))

こちらだと,引数が12 だとあっという間に終わってしまいますので,数字を
変えました.

(tarai (lambda () 192) (lambda () 96) (lambda () 0)) => 192

先ほどの条件で,xyzzy だと13秒程度でした.いささか極端な例とは言え,遅
延評価のありがたみを痛感します.


218:デフォルトの名無しさん
05/06/04 08:23:03
(defun tarai (x y z)
(let ((xx (funcall x)) (yy (funcall y)))
(if (<= xx yy)
yy
(let ((x (lambda () xx)) (y (lambda () yy)))
(tarai (lambda () (tarai (lambda () (- xx 1)) y z))
(lambda () (tarai (lambda () (- yy 1)) z x))
(lambda () (tarai (lambda () (- (funcall z) 1)) x y)))))))

219:デフォルトの名無しさん
05/06/04 13:02:22
xとyを遅延させる意味が無いように見えるんだが
と、LISPをまるで知らない俺が適当に言ってみる

220:デフォルトの名無しさん
05/06/04 13:31:58
無いね。z だけ遅延させるならこんな感じ?
(defun tarai (x y z)
(labels ((tarai-1 (x y fz)
(if (<= x y)
y
(let ((z (funcall fz)))
(tarai-1 (tarai-1 (1- x) y (lambda () z))
(tarai-1 (1- y) z (lambda () x))
(lambda () (tarai-1 (1- z) x (lambda () y))))))))
(tarai-1 x y (lambda () z))))

221:デフォルトの名無しさん
05/06/04 22:14:55
>>219 >>220
そんじゃ209が早くなったと言っているのは勘違いなの?


222:デフォルトの名無しさん
05/06/04 22:23:48
>>221
>>217 の参考リンクの一番したみてみそ。Zだけの遅延評価のページが紹介されている罠

223:デフォルトの名無しさん
05/06/05 17:29:43
流れ断ち切って悪いけど
DrSchemeって何て読むの?
ドクタースキームでいいの?

224:デフォルトの名無しさん
05/06/05 17:34:22
ドラスケ

225:デフォルトの名無しさん
05/06/05 18:09:09
>>224
採用。

226:デフォルトの名無しさん
05/06/05 23:21:23
スキーム博士


227:デフォルトの名無しさん
05/06/05 23:45:14
Note that they are listed as procedures, but implemented as syntax, so it is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages will not have a meaningful name in this case).

これどういう意味か分かりますか?
どなたか解説をお願いします。

228:デフォルトの名無しさん
05/06/06 01:08:09
のっけからtheyとか代名詞が出てくるんだから、どういう文脈の文章かを
説明しろよな。まあ内容から何の話か見当つくけどさ。



229:?デフォルトの名無しさん
05/06/06 11:00:03
ぬるい実装の話みたいだが...どの処理系だ?

230:デフォルトの名無しさん
05/06/06 17:33:33
>>290-210
Cだと78msec(Pentium4,2.25GHz)でした。
やはりLISPは遅いようですね。

int tarai(int x,int y,int z)
{
if(x<=y) return y;
else return tarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(z-1,x,y));
}

231:デフォルトの名無しさん
05/06/06 19:53:32
とりあえず空気嫁、と。
空気をどうしても読めなかったら、
悲惨な喪毎の頭のベンチマークでも並べとけと。

232:デフォルトの名無しさん
05/06/06 20:47:44
>>230
>>220 なら sbcl on Pentium 4 2.4GHz で 7μsecだよ。
がんばって遅延評価実装してみ。

233:227
05/06/06 20:57:01
>>228
ごめん、もう分かった。
>>229
MzScheme です。


234:デフォルトの名無しさん
05/06/06 21:29:03
>>227
R5RS関連だろうと思ってたら、やっぱコレか。

PLT Foreign Interface Manual
PLT <scheme@plt-scheme.org>
299.100Released March 2005
URLリンク(download.plt-scheme.org)

2. Foreign Interface
This is a description of the foreign interface. The interface has some parts implemented in C (plt/src/foreign/foreign.c)
which is available as a built-in #%foreign module. This module is not intended for general use as is, and further
documentation can be found in the source. The relevant functionality is provided via the foreign module in MzLib
(foreign.ss).

2.2 Simple Types
2.2.4 Type Constructors
Since types are first-class values, there are several type constructors that build type objects. These are just the simple
ones, more constructors are described below. Note that they are listed as procedures, but implemented as syntax, so it
is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages
will not have a meaningful name in this case).

235:デフォルトの名無しさん
05/06/06 21:49:17
>>233
お願いだから次からはもうちょっと質問の仕方も上達してくれよ

236:デフォルトの名無しさん
05/06/06 23:21:44
class tarai {
 int x, y;
 const tarai* tp;
public:
 tarai(int y) : x(0), y(y), tp(0) {}
 tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {}
 int operator()() const {
  if (x <= y) return y;
  int z = (*tp)();
  return tarai(tarai(x-1,y,*tp)(),tarai(y-1,z,tarai(x))(),tarai(z-1,x,y))();
 }
};

LISPをまるで知らない俺が五分で作ったC++遅延評価版
tarai(192, 96, tarai(0))()で、0.01秒くらい?

237:デフォルトの名無しさん
05/06/06 23:53:03
tarai(192, 96, 0)と使えるように直した

class tarai {
 int x, y;
 const tarai* tp;
public:
 tarai(int y) : x(0), y(y), tp(0) {}
 tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {}
 operator int() const {
  if (x <= y) return y;
  int z = *tp;
  return tarai(tarai(x-1,y,*tp),tarai(y-1,z,x),tarai(z-1,x,y));
 }
};

238:209
05/06/07 08:18:39
209 です.ろくにレスもしなくてすみませんでした.>>209-237 の流れを,大
変興味深く読ませていただきました.正直,>>236-237 はすばらしいと思いま
す.

>>232 のレスを見て,自分もC で遅延評価を実装しようと考えて,かなり汚い
コードしか思いつかず,ああクロージャ(関数閉包)って本当に便利なんだな,
と思った矢先に>>236-237 が書き込まれました.自分は C++ はよく知らない
のですが,とてもすっきり書けているように見えます.

日本の Lisp の巨人というと,竹内郁雄先生(たらいまわしべんちの生みの親)
と萩谷昌己先生がまず挙げられると思います.竹内先生は「Lispは確かに遅い
が,言語としての生産性は格段に高い.トータルのコストはLispの方がずっと
小さい」という考えであり,萩谷先生は「Lisp はあくまでプロトタイプのた
めのもので,本物のプログラムは C で書かなければならない」という考えだ
と聞いております.

Lispというのはとにかく書きやすい言語ですから,解くべき問題の複雑さによっ
て,どちらが正しいかは変わるのだと思うのですが,竹内関数(たらいまわし
べんち)に関しては,現時点では萩谷教授が正しいということになるようです.
この逆説めいた結末に,私は興奮すら覚えました.


239:デフォルトの名無しさん
05/06/07 08:20:50
Bill Clementson's Blog が復活したみたい

URLリンク(bc.tech.coop)

何時もこっちを見てるけど

URLリンク(planet.lisp.org)

240:209
05/06/07 08:59:31
今回の流れを見て,もう1つ思い出したのがこの言葉です.

「10年前ならLispは大きなアドバンテージを持っていたけれど、現在は他の言
語が追い付いて来てLispのメリットは小さくなっている。」Peter Norvig

今回のC++のエレガント(と私には見える)な回答を見て,確かにいくつかの
洗練は,Lispの占有物ではなくなったのだ,と感じた方もおられるのではない
でしょうか.

しかし,聞きかじりで書くのですが,C++にはテンプレートを多用した新しい
スタイルが登場しつつあるそうです.それは Lisp や関数型言語から大きな影
響を受けているそうです.つまり,Lisp は2005年の現時点でも,豊かなアイ
ディアの源泉でありつづけているのではないでしょうか.もちろん(不幸にも)
Lispの進歩が停滞して,その差が縮まりつつあるのかも知れませんが.

ところで,Lisp 側は最速のものがまだ出ていません.Allegro Common Lisp
(ACL) と Chez Scheme コンパイラの,二つの商用ソフトです.これらなら,
C++とも結構いい勝負をするかもしれません.

それにしても,最初にたらいまわしべんちを書き込んだ時にはまったく予想し
なかった展開になりました.大変勉強になりました.ありがとうございました.


241:209
05/06/07 09:01:28
参考リンク(うざいので最後にまとめました)

竹内郁雄『初めての人のためのLISP』
URLリンク(www.amazon.co.jp)
萩谷昌巳「たかが論理 されど論理」
URLリンク(nicosia.is.s.u-tokyo.ac.jp)
Lisp:読み物
URLリンク(www.shiro.dreamhost.com)
%aa
Modern C++ Design
URLリンク(www.amazon.co.jp)
The Great Computer Language Shootout
URLリンク(web.archive.org)
html


242:209
05/06/07 09:09:16
リンク貼り失敗.本当にウザくてごめんなさい.

竹内郁雄『初めての人のためのLISP』
URLリンク(www.amazon.co.jp)
萩谷昌巳「たかが論理 されど論理」
URLリンク(nicosia.is.s.u-tokyo.ac.jp)
Lisp:読み物
URLリンク(www.shiro.dreamhost.com)
Modern C++ Design
URLリンク(www.amazon.co.jp)
The Great Computer Language Shootout
URLリンク(web.archive.org)


243:デフォルトの名無しさん
05/06/07 10:39:40
C++のテンプレートは、色々やろうとすると制限が多すぎてちょっと嫌になる

244:デフォルトの名無しさん
05/06/07 11:21:50
>>243
boost の lambda なんかを見ると、一見 Lisp チックなんだけど、正確な挙動を
理解するのはなかなか大変。C++ って複雑な言語だなと思う。
そのくせ、制限が多いというのには同意。

Common Lisp なんかも「大きな言語」と言われるけど、C++ に比べれば子供
みたいなもんだなと思うよ。(もちろん良い意味でね)

245:デフォルトの名無しさん
05/06/07 11:58:44
>>240
過剰なお褒め、恐縮です。というか、気恥ずかしいです
でも、自分でも思った以上にエレガントだなと、思っていたり
ちなみに、Cでもやってみました
CでやるなんてlazyというよりCrazyかとおもったけど
書いてみたら、非常に簡単でした

struct tarai { int x, y; const struct tarai* tp; };

int tarai_sub(int x, int y, const struct tarai* tp) {
 if (x > y) {
  int z = tarai_sub(tp->x, tp->y, tp->tp);
  struct tarai t[3] = { { z, z, 0 }, { x, x, 0 }, { y, y, 0 } };
  struct tarai tz = { z-1, x, t+2 };
  return tarai_sub(tarai_sub(x-1,y,t), tarai_sub(y-1,z,t+1), &tz);
 }
 return y;
}

int tarai(int x, int y, int z) {
 struct tarai tz = { z, z, 0 };
 return tarai_sub(x, y, &tz);
}

C++よりも、速いっぽい

246:デフォルトの名無しさん
05/06/07 11:59:15
C++版もちょっと手直し

int tarai(int x, int y, int z) {
 class Tarai {
  int x, y;
  const Tarai* tp;
 public:
  Tarai(int y) : x(y), y(y), tp(0) {}
  Tarai(int x, int y, const Tarai& t) : x(x), y(y), tp(&t) {}
  operator int() const {
   if (x <= y) return y;
   int z = *tp;
   return Tarai(Tarai(x-1,y,z), Tarai(y-1,z,x), Tarai(z-1,x,y));
  }
 };
 return Tarai(x,y,z);
}

このコードなら、人に見せても恥ずかしくないかな

247:デフォルトの名無しさん
05/06/07 12:13:50
>>245
struct tarai に tp 入れる必要なくない?
typedef struct { int x, y, z; } tarai_t;
int tarai(int, int, int);
int tarai_1(int x, int y, tarai_t *tp) {
if (x <= y) return y;
int z = tarai(tp->x, tp->y, tp->z);
return tarai_1(tarai(x - 1, y, z), tarai(y - 1, z, x),
&(tarai_t){ z - 1, x, y });
}
int tarai(int x, int y, int z) {
if (x <= y) return y;
return tarai_1(tarai(x - 1, y, z), tarai(y - 1, z, x),
&(tarai_t){ z - 1, x, y });
}

248:デフォルトの名無しさん
05/06/07 15:18:08
個人的には興味深い話題ではあるのだけど、延々とC++の話が続くのはさすがに
スレ違いだと思う。もうちょっとLisp絡みの話へ軌道修正してほしい。

249:デフォルトの名無しさん
05/06/07 17:54:02
もうちょっとだけ、Cで
245を書いて、247を読んで、ちょっと考えてやっと気づいたんですけど
この問題の本質って、実はめちゃめちゃ簡単ですね
LISPのコードで書かれてる段階では全く気づかなかったんですけど
Cで書いて、読んでみたら、やっと気づきました

必要になるかどうか分からない関数値は、
事前に計算しないで引数のまま渡す
タダそれだけですね

int tarai(int x, int y, int z);
int tarai_sub(int x, int y, int z_x, int z_y, int z_z) {
 if (x > y) {
  int z = tarai(z_x, z_y, z_z);
  return tarai_sub(tarai(x-1,y,z), tarai(y-1,z,x), z-1, x, y);
 }
 return y;
}
int tarai(int x, int y, int z) { return tarai_sub(x, y, z, z, 0); }

このコードなら、Cに疎いLISPerの方々でも余裕で理解できるでしょう

なんかこう、高度なというか表現力や抽象化能力の高い道具が
問題の本質を逆に隠してしまっていたような、そんな気がします

250:デフォルトの名無しさん
05/06/07 18:03:57
…………………… 頭悪いのが粘着してるの放置 ……………………

251:デフォルトの名無しさん
05/06/07 18:07:32
確かに。tarai関数の主旨もわからず、Lazy Evaluationの例>>220の30スレも後になって
そんな事言い出すとは、かなり逝かれてるな。

なんつうか、人の話聞いた後「ところで話題変わるんだけど・・・」とか言って同じ話しだすドキュソを思い出した。

252:デフォルトの名無しさん
05/06/07 18:12:14
>>241-242もかなりイタタ。
こんなの(理系全般板の悪名高い荒らし)にURL覚えられちゃった
はぎゃ先生も災難だな

253:デフォルトの名無しさん
05/06/07 18:27:00
>>249
> なんかこう、高度なというか表現力や抽象化能力の高い道具が
> 問題の本質を逆に隠してしまっていたような、そんな気がします
そんなことないよ。>>220 の labels を分解して
(defun tarai (x y z)
(labels ((tarai-1 (x y fz) (if (<= x y) y
(tarai-2 x y (funcall fz))))
(tarai-2 (x y z) (if (<= x y) y
(tarai-1 (tarai-2 (1- x) y z)
(tarai-2 (1- y) z x)
(lambda () (tarai-2 (1- z) x y))))))
(tarai-2 x y z)))
tarai-1 をインライン展開して
(defun tarai (x y z)
(labels ((tarai-2 (x y z)
(if (<= x y) y
(let ((xx (tarai-2 (1- x) y z)) (yy (tarai-2 (1- y) z x)))
(if (<= xx yy) yy
(tarai-2 xx yy (funcall (lambda ()
(tarai-2 (1- z) x y)))))))))
(tarai-2 x y z)))

254:デフォルトの名無しさん
05/06/07 18:27:54
まとめると
(defun tarai (x y z)
(if (<= x y) y
(let ((xx (tarai (1- x) y z)) (yy (tarai (1- y) z x)))
(if (<= xx yy) yy (tarai xx yy (tarai (1- z) x y))))))
それを C にすると
int tarai(int x, int y, int z) {
for (;;) {
if (x <= y) return y;
int xx = tarai(x - 1, y, z), yy = tarai(y - 1, z, x);
if (xx <= yy) return yy;
z = tarai(z - 1, x, y); x = xx; y = yy;
}
}
こうなるんだけど、>>249 よりシンプルだし速度も倍。

255:デフォルトの名無しさん
05/06/07 18:31:21
…………………… 頭悪いのが自作自演始めたので放置 ……………………

256:209
05/06/07 21:45:06
勝手ながら,flatline 氏の Wiliki を借りました.
URLリンク(www.komaba.utmc.or.jp)

このスレでは,ちょっとこれ以上の話は皆さんにご迷惑のようです.
しかし,できるならもう少し続けたい気持ちが私にはあります.
いっしょにこちらに移動していただけませんか?>> C++ の人


257:209
05/06/07 21:48:32
補足.Wilikiのリファレンスです(私も不慣れなのですが).

URLリンク(www.shiro.dreamhost.com)

ということで,大変ご迷惑をおかけしました.申し訳ありません.>>ALL


258:デフォルトの名無しさん
05/06/07 22:38:25
今度はwiki荒らしか

259:デフォルトの名無しさん
05/06/07 22:57:12
>>253-254
どうもすみません。勉強になりました
勉強ついでに、249のCコードをそのままLISPにしてみました
(defun tarai (x y z)
 (labels ((tarai-1 (x y zx zy zz) (if (<= x y) y
  (let ((z (tarai zx zy zz))) (tarai-1 tarai((1- x) y z) tarai((1- y) z x) (1- z) x y)))))
 (tarai-1 x y z z 0)))

そこで、let式を関数呼び出しに変えて
(defun tarai (x y z)
 (labels ((tarai-1 (x y zx zy zz) (if (<= x y) y
   (tarai-2 (x y (tarai zx zy zz)))))
   (tarai-2 (x y z) (tarai-1 tarai((1- x) y z) tarai((1- y) z x) (1- z) x y)))
 (tarai-1 x y z z 0)))

さらに、tarai-1呼び出しをlet式に変えてみました
(defun tarai (x y z)
 (labels ((tarai-2 (x y z)
  (let ((xx (tarai((1- x) y z)) (yy (tarai((1- y) z x)))
   (if (<= xx yy) yy (tarai-2 (xx yy (tarai (1- z) x y)))))))))
 (if (<= x y) y (tarai-2 x y z))))

260:デフォルトの名無しさん
05/06/07 22:57:25
これをそのままCにすると、こうで
int tarai_sub(int x, int y, int z);
int tarai(int x, int y, int z) {
 if (x <= y) return y;
 return tarai_sub(x, y, z);
}
int tarai_sub(int x, int y, int z) {
 for (;;) {
  int xx = tarai(x-1,y,z), yy = tarai(y-1,z,x);
  if (xx <= yy) return yy;
  z = tarai(z-1,x,y);
  y = yy;
  x = xx;
 }
}

最初のifがループの外に出せて、なんか倍くらい速くなります。
それともこれ、何か間違ってますか?

261:デフォルトの名無しさん
05/06/07 23:33:28
フリーのCommon Lisp処理系で、threadをサポートしているのって有ります?
SchemeはDrSchemeがサポートしているけど。。

262:デフォルトの名無しさん
05/06/08 00:16:13
>>261
URLリンク(www.sbcl.org)

263:デフォルトの名無しさん
05/06/08 03:59:01
>>239
おお、待ち焦がれてたよ BIll さん。
blog 関連のリンクはテンプレに入れるとしたら Planet Lisp のがいいかもね。

さておき、記念に前に出たトランポリン関連のネタを引っ張っておく。

URLリンク(bc.tech.coop)

リストに詰めて apply、ってやり方だから大量のゴミを作るだろうあたりが気になるけど。
相互末尾再帰でもかかわってくる関数それぞれが取る引数の数は大抵の場合は同じだろうから、
そこを固定したコードを吐くマクロを書いた方が実用上は好ましいかな。


264:デフォルトの名無しさん
05/06/08 07:46:38
>>261
ECL もオケ

DrScheme のスレッドは所謂 Green Thread でしょ。
Native Thread じゃなくていいなら CMUCL にもある。

265:デフォルトの名無しさん
05/06/08 08:01:30
連投スマソ

>>261
PowerPC 使いなら OpenMCL も Native Thread 使える
Intel Mac の登場で x86 にポーティングされないかな…
作業大変だろうけどね

266:デフォルトの名無しさん
05/06/08 12:31:04
.coopなんてTLDできてたのか……。.bizとか.infoと同時に作られたのだな。



267:デフォルトの名無しさん
05/06/08 20:54:46
すいません
スレ間違えたっぽいので誰か知ってたら答えてください

スレリンク(tech板:380番)

エラー検出とかのためにリストがどの行のものか保存する
LISP処理系ってありますか?

268:デフォルトの名無しさん
05/06/09 06:50:31
Shiro Kawaiの演技にカツモクせよ
[ドラマ] 恋におちたら ~僕の成功の秘密~ 第01話 「ずっと探してた人」 (D-KTV 1024x576 DivX511).avi aaLPbRVQ8B 1,089,947,648 56df0ca851a66ec551b59c6a54db9978

269:デフォルトの名無しさん
05/06/09 08:05:03
一瞬、誤爆かとおもた(w

270:デフォルトの名無しさん
05/06/09 16:28:51
>>268
こらこらこら


271:デフォルトの名無しさん
05/06/10 05:07:09
一瞬、ny導入しようとした俺guile

272:ミミ
05/06/11 07:54:40
Scheme 関係の文書に arity ってよく出てくるけど、うまい訳語ある?

273:デフォルトの名無しさん
05/06/11 09:24:39
一応、『項数』ってのがあるけど、使わない方が無難だと思う。
直感的じゃないし、初学者には意味不明な単語が増えるだけ。
『引数の数』じゃダメな理由でもあるの?

274:デフォルトの名無しさん
05/06/11 09:24:54
URLリンク(en.wikipedia.org) 読んでみたけど、
カジュアルには「引数の数」かな。
もう少し丁寧に「手続き(関数)が受け取り可能な引数の数」とか。
精確に行くなら「アリティ」で。

275:デフォルトの名無しさん
05/06/11 09:38:15
ちなみに中国語では元数と書くみたいだね
引数はそのまま引数みたい

276:デフォルトの名無しさん
05/06/11 10:25:32
有体

277:デフォルトの名無しさん
05/06/11 10:40:51
可変個の引数も扱うわけだから
引数として受け付ける個数の範囲かな


278:デフォルトの名無しさん
05/06/11 10:41:05
algorithmに語源はあるけど、
arityに語源はないの?

279:デフォルトの名無しさん
05/06/11 11:48:59
unary, binary の ...ary ----> arity

280:ミミ
05/06/11 14:34:38
ありがとうございます。
やはり「引数の数」が一番分かりやすそうですね。
でも用語に「の」が入ると、「の」が沢山でてきて
読みにくい文章になったりするんですよね。
そういう意味では「アリティ」のほうがましかも。

281:デフォルトの名無しさん
05/06/11 16:02:01
>>280
> そういう意味では「アリティ」のほうがましかも。

それはない。


282:デフォルトの名無しさん
05/06/11 17:52:52
アリティ(引数の個数)...

として、以降アリティで良いんじゃないかな

283:ミミ
05/06/11 18:15:03
ちなみに、「引数の数」と「引数の個数」では、
後者ののほうが分かりやすいと思うんだけど、
「個数」って訳する人、意外と少ないんだよねぇ。

284:デフォルトの名無しさん
05/06/11 18:18:41
アニキィ


285:デフォルトの名無しさん
05/06/11 18:26:10
ありていにいって>>281に同意。

286:デフォルトの名無しさん
05/06/11 18:35:56
>>285
全米が凍った

287:デフォルトの名無しさん
05/06/11 20:54:02
確かにGaucheのマニュアルで説明無しにarityという
用語が出てきて困ったな~。

288:デフォルトの名無しさん
05/06/11 21:25:31
めんどいからもう引数数でいいんじゃね

289:デフォルトの名無しさん
05/06/11 21:26:57
アミティ

290:デフォルトの名無しさん
05/06/11 21:27:48
arityという単語を覚えて貰うためにも、ちゃんと説明した上で「アリティ」で良いと思う。
どうせいつかは英文のマニュアルとか読む機会もあるだろうからね。

291:デフォルトの名無しさん
05/06/11 22:15:51
だったら変なカタカナにするよりarityのままの方がいいような

292:デフォルトの名無しさん
05/06/11 22:39:14
それは翻訳としては不完全。
商用レベル文書の品質としては失格。

293:デフォルトの名無しさん
05/06/11 22:46:35
そんな業界基準があるなら正してもらう必要があるな。
間違っている。

294:デフォルトの名無しさん
05/06/11 22:56:50
そろそろ誰かコードを…
コードをくれ

295:デフォルトの名無しさん
05/06/11 23:05:08
商用レベルの邦訳って変な拘りがあるんですね。
それで分かり難い訳本が多いんですね。
納得しますた。

296:デフォルトの名無しさん
05/06/12 00:15:55
まともな翻訳には日本語で表現できる概念を増やすという役割もあるから。


297:デフォルトの名無しさん
05/06/12 00:22:08
. o O (理想が高過ぎると返って悪い結果を生む良い例だな...)

298:通りすがり
05/06/12 00:29:43
いやだから、人類の知性の向上に役立ってない屑は関係ないって。
屑はいつもみたくν速で一日中遊んでりゃいいやん

299:デフォルトの名無しさん
05/06/12 00:38:36
元数は納得できる訳語だな。
方程式でも変数がxだけなら1元、xとyなら2元というのを
そのまま函数にも適用したという感じだ。
(方程式の変数の数を元数というのは日本でも普通)

今辞書を引いて初めて知ったんだが、函数というのは中国由来で
functionのfunと同音の字を当てたらしい。関数は日本で更に同音の字を
当てて書き換えたものとか。
googleで関数(簡体字で)を検索すると世界で4件しか引っ掛からん。


300:デフォルトの名無しさん
05/06/12 00:56:59
四元数とかの元数か。悪くないね。
ただ、やっぱり使う前に説明が必要だね。

301:デフォルトの名無しさん
05/06/12 01:10:03
ここ数ヶ月、随分レベルの低い話題ばっかだな。

302:3歳児
05/06/12 01:11:00
レベルが低いのは、ここ数ヶ月ではなく
ここ数日のまちがいだとおもいます。

303:デフォルトの名無しさん
05/06/12 01:20:17
>>302 3歳は もう寝ろYO!

304:デフォルトの名無しさん
05/06/12 01:21:48
最高につまんねぇレスだな。

305:デフォルトの名無しさん
05/06/12 01:27:16
自演コテが湧くよりゃマシだ

306:デフォルトの名無しさん
05/06/12 02:17:46
Joswig タンの Concordia デモムービー見たんだが、あれが本物の CLIM かぁ
今見ると、やっぱりちょっと古くさいね…

307:デフォルトの名無しさん
05/06/12 13:23:58
えぇぇ~CLIM(Common Lisp Interface Manager)?
Symbolics みたいなタイルウィンドウシステムでしょ。
一度触ってみたいなぁ。
Macintosh CommonLispのdigitoolには Mac用バイナリがまだ置いてあるみたいだけど


308:デフォルトの名無しさん
05/06/12 20:45:30
>>301
君のいうレベルの高い内容を提示してくれよ。

309:デフォルトの名無しさん
05/06/12 21:24:01
(gc)

310:デフォルトの名無しさん
05/06/12 21:29:58
OS ネイティブのスレッドを扱える Lisp/Scheme 処理系はありますか?

311:デフォルトの名無しさん
05/06/12 22:14:02
>>310 >>262

312:デフォルトの名無しさん
05/06/12 22:27:55
誰かILC2005行く香具師いる?

313:デフォルトの名無しさん
05/06/13 02:08:41
Commonclipseかと思った。
URLリンク(www.eclipsewiki.net)

314:デフォルトの名無しさん
05/06/13 04:05:46
>>310
scheme なら gauche と KSM も

Lisp/Scheme 以外でもフリーの処理系でネイティブスレッドを
サポートしている物は非常に少ない
知ってるのは OCaml, GHC, Perl, Python, Erlang くらいかな
SML 系は全滅っぽいね

315:デフォルトの名無しさん
05/06/13 11:31:38
>>314
> サポートしている物は非常に少ない
なぜ少ないのでしょうか?

316:デフォルトの名無しさん
05/06/13 11:55:13
>>315
面倒なんだろ。

317:デフォルトの名無しさん
05/06/13 12:02:55
>>315
おこちゃまだから。。

318:デフォルトの名無しさん
05/06/13 12:07:21
頭の悪いレスだ

319:デフォルトの名無しさん
05/06/13 12:52:33
>>318 おまえがな。

320:デフォルトの名無しさん
05/06/13 13:04:14
必死だな

321:デフォルトの名無しさん
05/06/13 13:12:15
>>320
See: 319

322:デフォルトの名無しさん
05/06/13 13:18:21
× おまえがな
○ おまえモナー

323:デフォルトの名無しさん
05/06/13 13:37:46
>>322
See: 320

324:デフォルトの名無しさん
05/06/13 14:02:20
・・・・・・ここからはLispに関係ないレスは禁止・・・・・・

325:デフォルトの名無しさん
05/06/13 20:38:12
後藤英一先生のご冥福をお祈りします。

326:デフォルトの名無しさん
05/06/13 20:49:40
IPSJ コンピュータ博物館
後藤英一 - 日本のコンピュータパイオニア
URLリンク(www.ipsj.or.jp)

327:デフォルトの名無しさん
05/06/13 20:57:40
この人か。HLISP 作った人なんだね。

URLリンク(www.ipsj.or.jp)
URLリンク(www.mainichi-msn.co.jp)
URLリンク(nicosia.is.s.u-tokyo.ac.jp)

>>315
理由はここら辺じゃないかな
1. 実装が面倒
2. 1CPU のマシンではネイティブスレッドのメリットが見えにくい
3. Linux のスレッドがイケてなかった

1 は GC 絡みとかなのかな
2 は最近の CPU のデュアルコア化でちょっとはメリットが出てくるかも
3 は 2.6 以降問題なくなった(らしい)

328:デフォルトの名無しさん
05/06/13 21:01:10
スマソ。リロードしてなくて被った。
Lisp Machine ってスレッドとか LWP みたいな概念はあったのでしょうか?

329:デフォルトの名無しさん
05/06/13 21:04:33
GUI作ったりメリットは沢山あるよ。
やっぱ面倒なんじゃないかね。

作るとしたら、GCやコンストラクタは排他制御して、
オブジェクトの更新毎にWriteバリアかね。
やっぱGC周り面倒だなあ。
適当に作ったらすぐ破綻しそう。

330:デフォルトの名無しさん
05/06/13 21:54:17
JavaのGCなんかを見るとネイティブスレッディング自体はそれほど性能的な
ハンデにはならないのかなという気もする。面倒なのは同意だけど。w

331:デフォルトの名無しさん
05/06/13 22:03:28
>>325
まじか。
中西(正和)先生も少し前に亡くなったが、今度は後藤先生か。

332:デフォルトの名無しさん
05/06/14 10:56:27
このスレでもおなじみの新山ゆうすけ氏が、Common Lisp の仕事を始めたらしい。
URLリンク(tabesugi.net)

> しかし相手はそこそこ有名なLisp ハッカーであり、習うべきことは多い。
> Lisp で仕事できる機会なんてそんなにないと思う。

などと書いている。今まで Lisp の悪口ばかり書いていたのになあ。

と思ったら、今日はさっそく Lisp の悪口であった。
URLリンク(tabesugi.net)

やっぱり新山氏はそう来なくっちゃ!


333:デフォルトの名無しさん
05/06/14 12:56:36
>>332
なんか有名な人なの?
嫌いな言語使って仕事してるっていう愚痴のようにしか読めんが。

334:デフォルトの名無しさん
05/06/14 14:50:02
>>333
NY市立大の院生で、Python や Scheme、OpenSSH の世界ではそこそこ有名な人。
URLリンク(www.unixuser.org)

Shiro さんが wiliki で取り上げたこともある。
URLリンク(www.shiro.dreamhost.com)


335:デフォルトの名無しさん
05/06/14 15:01:18
>>334
何言ってんの? この人ぜんぜん有名じゃないよ。

336:デフォルトの名無しさん
05/06/14 18:25:51
有名かどうかは人それぞれが判断すればいいこと。それより、内容についての
話をしようよ。

Common Lisp のライブラリが、過去互換性のために見通しが利きにくいこと、
package は実用上不可欠なのに、Scheme にはまだ標準がなく、実装依存だと
いうこと、これらはもっともな批判だと思うのだけど。


337:デフォルトの名無しさん
05/06/14 19:06:44
ごく一部の日本人で英語が読めない奴限定で有名かも知れんが

>>334
> Python や Scheme、OpenSSH の世界ではそこそこ有名

なんていうような仕事はしとらん。

まあ言ってみればプチ岩谷宏。


338:デフォルトの名無しさん
05/06/14 19:08:14
LispはJavaにMLはC#に昇華しましたので、そのようなことを考えること自体無駄です。

339:デフォルトの名無しさん
05/06/14 19:36:34
>>336
> Common Lisp のライブラリが、過去互換性のために見通しが利きにくいこと、

確かにそういう面は否定できないが、正直言って慣れてしまったね。

それを言うなら例えば C のライブラリとか UNIX のシステムコールにしたって
「過去互換性のために見通しが利きにくい」と思うし。

誰かが整然とした New Common Lisp を設計したとしても、それを布教するのは
大変だろうなぁ・・・

340:デフォルトの名無しさん
05/06/14 20:04:52
Scheme はそういう整然とした Lisp の標準を作ろうとしているわけだが、議
論百出で、いつまでたっても Common Lisp 並のライブラリがそろわない件に
ついて。


341:デフォルトの名無しさん
05/06/14 20:12:26
今のペースだと、
あと50年は掛かるな

342:デフォルトの名無しさん
05/06/14 20:25:24
C や UNIX の設計のまずいところを一気に作り直そうとした Plan9(Inferno)
も、いつまでたっても実験段階から離陸しないものね。

コンピュータ技術、ひいては技術一般に、いかに市場とのタイミングというも
のが重要か、分かるように思う。


343:デフォルトの名無しさん
05/06/14 20:41:53
「技術」の一般論を語るには、まだまだじゃない?
現状と個人の経験なわけで。
このスレには厳密主義が多いかと思った。


344:デフォルトの名無しさん
05/06/14 20:47:54
>>338
ちょっと待て、聞き捨てならん。こんな書いてて楽しくないものが、LISP の
昇華物であってたまるかぁっ!

345:デフォルトの名無しさん
05/06/14 21:03:17
>>344
昔、Lispの研究をしていた人がSunに行ってJavaを作り、それに対抗したMicrosoftが
MLの研究グループを引き抜いてC#を作ったんだよ。

Lispは特にリサーチプロジェクトなんかには便利な言語だね。 Javaは大規模なプロジェクト
向きかな。 要するに、適材適所で使えば良いかと。

346:デフォルトの名無しさん
05/06/14 21:09:40
昇華(しょうか)(Sublimation)

物理学では
  省略・・・

心理学では

 防衛機制の一つ。
 実現不可能な目標・葛藤や満たすことができない欲求から、
 別のより高度で社会に認められる目標に目を向け、
 その実現によって自己実現を図ろうとすること。

 例)かつてアクション映画で活躍したが、
  障害を負ってアクション映画に出演できなくなった→障害者保護団体を設立する


347:デフォルトの名無しさん
05/06/14 21:18:09
>>345
本気で言ってるのだとしたら面白すぎる


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch