[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/09 15:00 / Filesize : 210 KB / Number-of Response : 784
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Lisp Scheme Part19



1 名前:デフォルトの名無しさん mailto:sage [2008/01/14(月) 00:14:56 ]
過去スレ
Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/
Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/
Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/
Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/
Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/
Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/
Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/
Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/
Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/
Part9: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/
Part8: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html
Part7: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html
Part6: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html
Part5: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html
Part4: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html
Part3: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html
Part2: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html
Part1: ttp://piza2.2ch.net/tech/kako/987/987169286.html

93 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:06:30 ]
>>89
朝日ネットのURLは
/~KI4S-NKMR/
こう書くほうが好みだな

94 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:33:04 ]
>>83-84,>>86
ループまたは再帰のあるチューリング完全なプログラミング言語は等価であるということですか。やっとわかりました。(汗
等価であるなら個別の問題に対して実装しやすい言語を使えば良いということですよね。
でLisp/Schemeの場合、マクロで拡張してその問題に特化したDSLを作成して実装したらいいというのがグレアムのスタンス。
>>54が言ってた言語の拡張性がこの言語のユーザーの強みといえるかな。SLLGENとかもソレ系ですし。

95 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 20:58:31 ]
>>83-84,>>86,>>94
そういう流れのLisp本、チャイティン著「知の限界」「数学の限界」という本がありますよ。
Lisp使ってゲーデルの不完全性定理やチューリングの停止問題を説明してます。

96 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:09:22 ]
ググってたらゲーデルもLisperだったって書いてあった。

97 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:16:06 ]
>>93
うるさいことを言うと、URLの中の ~ はエスケープしなければいけないという「規格」になっておる。

98 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:17:44 ]
87は計算量以外に初歩的かつ致命的な欠点があった
忘れてくださいorz

99 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:27:29 ]
Sho"nfinkel Rules!!!

100 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 21:50:27 ]
>>96

ホフスタッターの本にそんなのあったね。
あった!「メタ、マジックゲーム」p445
「ゲーデルはリスプ(Lisp)を思いついておくべきだった。
もし彼がリスプを思いついていたならば...」

101 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:12:48 ]
>>97
> >>93
> うるさいことを言うと、URLの中の ~ はエスケープしなければいけないという「規格」になっておる。

RFC 1738 ではそうですね。
URI (RFC 2396) ではおkです。



102 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:14:20 ]
みんな学があるなあ

103 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 22:47:42 ]
学々古々

104 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:01:11 ]
>>95

「知の限界」読み直してみようと思う。p71のLISPによるゲーデルの証明、
これSchemeで書きなおせるかやってみる。

チャイティンの書いたLispインタープリタってネットで公開されていたような...

105 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:02:24 ]
lex/yacc&flex/bisonでパーサー作るより>>94みたくDSLで拡張すれば、既存のLisp/Schemeのプログラムとくっ付けることでいとも簡単に新しい処理系が出来てしまうのか。
しかもPrologとかAIを組み合わせればちょっと他の処理系では作りにくいものも作れてしまうのか。ガンダムの教育型OSってこんなイメージかなw
がんばってLittle Schemerシリーズ読んでみようかな。Ocaml/Haskellはかじったけどこっちの方が面白杉。

106 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:05:54 ]
>>104
あれ、emacsやxyzzyでも動くのかな?Scheme版出来たらうpキボンヌ

107 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:10:14 ]
>>95,>>100,>>104達、すごい本読んでるね。

108 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:13:16 ]
>>103
そんなオマエにガクガクブルブルw

109 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:18:14 ]
「げー出る、エッシャー、バッハ」と「メタマジック・ゲーム」は俺も本棚に飾ってあるぜー!
前者は箱入りなのに後者は箱がなくて悲しいぜ。

110 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:19:24 ]
このスレで紹介された本

[1] Little Schemer
[2] Seasoned Schemer
[3] Reasoned Schemer
[4] To Mock a Mockingbird(ものまね鳥をまねる)
[5] To kill a mocking bird(アラバマ物語)
[6] On Lisp
[7] 知の限界
[8] 数学の限界
[9] メタ、マジックゲーム
[10] SICP

111 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:20:26 ]
[11] ゲーデル・エッシャー・バッハ



112 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:27:42 ]
前スレからだけどこれもあった。2月が楽しみ。wktk

[12] 「プログラミングGauche」 川合史朗 監修 Kahuaプロジェクト 著

113 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:40:25 ]
>>45
Yコンビネータまで8羽理解すればいいのか。今、気がついたw

S (ムクドリ:Starling)
K (チョウゲンボウ:Kestrel)
I (???:Identity bird)=SKK
B (???:Blue bird)=S(KS)K
C (コウカンチョウ:Cardinal)=S(BBS)(KK)
M (ものまね鳥:Mocking bird)=SII
L (ヒバリ:Lark)=CBM
Y (賢人鳥:Why bird)=SLL

114 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:50:00 ]
>>113
ホレ。

(define S (lambda (f) (lambda (g) (lambda (x) ((f x) (g x))))))
(define K (lambda (x) (lambda (y) x)))
(define I (lambda (x) x))

(define-macro (define-combinator name body)
`(define ,name
(lambda (arg)
(,body arg))))

(define define-combinator define)

(define-combinator B ((S (K S)) K))
(define-combinator C ((S((S(K((S(K S))K)))S))(K K)))
(define-combinator M ((S I) I))
(define-combinator L ((C B) M))


(define Y
(lambda (F)
((lambda (my-make-f)
(F (lambda (x) ((my-make-f my-make-f) x))))
(lambda (my-make-f)
(F (lambda (x) ((my-make-f my-make-f) x)))))))

115 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:52:45 ]
(define (Fact my-fact)
(lambda (n)
(if (= n 0)
1
(* n (my-fact (- n 1))))))

(define fact (Y Fact))

(fact 10)
3628800

116 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:53:43 ]
(define (Fib my-fib)
(lambda (n)
(if (<= n 1)
1
(+ (my-fib (- n 1))
(my-fib (- n 2))))))

(define fib (Y Fib))

(fib 10)
89

117 名前:デフォルトの名無しさん mailto:sage [2008/01/15(火) 23:55:09 ]
これでもいいハズだけどw

(define-combinator Y ((S L) L))

118 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 00:00:31 ]
>>110
> [9] メタ、マジックゲーム
超なつかしい
高校の夏休みにY.M.O.ベストと一緒に図書館で借りて読んだのをおぼえてる。
いま思うと充実してたなあの頃は。

119 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 00:02:22 ]
         ,. -‐'''''""¨¨¨ヽ   それじゃあ僭越ながら
         (.___,,,... -ァァフ|   あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|    『おれは階乗計算のために無名関数をいじっていたと
        i|:!ヾ、_ノ/ u {:}//ヘ     思ったらいつのまにかいじる前の状態に戻っていた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人      な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ     おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ      頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r ー---ァ‐゙T´ '"´ /::::/-‐  \    グラハムだとかチャイティンだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんな大層なもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ    もっと恐ろしい「普通の再帰」と「Yコンビネータ」の違いを味わったぜ…


120 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 02:29:41 ]
とりあえず、グレアムな

121 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 06:00:52 ]
>>114

「計算論」(高橋正子著)を読み始めていたので参考になった。
ありがとう。




122 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 11:45:06 ]
急に難しい話題が増えたね
俺はバカだから、理由もなく難しいことを考えるのは非合理的だと思うけど
君らにとっては難しくなくて、難しくないことを考えるのに理由は要らない
なんというかバカの壁を実感したよ

123 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 12:26:41 ]
バカであることに気がついてる奴は大したバカではないよ

124 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 14:35:15 ]
じゃあ俺も壁感じたから大した馬鹿じゃないな\(^o^)/ヨカター

ところで、新宿ジュンク堂にならLittle schemerあるかもと思ったけど無かった。
MITの本はいくつかあったけど。
注文したらアマゾンの方が早いかな。

125 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 18:06:49 ]
>>113-114
チラ見だけど、SKKとかSIIとかSLLとかがやたら目に付いた。なんか深遠なパターンがあるんだろうな。

126 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 18:14:00 ]
>>80-86
その「コレスゲープログラム」はunlambdaのことジャマイカ?
難読化してもちゃんと動くぜってノリだった希ガス。

127 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:39:36 ]
ポルナレフに突っ込み入れる>>120はアブドゥルなのか?w

128 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:53:02 ]
>>126
チャウチャウ。このスレの流れで言ってるコレスゲープログラムは定理証明機としての意味。だから>>95,>>104の話が出てきた。
>>100の紹介した本が言ってるのは「ゲーデルがもっと便利な定理証明機(Lisp)を思いついていれば」という意味だ。
つまりスマリヤンが言ってるコレスゲープログラムとはスゲー定理ということ。

129 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:54:52 ]
コレスゲープログラム = スゲー定理 = ゲーデルの不完全性定理

130 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 19:59:59 ]
つまり>>60はスマリヤンやチャイティン嫁ってことかw

131 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:19:26 ]
タオイズムか!



132 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 20:55:13 ]
「ものまね鳥をまねる」って「定理証明機=ラムダ算法=結合子論理=プログラミング言語」って意味だったのか。マジで知らなかった(汗
このスレ勉強になるな。

133 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:05:52 ]
>>126
UnlambdaやBrainf*ckの意味ではなく、CoqやIsabella等の定理証明機が正解かな常考。

134 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:13:32 ]
>>124
まちがいない。

135 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:27:01 ]
>>86>>132をみてチューリングマシーンが定理証明機だということに初めて気がついた。そういうことだったのか。

136 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:34:08 ]
なら>>60が求めてるのは「公理データベースによって結果が異なる自動定理証明機」というところか?

137 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:00:18 ]
>>135
チューリングマシーンがハードウェア型の定理証明機とするならラムダ算法とか結合子論理はソフトウェア型の定理証明機になってるよね。
でも>>100にあるようにもしもゲーデルがLispのようなプログラミング言語を知っていれば、ゲーデルの証明はもっと理解しやすかったのにということだよ。
つまり、たとえ等価でももっと分かり易くできるプログラミング言語があるならそれを使うべきだというのが結論じゃないかな。
教養として難しいことも知っておくのも意義はあるけどね。UnlambdaやBrainf*ckもそういう意味でしかないと思う。

138 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:13:01 ]
自力では歯が立たなかったので下記を参考にやってみた。
ttp://www.unfindable.net/~yabuki/article/unknowable/godel.html

;;不動点
(define (f x) `(',x ',x))

> (f 'x)
((quote x) (quote x))
> (f f)
((quote #<procedure:f>) (quote #<procedure:f>))
> (equal? (f f) (eval (f f)))
#t
> (equal? (f f) (eval (eval (eval (eval (eval (f f)))))))
#t
>
続く

139 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:14:00 ]
;;チャイティン Lispによるゲーデルの証明
;;(valid-proof? x) の定義があると仮定する。xが妥当な証明なら'()
;;xが妥当な証明なら実証された定理を返す。
;;s式yが証明できない⇔すべてのs式xについて (valid-proof? x)が
;;yと等価とは限らない。
;;これを肯定する述語が (is-unprovable y)
(define (g x) `(is-unprovable (value-of (',x ',x))))

> (g 'x)
(is-unprovable (value-of ((quote x) (quote x))))
> (g g)
(is-unprovable (value-of ((quote #<procedure:g>) (quote #<procedure:g>))))
> (equal? (g g) (eval (cadr (cadr (g g)))))
#t
>

証明できないということは証明できない = (証明できないということは証明できない)ということは証明できない。

こういう意味なのだろうか?頭が痛くなりそうだ。

140 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:32:34 ]
訂正
誤 ;;(valid-proof? x) の定義があると仮定する。xが妥当な証明なら'()

正 ;;(valid-proof? x) の定義があると仮定する。xが妥当な証明でないなら'()

141 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:37:03 ]
>>139
その入れ子になっている計算が無限に続いた入れ子と仮定して、その計算はいつか止まるのかという意味になっている。
それがチューリングの停止性問題だ。1931年にゲーデルがやったことを1937年にチューリングがチューリングマシンで説明した問題。
それをチャイティンはLispで書いてみたってこと。チューリングの停止性問題でググレばわかりやすい説明が見つかるだろう。
(チャイティンにケチをつけるわけじゃないが、無限のメモリがないと同じことにはならない)



142 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 23:50:09 ]
>>140
Little Schemerの9章に出てくるYコンビネータも無限に続いた入れ子(=再帰関数)を作るためだよね。
>>114-119のYコンビネータがそれに相当するかな。

143 名前:138 mailto:sage [2008/01/16(水) 23:58:33 ]
>>141
>>142

なるほど〜。勉強になりました。

144 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:06:45 ]
無限ループは止まらないだろ常考。ということは、「証明できないということは証明できないということは・・・」の答えが返ってこないから証明できないわけ。

145 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:08:35 ]
>>143
おぉ、理解早いね。

146 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:20:21 ]
>>144
ゲーデルとチューリングって無限ループは止まらないってことを言ってるのか。なんか意外だなぁ。

147 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:23:36 ]
・止まる無限ループが存在すると仮定する
・矛盾する
・従ってすべての無限ループは止まらない
・証明終わり

148 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:25:33 ]
>>146
無限という概念は数学的には不可解なのです。

149 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:33:04 ]
ループや再帰を持つものはチューリング完全である。

無限のループや再帰は止まらないことがある。

判定不能な問題が存在する。

チューリング完全なプログラミング言語は万能ではない!

プログラマーに出来ることには限界がある。

バカの壁(Q.E.D.)

150 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:38:48 ]
ゲーデルとチューリングってバカの壁ってことを言ってるのか。なんか意外だなぁw

151 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 00:42:36 ]
バカの壁という概念は数学的には無限ループなのです。



152 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 01:10:59 ]
量子論的にはどんな壁でもすり抜けられるけどね。

153 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 01:34:23 ]
確率が低いだけだな

154 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 01:38:18 ]
本当によくわからないんです><

155 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 09:54:11 ]
関数型初心者→Haskellかじって→SICP読み始める→Scheme素晴らしい

な人間ですが、Lisperから見たとき、Haskellってどんな印象なんでしょうか。


156 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 10:16:02 ]
止まるなら止まる
止まらないかもしれないと止まらないかもしれないと止まらないかもしれないと....

という「半アルゴリズム」なんだな

157 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 13:14:48 ]
>>155
「なんて純粋な関数型!しかも遅延!」

158 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 13:35:51 ]
なぜかわからんが、昔から俺には
「遅延」っていう響きがいやらしく感じるんだ。

159 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:00:35 ]
>>155
Lisper一般ではなく、あくまで俺の印象だが、
「純粋すぎてちょっとめんどい」って感じ。
たぶん誤解なんだろうけど。

160 名前:155 mailto:sage [2008/01/17(木) 14:16:28 ]
なるほど、ちょっとメンドイというのは、Schemeの芸術的シンプルさから見たら
色々煩すぎるよ、ということでしょうか。


161 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:16:43 ]
> Haskell
数学や哲学の匂いに比べて、肝心の(という言い方はトゲがあるかな)工学の匂いが薄い、
という風に感じる。
でもこれは、2chのスレや、関数型言語関連の検索で引っかかったページからの印象で、
実際にHaskellに触ったことは無いんで、>>159と同じく、色々誤解もあるんだろうなと想像。



162 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 14:36:20 ]
>>160
ちょっと違うかな。
LispでもSchemeでも、関数型風に書くこともできれば、手続き風に書くこともできるよね。
純粋関数型言語ってのはそういう融通が効かなさそうで、用途によっては面倒じゃね?って
イメージ。たぶんいろんな逃げ道があって、そうでもないんだろうけど。

163 名前:155 mailto:sage [2008/01/17(木) 14:45:03 ]
>>162
そうですね。言語の入門ってよく"Hello World"をコンソールとかに出力するのとか
から始まりますが。Haskellの場合それは典型的な副作用関数なので、モナドが
必要とか、そんな話になってしまいます。

164 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:06:23 ]
>>155
Haskellみて思うのはUKの純粋関数型言語というイメージかな?
ML系やLisp系にはUKの言語みたいなこだわりは感じないかなぁ。
良いとか悪いとかいう感想は持ったことない。職人的なこだわりが感じられる。

165 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:23:28 ]
やっぱLispは東海岸?

BSDが西海岸文化で。

166 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 18:57:24 ]
どなたかSimply Schemeの紹介キボンヌ

167 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 21:21:03 ]
>>165
もっと絞るとボストン周辺文化

168 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 21:33:55 ]
>>155
俺と全く同じ状況でワロタ。

lispの構文はシンプルで美しいと、心から思ったよ。

169 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 01:12:10 ]
ttp://www.oreilly.co.jp/editors/archives/000155.html

赤多過ぎ。
表紙が「Gaucheプログラミング」って表紙からして間違ってない?
ダイジョブカ?


170 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 01:38:34 ]
>>169
逆に考えるんだ。それだけ改善される、と。




171 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 01:58:30 ]
オレも頑張ってるなとオモタよ。



172 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 02:26:18 ]
>>167
そりゃ偏見w
インディアナあたりもガンガってる。

173 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 03:43:26 ]
>>163
「モナドが必要」って,一体何をそんなに仰々しく構えているのか.
何も考えずに putStrLn すればいいんですよ.

(write "Hello world!") (newline) と書くとき,Schemeの意味論を思い浮かべる?
;; そもそも意味論はRnRSの一部しか記述してないけど

174 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 12:25:47 ]
ここにいる人たちは学生ですか?
あるいは社会人だけど趣味やスキルアップのためにSchemeを
やっているのですか?
仕事でScheme使ってる人はいるのでしょうか?

175 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 12:49:33 ]
いつか仕事(個人的なutilじゃなく)で使えればなーと思いつつ、スキルアップのため

176 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 12:58:20 ]
黒田さんとかshiroさんレベルになれれば、
「大丈夫俺に任せろ」で仕事にできちゃうんだろなぁ

177 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 13:15:20 ]
普段は普通の手続き型言語やね、でも強いて言えば
再帰が必要な処理だけは手続き型言語で書こうとすると悩むから
一旦Schemeで下書きしてから手続き型に直す

178 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 13:17:57 ]
>>173
むしろ、writeが再定義されてたらどうしよう、とか思い浮かべたほうがいい

179 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 13:19:28 ]
>>174
いろんな人がいると思うよ。画一的に考えるな。
俺は仕事で使ってるよ。Common Lispだけど。

180 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:00:49 ]
>>174
本職はハードの設計だが, できあいのツールで機能が足りないときは
Lisp で書いてるな. C とか C++ で数値計算する気にならん.


181 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:12:59 ]
SIAGの廃れっプリが凄いw



182 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:40:51 ]
無職の人はいるのか?

183 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 22:55:04 ]
Lispme使ってますがなにか?

184 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 22:46:09 ]
>>174
回路設計者(しかも、アナログ)だけど、趣味でschemeやってますよ。




185 名前:デフォルトの名無しさん mailto:sage [2008/01/19(土) 23:58:15 ]
意外とハードウェア技術者が多いな。俺も昔、Lisp系でHDL(ハードウェア記述言語)を作ろうとか
考えたことがあるよ。

186 名前:180 mailto:sage [2008/01/20(日) 01:07:07 ]
>>185 wwWwWW!おまえはなんて俺なんだ!!!


187 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:07:34 ]
Lisperなんだが、あまりにgaucheが素晴らしいのでschemerになろうと思う。
そこで質問なんだが、Lispだとnil==()なのにschemeだと#f != ()な理由ってあるの?

188 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:11:05 ]
>>187
おそらく宗教的な理由


189 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:11:19 ]
意味のない混同で、バグの温床となることがあるので、止めた。

190 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:24:49 ]
>>185-186
俺が多すぎ


191 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:33:02 ]
VHDLisp



192 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 01:45:17 ]
>>26-154
Little Schemer ⇒ ゾウさんの絵 ⇒ 繰り返しはどこまで続くのか? ⇒ Yコンビネータ ⇒ To Mock A Mockingbird ⇒ ゲーデルの定理
読み返してみたらホントにそう書いてあった。すげー。


193 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 08:01:34 ]
>>187
どんな所がいいですか?

194 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 08:28:45 ]
SICPにネットリスト記述処理系とかあるし

195 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 09:12:55 ]
おれの場合、elispと「リスト遊び」でリスト便利、って気付いて、
schemeを知ってやべぇ美しすぎる!とか思った。
でも今は仕事でCommonLisp(ACL)を少し使ってる。バカでかい仕様も、
今では信頼の元。CLは愛してるというより尊敬の対象。

196 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 13:39:49 ]
おまえらループと再帰を使い分けるのは馬鹿らしいと思ってるだろ

配列と構造体とハッシュを使い分けるのも馬鹿らしいと思うことはないかい

197 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 13:42:24 ]
そういう発想は無かったな。
使い分けるのが馬鹿らしかったら使い分けなきゃいいんじゃないか?w

198 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 13:47:21 ]
>>196
> おまえらループと再帰を使い分けるのは馬鹿らしいと思ってるだろ
うん!

> 配列と構造体とハッシュを使い分けるのも馬鹿らしいと思うことはないかい
あんまおもわねぇなぁ
assoc と hash …


199 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 14:08:27 ]
>>198
前スレでassocの書き方を色々とやってたな。4つぐらいあった希ガス。
でも使い分けるという感じではなかった。

200 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 15:09:18 ]
> 配列と構造体とハッシュを使い分けるのも馬鹿らしいと思うことはないかい

JavaScriptなんかはそこらへんルーズなんで楽ちんではある

201 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 15:15:18 ]
Lispでも「俺はハッシュしか使わん」というのは勝手なんだが
問題はキーを比較するときに多態性がないと不便ってことかな



202 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 16:06:12 ]
>>196
Arcってそゆんじゃなかったっけ? alistとhashを抽象化したdbって。

>>200
久しぶりに書くと配列をiterateするのにfor(var in ary)で書いてしまって??となる

203 名前:187 mailto:sage [2008/01/20(日) 17:38:21 ]
>>193
まずschemeで((if #t + -) 1 2)がでできることに感動
まだほとんど触ってないけどgaucheは
・速い(と聞いている)
・バインディングが書きやすい(ように見える)
・スレッドが使える
・dotimes, whileとかあるし、ライブラリが使いやすそう
defunとかmapcarなくて戸惑ってるけど、これから勉強します

204 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 18:44:45 ]
>203
define
map

205 名前:デフォルトの名無しさん [2008/01/20(日) 19:07:12 ]
hash と assoc は計算量がちがうよね。
用途に合わせて使い分けるもんじゃないの?


206 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:18:13 ]
まだconsのところだけど、Little Schemer面白くなってきた。
再帰は苦手だけど、この本の再帰の妥当性チェックの仕方の
説明が良かった。コツを掴めそう。

207 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:27:45 ]
>>205
> 用途に合わせて使い分けるもんじゃないの?
どの辺で切り分けるかでいつも迷う.


208 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:32:14 ]
大きいときはハッシュテーブル。
後で追加したものを優先したくて、一発である時点へ戻したいという場合は連想リスト。
どちらでもなければ、どちらでもいい。w

209 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:33:08 ]
www.amazon.com/gp/product/0262541483/

The Scheme Programming Language, 3rd Edition

米国では評価高いみたいですが読んだ人どうですか?

210 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:54:09 ]
>>208
> どちらでもなければ、どちらでもいい。w
ここだろ? >>207 が頭抱え込んでるのは…


211 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 19:57:08 ]
小さいなら連想リストでいいべ



212 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:04:36 ]
CやC++なんか知らねえ。
おれはscheme一筋って人いますか?

213 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:16:13 ]
>>212
さすがに高級アセンブラであるところの C を知らねぇって奴はいないんじゃねぇの?
C++ とはあまりお近づきになりたくないのは確だけど。W


214 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:27:52 ]
C知らないことはないけど、大規模なのは作ったことないorz

215 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 20:51:28 ]
>>209
巻末の仕様書。

216 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:20:23 ]
Scheme処理系を今時オールアセンブラで書こうっつう漢はいねぇべ

217 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 21:32:41 ]
(defun my-foreach (proc-list 'val-list)
(if (not (cdr var-list))
(proc-list (car val-list))
(progn
(proc-list (car val-list))
(my-foreach proc-list (cdr val-list)))))

(setq list-a '(1 2 3 4))
(1 2 3 4)

(my-foreach '(lambda (x) (print x)) 'list-a)

foreachのような関数をlispで作ろうと考えたのですが、どうもうまくいきません。
上記のようにするとlist-aがvoidだと怒られてしまいます。

218 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 22:00:18 ]
>>216
ツウジテナイw

219 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:03:13 ]
>>216
8008の頃からマイクロプロセッサさわってると衝動的にその罠に落ちる。

#でもarm7とかだと今でも有効なキガス

220 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:21:24 ]
話の流れが見えない
>>213 は (equal? C 高級アセンブラ) => #t
>>216 のは (equal? C アセンブラ) の評価結果はどうなるんだ?


221 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:28:24 ]
>>220 天使のオペレータ
amb!
amb!




222 名前:デフォルトの名無しさん mailto:sage [2008/01/20(日) 23:45:42 ]
>>220
そうだと思う。>>216,>>219は妙だw

223 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:30:54 ]
>>217
どこから突っ込めばいいのか……
とりあえず val-list の引用符いらない

224 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:31:31 ]
>>217
(defun my-foreach (proc-list val-list)
(if (not (cdr val-list))
(funcall proc-list (car val-list))
(progn
(funcall proc-list (car val-list))
(my-foreach proc-list (cdr val-list)))))

(setq list-a '(1 2 3 4))
(1 2 3 4)

(my-foreach #'(lambda (x) (print x)) 'list-a)
schemeと違ってlispはfuncallしないと関数は呼び出せないよ。

225 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 00:49:15 ]
あ、list-aにクォート付いてたw
(my-foreach #'(lambda (x) (print x)) list-a)

226 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 01:54:50 ]
>>224
なるほど、勉強になりました。どうもです。

227 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 02:57:56 ]
>>209
全文公開されてるから読め。

228 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 12:51:48 ]
Schemeの「継続」ってのをわかりやすく教えてくれないか。

自分的にはドラえもんの「人生やり直し機」みたいなイメージをもっているんだが。

229 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 13:33:40 ]
なんでも継続 でググ(略

230 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 14:16:46 ]
>>228
的確なイメージですね

231 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 15:16:38 ]
まずは人生やり直し機の実装について語ろうか



232 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 17:03:49 ]
ファーストクラスの継続は、やり直せる。
ファーストクラスの人生は、やり直す必要がない。

233 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:11:06 ]
>>232
で、ファーストクラス未満の人生は、やり直しが効かないと…


234 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 22:44:04 ]
人生は不可逆だからやり直しはできないだろうけど、
出直しならできるんじゃない。本人は変われないが環境を変えることはできる。

Schemeだと昔の環境を保存しておいて復元した環境に飛び込んでいくんでないの。


235 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:38:56 ]
>>234
人生に関しては逆だよ、変わるのは環境じゃなく自分。
乱暴に言えば自分しか変われる要素は無い。


236 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 23:40:27 ]
人生の話はスレ違いですよ

237 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 01:22:28 ]
lispは人生

238 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 11:29:02 ]
Schemeは哲学

239 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:09:16 ]
C#は成功

240 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:26:31 ]
Cは仕事

241 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:41:12 ]
国歌がないぞ



242 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 21:50:38 ]
国家はコッカだけに、
「静かな湖畔の...」と対になる曲が必要だな。

243 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 08:33:14 ]
>>176
>黒田さんとかshiroさんレベルになれれば、

shiroさんはコードとか読んでも本当に凄いと思うんだけど、
黒田さんって凄いの? どっかで氏が書いたコード読めますか?
どんだけ凄いのか是非読んでみたい。
話だけ聞いてると名物*ANSI* CL厨親父にしか思えない人が多い気がする。

244 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 08:34:53 ]
gauche で cons, list に nil 渡すとエラーになる。
これは gauche の仕様っていう認識で OK?

245 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 08:40:36 ]
schemeにnilなんてあったっけ?

246 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 09:49:23 ]
>>245
そもそもないのね。
SICP に書いてあったから、あるのかと思った。

247 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 12:01:03 ]
(define nil '())

248 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 14:03:19 ]
'()や#'(lambda ...)のクオートは省略できる?
というか何故クオートつけるのか分からない…

249 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 15:10:53 ]
前者については
Schemeの場合は()は自己評価的でないからクォートしなければならないとR5RSに明記されている
空リストはアトムだから自己評価的だという考え方もできるけど
リストだからクォートしなければならないとも考えられる。
個人的には自己評価的のほうが自然だと思えるけど。
CLなら自己評価的だからクォートしなくてもいい。

後者については
CLの場合はクォートしない(lambda ...)はlambdaマクロとして評価されて
#'(lambda ...)に展開される。(らしい。CLはよく知らない)

#(...)もCLだと自己評価的、Schemeだとクォートしなければならないけど
自己評価的でいいのに。

250 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:39:52 ]
なるほどありがとう

色々弄ってたら酷い例を見つけてしまった
(flet ((function (x) x)) #'(lambda (x) x))

251 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 16:43:34 ]
>>249
をいをい。#(...) は配列だぞ。#' でひとかたまり。



252 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 18:57:53 ]
>>251
違う話だからパラグラフを分けたのに><

253 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 20:07:52 ]
適当な接続詞も入れればよかったね

254 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 20:25:28 ]
ちなみにとか

255 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 20:40:14 ]
いや普通わかるだろw

256 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:40:53 ]
いまさらだけど”空リストはアトムだから自己評価的”って
シンボルの例があるから妙な主張でしたね

Schemeの場合#'が(syntax ...)に展開される処理系もあるってことも最初書いてたんだけど
さすがにこの話ではないと思って削って
ついでに#(...)の段落を足したんでした

どこかでCLにおける#()は(vector ...)に展開される入力マクロだからクォートしないって見たような気がするけど
違いますよね?

257 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 21:46:40 ]
CLにおける#()は入力マクロだけど、そういう話とは別に配列というもの
自体が自己評価的。つまり、何度 eval しても変わらない。

258 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:44:50 ]
>>243
トークショーでの黒田さんのツッコミ能力はすごいぞ。その点期待はずれなのが小飼弾だ。

259 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:46:52 ]
それって的確な突っ込みがビシバシ来る感じ?

260 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 00:57:37 ]
>>243最初の記事が煽りっぽかったからな。おれも最初は define-syntax しらねーのかよ、とか思ってたクチだが、俺がアホなだけだった…。
まぁ WiLiKi の Scheme:マクロ:CommonLispとの比較:意味論 で Shiro さんが「黒田さんに指摘されてはたと膝を打った次第です。」と書くくらいだからね。
「名物*ANSI* CL厨親父」ってのは初耳な単語だが、まずもうちょっと謙虚に相手の言う事を考える事も必要だと思うよ。

261 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:05:38 ]
そういや昔のスレでも感情むきだしな奴がいたな。Scheme派としては気持はわかなくもないけど




262 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:33:28 ]
WiLiKiを読んで思ったが
<expression>が<datum>であるべきだと仮定すると、
()がreadされた時点で自己評価的なオブジェクトになってるわけだから
やっぱり(quote ())というのは冗長だよなぁ

263 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 01:40:22 ]
今更な気もするけど、>>2の慶応SFCの
授業ページ(記号処理プログラミング)のリンク切れてるね。

とりあえず2007年度のもの。
web.sfc.keio.ac.jp/~t03596hh/lisp/wiki.cgi

264 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 16:55:36 ]
「入門CommonLisp 関数型4つの特徴とλ計算」(新納浩幸著)

この本、いいなぁ。8章からラムダ計算のこと、Lispによって具体的に説明している。
高橋正子先生の教えを受けたんだ。茨城に住んでいたらぜひとも聴講に行きたいところだ。


265 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 17:11:47 ]
>>264
そいつのブログ見てみろよ。ひどいぜ。
愚痴ばっかだし、自分の研究室の学生をバカにするようなことまでブログに書くんだぜ。
とても大学の教員とは思えない幼稚な記事ばかり。


266 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 17:27:52 ]
>>264

8章は良いですね。

book.mycom.co.jp/book/4-8399-2081-8/4-8399-2081-8.shtml
わかっていて買う人は良いですけど。
タイトル買いをしてCommon Lispの入門に使えないのは残念だと思います。

プログラムをCommon Lispで動くかどうかも試してないみたいですし。


267 名前:264 mailto:sage [2008/01/24(木) 17:42:27 ]
>>265
>>266

なるほど〜、そうなんだ。

FXはちょっとだな...プロにかもられなきゃいいけど。

268 名前:264 mailto:sage [2008/01/24(木) 22:03:16 ]
でも、本はなかなか良いと思う。
黄金比の固有値、固有ベクトルなんかにも触れていたり。
数学へのモチベーションも上がるし高校生なんかにはいいんじゃないかね。

269 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 22:20:40 ]
本人自演乙

270 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:28:11 ]
>>268
> 黄金比の固有値、固有ベクトルなんかにも触れていたり。
で, どのあたりが
> 数学へのモチベーション
につながるのかな?


271 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:15:13 ]
入門の入門には悪くないと思う
自分はλ計算についてこの本で知った
そしてすぐに高橋正子の計算論、グレアムのAnsi Common Lisp、ディヴィグのプログラミング言語Schemeを買ってどっぷりはまったクチ
でも「代入文は使わない」のところで(Cの)初期化と代入を混同してるような文章がある等
あちこち気になる点があるのも事実
それに高校生の「数学への」モチベーションにはならないと思う

だけどLispやλ計算を知るきっかけになってくれたことには感謝してる
(λ記法は知ってたけどλ算法は知らなかった)




272 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:16:53 ]
入計算λ門

ぱっと見わからないなw
ごめんなさい

273 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:28:58 ]
数学もプログラミングもほとんど素地なくても(←念のため俺のこと)
あの入門本から計算論ていけるもんですか?

274 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:33:24 ]
君の素地次第だからなんとも言えない

275 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:45:57 ]
じゃあ逆に、、どんな素地の人がそんなに一気にはまったのですか?

276 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 01:55:49 ]
それは逆になっていませんよ

277 名前:271-272 mailto:sage [2008/01/25(金) 02:02:46 ]
274は271じゃないけど
自分は素地というよりλ計算の美しさに魅せられたからだと思ってる

278 名前:271-272 mailto:sage [2008/01/25(金) 02:09:56 ]
あ、それから計算論はまだ読破できてません
自分の素地といえば
・車輪の再発明が大好き
・Smalltalkに惚れた
・MIPSのアーキテクチャに惚れた
・Windows、32bitのx86を毛嫌いしている
・今はSchemeに夢中
・でも一番美しいのはλ式だと思ってる

「美しいものを嫌いな人がいるのかしら?」ってとこかなw

279 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 02:10:00 ]
ディヴィグ本買いそびれてオジサン涙目 orz

280 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 02:15:28 ]
美しいものを嫌いな人はあまりいないだろうが美的センスは個々によってだいぶ違うだろうな

281 名前:271-272 mailto:sage [2008/01/25(金) 02:25:15 ]
そうですね
λ式よりもコンビネータ理論のほうが美しいと言う人もいますしね



282 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 03:05:23 ]
多少不細工でも料理の上手い子のほうがいいよ

283 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 04:07:48 ]
Perlか。>不細工だけど料理は出来る

284 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 05:13:37 ]
>>270

大学1年で線形代数をみっちりやるじゃない。
後期で固有値、固有ベクトルをやったんだけどその応用のひとつ。
フィボナッチ数列が行列の積として表せて固有値を計算すると黄金比
がでてくるなんてすごいじゃんと思った。
萩谷先生の「関数プログラミング」にもそういう題材があったと思う。
本はどこに片付けたかわからなくて確かめられないけど、たしか
あったと思う。

高校でやる行列やベクトルが実はとても面白い分野と将来結びついてくる
ということを知ればもっともっと数学が楽しくなると思う。


285 名前:275 mailto:sage [2008/01/25(金) 08:35:20 ]
サンキューララァ。なんとなくだけどわかりました。

286 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 13:25:08 ]
固有値に黄金比が出てくるのは大学受験の時知ったけど…

287 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 15:50:30 ]
高校生の時、勉強さぼってたんでよくわからないけど、
優秀な人は高校の時に固有値、固有ベクトルに慣れ親しんでるらしいね。
萩谷先生の本だったかエッセーだったかに「高校時代に慣れ親しんだ...」みたいな
話があったと思う。



288 名前:286 mailto:sage [2008/01/25(金) 19:31:03 ]
固有値やったのは俺が旧課程だからかもしれないな。
だって優秀じゃないし(^_^;)

289 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 19:42:59 ]
CやC++で窓のGUI書くのとLISPで書くのどっちがお手軽かな・・・

290 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:05:52 ]
最近はC#が楽すぎワロタっていう感じ。

291 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 20:46:10 ]
やっぱKawaでしょ



292 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 22:44:59 ]
>>278
Lisp系だと「原理主義」にどう対応するかで派閥があるからなぁ。


293 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:50:56 ]
>>278
単なる茶々だけど
> ・MIPSのアーキテクチャに惚れた

NIPS 32bit: シンプルでかわぇぇ!!!
MIPS 64bit: バッチィ… 特にアドレス空間周りがorz

消防とか厨房とかの頃, 好きだった女の子に同窓会でであったら… … …
てな, 心境だったな > MIPS 64bit


294 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 23:52:33 ]
>>279
> ディヴィグ本買いそびれてオジサン涙目 orz

げええっ、絶版かよ!俺もまだ買ってないのに!
www.amazon.co.jp/dp/4894712261
> 現在在庫切れです。この商品の再入荷予定は立っておりません。


295 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:24:54 ]
>>293
激しく同意です
R3000はイカスけどR4000はイケてない
遅延スロット使ってストールなしに分岐できるのがクールなのに
といいつつ一番弄ったMIPSはEmotionEngine(^^;)

>>294
某大手書店の最後の一冊買っちゃった
日本語版の初版第2刷
オライリーさん、>>209の日本語版よろしくです

296 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:46:07 ]
>>294
これって名著なの?
俺買ったけど面白くなかったからSICP買って今それ読んでる。
SICP読み終わってからこれ読んだらわかるようになってるかな?

297 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:49:36 ]
別に名著じゃないと思うけど
グレアムのAnsi Common Lisp/On Lispの方がずっといい
けどSchemeは本が少ないから

自分が持ってるのはディヴィグ本の日本語版、SICPの日本語版、Schemeによる記号処理入門

298 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 00:53:24 ]
本が少ないってのは日本語の本のことね

299 名前:sage [2008/01/26(土) 07:53:15 ]
いま、とんでもないことに気がついたんだが ...
LISP は LISP で アトム を定義することができない
そんな、気がするんだが気のせいか?

300 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 09:12:44 ]
>>299
atom は pure lisp の5関数(CAR、CDR、CONS、ATOM、EQ)に含まれているんだからそらそうでしょ

301 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 10:29:10 ]
Lisp作るのにyaccは不要だがlexに匹敵する強力なリードマクロがあってもいいはず



302 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 12:35:10 ]
>>266
>プログラムをCommon Lispで動くかどうかも試してないみたいですし。

本のサポートページにソースがあったのでちょっとだけ試してみた。
ttp://book.mycom.co.jp/support/e2/lisp/

8章のコードはGCLならOKだったよ。SBCLだとひっかったのがあったけど。
CLだとfuncallとか1+をquoteしなきゃならないとか気持ち悪いので
Schemeで書き直そうかと思っている。

303 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 13:07:21 ]
λ計算はβ変換で簡約していくのに対して
Lisp、Schemeは都度実際に計算していくので
λとは違うみたいだね。

Lispでλ式をλ計算どおりに簡約化していくものを作ったら面白いかも。

304 名前:303 mailto:sage [2008/01/26(土) 13:12:05 ]
ああ、萩谷先生、もうとっくにそういうの作ってるね。
ttp://hagi.is.s.u-tokyo.ac.jp/boomborg/boomborg-red-j.html

305 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 15:50:38 ]
>>303
いかにしてα変換をサボるかが重要なわけだが

((lambda (x) (lambda (y) x)) y) => (lambda (foo) y)

306 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 16:15:30 ]
やたー!
OpenBSDザウルスでGaucheが動かせるようになったー!
pdaXromやtitchyやPocketWorkstationに浮気する必要がなくなったー!

307 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 18:05:38 ]
>>303
その辺りは昔、関数型言語の遅延評価の実装で良く議論されました。
古いけど全文公開されている↓の「第二部 グラフ簡約」など。
research.microsoft.com/~simonpj/papers/slpj-book-1987/slpj-book-1987.pdf

308 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 20:45:52 ]
>>305
>>307

面白くなってきたので今晩、Schemeでλ計算インタープリタを書いてみるよ。


309 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:34:06 ]
;;λ計算インタープリタ

(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))

(define (lambda? f)
(and (list? f) (eq? (car f) 'lambda)))

(define (atom? f)
(and (not (pair? f))))


(define (beta-redix? f)
(and (lambda? (car f))
(not (null? (cdr f)))))


310 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:34:45 ]
(define (beta-conversion l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))

;; (((lambda (x) ...) M)) -> ((lambda (x) ...) M)
(define (deep-lambda? f)
(cond ((lambda? f) #f)
((atom? (car f)) #f)
((and (list? (caar f)) (eq? (caaar f) 'lambda)) #t)
(else #f)))

(define (reduction form)
(cond ((deep-lambda? form) (reduction (car form)))
((not (beta-redix? form)) form)
(else (begin (display form)(newline)
(reduction (beta-conversion (car form) (cadr form)))))))

(define foo '((lambda (x) x) (lambda (a) a)))
(define bar '((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a)))


311 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:37:43 ]
> (reduction bar)
((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a))
((lambda (a) a) ((lambda (z) x z) (lambda (z) z)))
((lambda (z) x z) (lambda (z) z))
(x (lambda (z) z))

新納先生のp157をやってみて同じ結果になったつもりなんだけど...
こんなんでいいのだろうか?
β変換しか考えていない。α変換は無視している。



312 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 22:44:47 ]
一瞬意味判らんかったけど、x yの場合(x y)の意味か。
まあ副作用無視なら単純だよ。

313 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:29:18 ]
λx.(NM)はλx.NM と略記して良いと書いてあったので。

正直、まだよく理解できていない。こういうことをやることがλ計算と
言われるものなのだろうか???

314 名前:デフォルトの名無しさん mailto:sage [2008/01/26(土) 23:40:32 ]
> (reduction '((lambda (x) x) y))
((lambda (x) x) y)
(y)

これは(null? (cdr f))とかすればいいとして

> (reduction '(x ((lambda (x) x) y)))
(x ((lambda (x) x) y))

こっちが面倒だな

315 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 07:27:52 ]
>>314

あ、そっか。なるほど〜。
考えてみる。λ計算ってのはなかなか面白いね。

かんばってチャーチ、ロッサーの定理にも挑戦してみたい。

316 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:35:22 ]
;;λ計算インタープリタ ver0.2

(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))

(define (lambda? f)
(and (list? f) (eq? (car f) 'lambda)))

(define (atom? f)
(and (not (pair? f))))


(define (beta-redix? f)
(cond ((atom? f) #f)
((and (atom? (car f)) (null? (cdr f))) #f)
((and (lambda? (car f))(not (null? (cdr f)))) #t)
((lambda? (caadr f)) #t)
(else #f)))


317 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:36:45 ]
(define (left-lambda? f)
(and (lambda? (car f))(not (null? (cdr f)))))

(define (right-lambda? f)
(lambda? (caadr f)))

(define (beta-conversion l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))


(define (deep-lambda? f)
(cond ((lambda? f) #f)
((atom? (car f)) #f)
((and (list? (caar f)) (eq? (caaar f) 'lambda)) #t)
(else #f)))

(define (var? f)
(and (atom? (car f)) (null? (cdr f))))

(define (deep-lambda2? f)
(and (lambda? (car f)) (null? (cdr f))))



318 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:37:34 ]
;; (((lambda (x) ...) M)) -> ((lambda (x) ...) M)
;; (x) -> x
;; ((lambda (a) a)) -> (lambda (a) a)
(define (simpl f)
(cond ((atom? f) f)
((deep-lambda? f) (car f))
((deep-lambda2? f) (car f))
((var? f) (car f))
(else f)))

(define (reduction form)
(cond ((not (beta-redix? form)) form)
((left-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (car form) (cadr form))))))
((right-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (caadr form) (cadr (cadr form)))))))))

(define foo '((lambda (x) x) (lambda (a) a)))
(define bar '((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a)))
(define baz '(x ((lambda (x) x) y)))
(define boo '((lambda (x) x) y))


319 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 08:39:33 ]
> (reduction foo)
((lambda (x) x) (lambda (a) a))
(lambda (a) a)
> (reduction bar)
((lambda (y) y ((lambda (z) x z) (lambda (z) z))) (lambda (a) a))
((lambda (a) a) ((lambda (z) x z) (lambda (z) z)))
((lambda (z) x z) (lambda (z) z))
(x (lambda (z) z))
> (reduction baz)
(x ((lambda (x) x) y))
y
> (reduction boo)
((lambda (x) x) y)
y
>

こんどはいいかな?

320 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:02:39 ]
(define uoo '((lambda (x) (lambda (y) x)) y))

> (reduction uoo)
((lambda (x) (lambda (y) x)) y)
(lambda (y) y)
>

これがダメなんだけどα変換がよくわからない。
高橋正子先生の本にもα変換がないみたい。

321 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 09:42:50 ]
違っていた。修正
(define (beta-redix? f)
(cond ((atom? f) #f)
((and (atom? (car f)) (atom? (cadr f))) #f)
((and (atom? (car f)) (null? (cdr f))) #f)
((and (lambda? (car f))(not (null? (cdr f)))) #t)
((lambda? (caadr f)) #t)
(else #f)))

(define (reduction form)
(cond ((not (beta-redix? form)) form)
((left-lambda? form)
(begin (display form)(newline)
(reduction (simpl (beta-conversion (car form) (cadr form))))))
((right-lambda? form)
(begin (display form)(newline)
(reduction (list (car form)
(simpl (beta-conversion (caadr form) (cadr (cadr form))))))))))

> (reduction baz)
(x ((lambda (x) x) y))
(x y)



322 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 18:13:47 ]
>>306 激しく乙

つ旦

323 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 19:17:30 ]
>>322
ども
だけどGC周りがまだ怪しいから手をくわえなきゃいけない

324 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 21:14:25 ]
tcc.nifty.com/cs/catalog/tcc_schedule/catalog_080118183253_1.htm

gauche.night前売りktkr。今年は黒田さん出ないの?


325 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:02:15 ]
>>324
黒黒田でないんじゃつまらんなぁ

326 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:14:26 ]
>>320
λ式をリストで表現してると、名前の衝突回避は難しいような

327 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:35:04 ]
>>326

> uoo2
((lambda (x) (lambda (z) x)) y)
> (reduce uoo2)
((lambda (x) (lambda (z) x)) y)
(lambda (z) y)
>

束縛変数の付け替えをすればうまくいくはずで、そのことを
α変換というのだと思う。で、このα変換をどのようにアルゴリズム
として表現できるのかと考えている。

新納先生のp156のβ変換の説明の最初にあるアンダーラインの部分が
α変換のことだと思う。

コンパイラ設計者には必須の知識らしいんだけどさっぱりわからない。

328 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:38:22 ]
チャーチ符号化はこんなことなのだと思う。
> two
((lambda (x) (lambda (s) (s (s x)))) 0)
> (reduce two)
((lambda (x) (lambda (s) (s (s x)))) 0)
(lambda (s) (s (s 0)))
> ((lambda (s) (s (s 0))) 1+)
2
>

SICPの1章にもあったような気もするけど忘却の彼方。

329 名前:デフォルトの名無しさん mailto:sage [2008/01/27(日) 23:47:46 ]
openmclがClozure CLに改名したね。

330 名前:326 mailto:sage [2008/01/27(日) 23:58:13 ]
>>327
ああそうか、ちょっと勘違いしてたみたいだ。
(lambda ...) に代入するときに名前を変えてやればいいんだから、
そんなに難しくはないね。

331 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 00:05:11 ]
>>327
住井先生の速攻MinCamlコンパイラ概説のAlpha.mlが読めればそれを参考にするといいかも.
ttp://min-caml.sourceforge.net/
MinCamlではλ式でなくlet recのところでローカル関数を定義するけどね.

構文木を上から調べていって,変数が導入されていたら
グローバルなカウンタか何かを使ってとにかく一意な名前に変えてしまう( x → x1, y → y2 etc. )
そしてハッシュでその対応を覚えておく.
ネストした変数束縛で同じ "x" が再び現れたら,
そこから下の部分木では対応は x → x1 でなく x → x3 (例えば)であるとハッシュを更新.

例.構文木のうち見終わった部分を [] で書くと...
(lambda (x) (lambda (y) (lambda (x) (list x y x))))
→ [lambda [x1] (lambda (y) (lambda (x) (list x y x)))] with {x → x1}
→ [lambda [x1] [lambda [y2] (lambda (x) (list x y x))]] with {x → x1, y → y2}
→ [lambda [x1] [lambda [y2] [lambda [x3] (list x y x)]]] with {x → x3, y → y2}
→ [lambda [x1] [lambda [y2] [lambda [x3] [list x3 y2 x3]]]] with {x → x3, y → y2}



332 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 01:35:10 ]
C#の匿名メソッドはクロージャーじゃないっていうけど、何で?
クロージャーの補足する環境にオブジェクトの値ではなく参照を含めるだけじゃダメなの?
scheme的にはどう?

333 名前:327 mailto:sage [2008/01/28(月) 08:30:39 ]
>>331

ありがとう。
やってみるよ。

334 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 10:26:25 ]
>>332
blogs.msdn.com/abhinaba/archive/2005/10/18/482180.aspx


335 名前:306=323 mailto:sage [2008/01/28(月) 17:16:03 ]
GaucheをOpenBSDザウルスでビルドできるようになったんだけど
45%程度の確率で*load-path*が破損している
55%: ("../test" "../lib" "../libsrc" "../src" ...)
45%: ("\f" "../lib" "../libsrc" "../src" ...)
みたいな感じ
-Iで与えられたディレクトリ名のみが破壊されてる
破壊されるパターンはランダムではなく、
いつも決まった文字列にすり替わってる
GC_DONT_GC=Yesすると0%になるからGC周りの問題なんだろうけど
どこが悪いのか見当もつかない
せめて同じ引数で起動したときには同じ状況になってくれればいいのに

336 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:03:08 ]
うへえ、追いにくそうなバグだね

337 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:36:35 ]
起動してから20分ぐらいして温まったら安定したりしてなw
そのザウルス大丈夫なんだろうな?

338 名前:306 mailto:sage [2008/01/28(月) 23:44:17 ]
これまでにわかったのは
・最初のプロンプトが出る前にGCが発動した場合にのみ破壊が起こってること
・プロンプトが出た後のGCによって破壊されることは(今のところ)ないこと
・同じカレントディレクトリに同じ環境変数に同じコマンドライン引数でgoshを起動しても
最初のプロンプトが出る前にGCが発動するのが1000回試行中440回程度あること
・-I引数をいくつも与えると"srfi-6"とか"srfi-2"とか意味のある文字列にすりかわったりする場合があること
・同じカレントディレクトリに同じ環境変数に同じコマンドライン引数で起動した場合
すりかわった後の文字列はいつも同じであること

これらの材料でアタリをつけられる人いませんか?

339 名前:306 mailto:sage [2008/01/28(月) 23:58:06 ]
温まったら安定するようになるって可能性より
稼働時間長すぎて不安定になってるって可能性のほうが高いかもw
セルフコンパイル&セルフデバッグ&SSH鯖だから

340 名前:306 mailto:sage [2008/01/29(火) 00:05:48 ]
あ、そういえばプログラムが暴走したり長時間走ってるプロセスがあると
プログラムを起動しようとしてもBad Addressで起動しなかったりするようになる
何度も何度もチャレンジすれば起動するけど
i386-OpenBSDならそういうことないんだけど
でもそういうハード的な原因ならもっとランダムに破壊されそうなものだけど
破壊される場合は必ず同じパターンに破壊されるからソフト側の問題だと思う
Boehm-GCの機種依存部分であるスタックの底とstatic領域の始点を得る関数は
破壊パターン正常パターンともに同じ値を返してます
Gauche本体に当てたパッチはDOUBLE_ARMENDIANを未定義にするってのだけだから
やはりBoehm-GCに当てたパッチのバグ臭い

341 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:11:53 ]
>機種依存部分
CPUのレジスタも?・・・考えるだけでも恐ろしい



342 名前:306 mailto:sage [2008/01/29(火) 01:30:37 ]
static領域の終点も同じ値を返すから
どうもレジスタの指す領域のマーク漏れ臭い
でもi386-OpenBSDでは問題ないし
Linuxザウルスではうまくいってる(らしい)から
もうBoehm-GC側では怪しいところはないんだけどなぁ


343 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:46:25 ]
α変換とβ変換を考え直した。
;;λ計算インタープリタ ver0.3

(define (subst old new f)
(cond ((null? f) '())
((equal? (car f) old) (cons new (subst old new (cdr f))))
((atom? (car f)) (cons (car f) (subst old new (cdr f))))
(else (cons (subst old new (car f))(subst old new (cdr f))))))

(define (atom? f)
(and (not (pair? f))))

;;λ式の判定 定義2.1.1(計算論)
(define (lambda-term? f)
(cond ((symbol? f) #t) ;x0,x1...
((number? f) #t) ;1,2,3..数もλ式ということにする。
((null? (cdr f)) #f) ;(M)
((and (eq? (car f) 'lambda)(symbol? (caadr f))(lambda-term? (caddr f))) #t);λx.M
((and (lambda-term? (car f))(lambda-term? (cadr f)))) ;(M N)
(else #f)))


344 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:47:41 ]
;;α変換 λ式の定義にしたがってパース。
(define (alfa-conversion f)
(genvar 'reset)
(reset-var)
(alfa-conversion1 f))

(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)) (l '()))
(bound (caadr f) new)
(set! l (list 'lambda (list new) (alfa-conversion1 (caddr f))))
(reset-var)
l))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))


;;変数リスト
;;((x . x1)(y . x2) ...)
(define var-assoc '())

(define (bound? v)
(let ((ans (assq v var-assoc)))
(if ans
(cdr ans)
#f)))



345 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:49:06 ]
(define (bound old new)
(set! var-assoc (cons (cons old new) var-assoc)))

(define (reset-var)
(set! var-assoc '()))


;; 変数を生成する
(define genvar
(let ((x -1))
(lambda (msg)
(cond ((eq? msg 'gen)
(begin (set! x (+ x 1))
(string->symbol (string-append "x" (number->string x)))))
((eq? msg 'reset)(set! x -1))))))


;;β基の判定 (λx.M)N 計算論p66
(define (beta-redex? f)
(cond ((atom? f) #f)
((atom? (car f)) #f)
((and (eq? (caar f) 'lambda)
(symbol? (caadar f))
(lambda-term? (caddar f))
(lambda-term? (cadr f))) #t)
(else #f)))



346 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:49:59 ]
;;β正規形 β-normal-form
(define (beta-normal-form? f)
(cond ((and (lambda-term? f)(symbol? f)) #t) ; x0
((and (lambda-term? f)(beta-redex? (cadr f))) #f) ;(x λx.M)
((and (lambda-term? f)(not (beta-redex? f))) #t)
(else #f)))

;;β変換
(define (beta-reduce l m)
(let ((arg (caadr l))
(body (cddr l)))
(subst arg m body)))


;; ((N M)) -> (N M)
;; (x0) -> x0
;; (N) -> N
(define (simpl f)
(cond ((lambda-term? f) f)
((and (lambda-term? (car f))(null? (cdr f))) (car f))
((and (lambda-term? (caar f))(lambda-term? (cadar f))) (car f))
(else f)))

(define (reduce form)
(reduce1 (alfa-conversion form)))


347 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 06:51:56 ]
(define (reduce1 form)
(cond ((beta-normal-form? form) form)
((beta-redex? form)
(begin (display form)(newline)
(reduce1 (simpl (beta-reduce (car form) (cadr form))))))
((beta-redex? (cadr form))
(begin (display form)(newline)
(reduce1 (list (car form)
(simpl (beta-reduce (car (cadr form)) (cadr (cadr form))))))))))

> uoo
((lambda (x) (lambda (y) x)) y)
> (reduce uoo)
((lambda (x0) (lambda (x1) x0)) y)
(lambda (x1) y)
>
長々とスマンです。

348 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:10:53 ]
GaucheのGCは保守GCだっけ?
しかもARM?バグバグの予感

349 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 07:15:28 ]
λの本体はやっぱりカッコでくくらないといけなかった。
> bar
((lambda (y) (y ((lambda (z) (x z)) (lambda (z) z))))
(lambda (a) a))
> (reduce bar)
((lambda (x0) (x0 ((lambda (x1) (x x1)) (lambda (x2) x2)))) (lambda (x3) x3))
((lambda (x3) x3) ((lambda (x1) (x x1)) (lambda (x2) x2)))
((lambda (x1) (x x1)) (lambda (x2) x2))
(x (lambda (x2) x2))
>

350 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 12:58:28 ]
>>342
BoehmってXScaleできちんとした実績あるのかなあ

351 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 15:24:15 ]
>>349
余分な括弧を許してsimplを使うのがまわりくどい。

括弧の代わりにXMLみたいなタグをイメージしてみたら?
タグは<variable><application><abstraction>の3種類とする。
余分なタグをつけると意味が変わってしまうから、
余分なタグのない状態を保つことになり、simplなんていらなくなる。


それ以前にβ正規形の定義がおかしい。
β基は一番上とcadr以外の場所にもあるから全部探さないと



352 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:17:23 ]
>>351
>β基は一番上とcadr以外の場所にもあるから全部探さないと

具体的にどういう場合なのか教えてくれないか。考えてみたいんで。

353 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 17:59:52 ]
>>352
バックトラッキングみたいなことかな?

354 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:01:44 ]
λx.λy.x((λz.z)y)とかかな?

355 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:05:57 ]
>>352
最外簡約とかでググって。
>>307の本にも詳しく解説してある。

356 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:07:15 ]
正規形もいれた方がいいかな。

357 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 19:39:46 ]
>>351

言わんとすることがなんとなくわかってきた。
朝、早起きできたら書き直してみるよ。

358 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:06:50 ]
インデックス・オートマトン

359 名前:306 mailto:sage [2008/01/30(水) 06:37:02 ]
原因の一端が突き止められました
グローバル変数pre_cmdsがDATASTARTとDATAENDの間に位置してないから
スキャンの対象外になってたせいのようです
DATASTARTとDATAENDを正しく取得できるようにすればいいようです

360 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:25:09 ]
Arc arclanguage.org/ リリースされたぞ!

361 名前:306 mailto:sage [2008/01/30(水) 07:26:45 ]
Boehm-GCは.bssセクションの末尾からメモリを走査していって
最初にsegvったところ(の1ワード手前)が.rodataセクションの開始点だと仮定してるようですが
arm-OpenBSDはセクションの間ごとにsegvるので
.bssセクションのみをスキャン対象にしてしまうようです
OpenBSD4.2のportsのパッチはそこらへんを工夫してうまくやってるようです



362 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:42:51 ]
おつかれ〜

363 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 09:46:18 ]
>>306さんは凄いなぁ。


364 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 20:09:53 ]
>>360 よくわからんがすばらしい!

365 名前:306 mailto:sage [2008/01/30(水) 20:50:26 ]
C言語の範疇ではrodataセクションに
ヒープへのポインタは入り得ないので
dataセクションとbssセクションをスキャンするようにパッチを当て
test/system.scmのcond-expandのsigwait節にelse節を追加したら(pthreadを無効にしているため)
すべてのtestにpassしました
shiroさんのとこに報告しようと思います

C++とかだとコンストラクタの関係で
rodataセクションにもヒープへのポインタが入り得るのかな?

366 名前:デフォルトの名無しさん mailto:age [2008/01/30(水) 21:41:49 ]
>>306
Arcに期待してもいのかなあ?(期待したいのだけど)
「MzScheme上で動く」って言われても、
それを望んでいたのかなあ?
ソースも何も読んでないけど(「なら何も言うな!」はご勘弁を)
Paul Graham の名前で出てくるのだから
単にLISP処理系の一つではなく
「LISPもSchemeもまとめて、S式はArcに集まれ!」
ぐらいものを期待していたんだけど。

Arcをよく知ってる人!
解説よろしく!

367 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 21:46:26 ]
いまいち何が新しいのかよくわからんのよね>Arc

368 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:02:50 ]
ifとか劣化したcondにしか見えない。

alrefは=(≒setf)のためだと思うが、
値を返してしまうので、成否がわからない。
この問題は多値/optional型がFAだと思うのだが…

369 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:06:22 ]
Schemeでも今では大きい、もっと削ってシンプルに、という方向なのかな。
その割には(とりあえず)Schemeで実装されてるとこが本末転倒だけど。

370 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 22:13:41 ]
シンプルに、っていうか
とにかく記述のコンパクトさにこだわってる感じ
スクリプト言語的な志向性というか

371 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:15:36 ]
tut.txt読んだだけだと
「括弧が少なくて読みづらい」「識別子が短くて読みづらい」
だな
それとなぜかlogoが連想された



372 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:20:26 ]
彼ほどの人物でも「俺様Lisp」の誘惑から逃れることは出来なかったってことか。
あくまで、今のところは、だけど。今後の大化けに期待。

373 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:29:42 ]
もしかしたらSchemeにおける第1級の継続みたいな
画期的な武器があるのかも

374 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:31:50 ]
>>351
余計なカッコがつくのはbeta-reduceで余計なカッコがついてしまうのが原因だった。
;;β変換
(define (beta-reduce l m)
(let ((arg (caadr l))
(body (cddr l))) ;x0 -> (x0), (x y) -> ((x y))
(car (subst arg m body)))) ;(x-) -> x0,((x y)) -> (x y)
α変換の付け替えが違っていた。
(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)))
(bound (caadr f) new)
(list 'lambda (list new) (alfa-conversion1 (caddr f)))))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))


375 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:34:32 ]
β正規形、とりあえず書き直してみたがアヤシイ。
;;β正規形 β-normal-form
(define (beta-normal-form? f)
(cond ((not (lambda-term? f)) #f)
((symbol? f) #t) ; x0,x1...
((number? f) #t) ; 1,2,3...
((and (list? f)(eq? (car f) 'lambda)
(beta-normal-form? (caddr f))) #t) ;λx.x
((and (list? f)
(symbol? (car f))
(beta-normal-form? (cadr f))) #t) ;(x λx.x)
((and (list? f)(symbol? (car f))(symbol? (cadr f))) #f) ;(x0 x1)
(else #f)))

376 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:35:20 ]
結局ベターなLisp方言ってだけなの?>arc
速度的にあまり期待できないなぁ。
せめてCommonLispで実装してほしかったよ。



377 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 23:36:53 ]
 リダクション、書き直してみたけど、左側のネストが深くなるとアウト。
(define (reduce1 form)
(cond ((beta-normal-form? form) form) ;β-normal-form
((and (symbol? (car form))
(beta-redex? (cadr form))) ;(x0 M)
(begin (display form)(newline)
(reduce1 (list (car form) (reduce1 (cadr form))))))
((eq? (car form) 'lambda) ;λx.M
(begin (display form)(newline)
(reduce1 (list (car form)
(cadr form)
(reduce1 (caddr form))))))
((eq? (caar form) 'lambda)
(begin (display form)(newline)
(reduce1 (beta-reduce (car form) (cadr form))))) ;(λx.x)M
(else (error "Reduction error"))))


378 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:23:15 ]
>>351
ヒントください。
α変換。(lambda (x) (lambda (y) (x ((lambda (z) z) y))))だとうまくいくけど
そうすると((lambda (x) (lambda (y) x)) y)がうまくいかない。
λx.λy.λz のように深くなっていくときには一番内側のλ式から変換していくと
思うのだけどxyzを順番に変換していくのがよくわからない。


379 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:26:35 ]
>>378
pc11.2ch.net/test/read.cgi/tech/1193743693/485
イータ簡約って奴でしょ。
www.lambda-bound.com/book/lambdacalc/node21.html


380 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 01:24:32 ]
> Arc
よく見てないけど、グレアムのことだからマクロは使えるんだろうな。

381 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 02:50:21 ]
Arcって車輪の再発明じゃないの。ただのSchemeもどきでしょ。
何か新しいことあるの?



382 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 05:56:09 ]
>>381
知らなきゃ書けない1行目のあとに
知らない奴しか書かない2行目が続くのはどうかと。

383 名前:378 mailto:sage [2008/01/31(木) 07:20:54 ]
α変換については束縛変数のリストをスタックに積めばいいだけだった。
(define (alfa-conversion1 f)
(cond ((and (symbol? f)(bound? f)) (bound? f))
((and (symbol? f)(not(bound? f)) f))
((number? f) f)
((null? (cdr f)) (alfa-conversion1 (car f)))
((and (eq? (car f) 'lambda)(symbol? (caadr f)))
(let ((new (genvar 'gen)) (l '()))
(push-var)
(bound (caadr f) new)
(set! l (list 'lambda (list new) (alfa-conversion1 (caddr f))))
(pop-var)
l))
(else (list (alfa-conversion1 (car f))(alfa-conversion1 (cadr f))))))

(define (push-var)
(set! stack (cons var-assoc stack)))

(define (pop-var)
(set! var-assoc (car stack))
(set! stack (cdr stack)))

384 名前:378 mailto:sage [2008/01/31(木) 07:24:23 ]
多重抽象についてはβ変換を複数の項を扱えるように変更して最左戦略
すればいいみたいなので拡張する。
((lambda (x) (lambda (y) (x y))) a b)
((lambda (x y) (x y)) a b)

385 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 10:03:30 ]
計算論 計算可能性とラムダ計算
ttp://www.amazon.co.jp/dp/4764901846/

この本を読んでおくとschemeに対する理解は
深まりますか?

386 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 11:50:23 ]
>>385
理解が深まると思うよ。
Guy L. Steele, Jr.はScheme開発の初期にチャーチの論文を
読んでたらしいから。Lispはλから離れてしまったけど
Schemeはλに近いと思う。

387 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 11:55:58 ]
>>386
ありがとう。ページ数も少ないし読みやすそうなので
読んで見ます。

388 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 12:15:01 ]
正直、そういう質問が出るくらいだからまだ他に読む本があるはず。

プログラミング言語の新潮流
www.amazon.co.jp/dp/4320023773/
コンピュータサイエンス入門−論理とプログラム意味論
www.amazon.co.jp/dp/4000061909/
guppy.eng.kagawa-u.ac.jp/2005/AdvProg/
「ラムダ計算 プログラミング言語の数学モデル」
www.kurims.kyoto-u.ac.jp/~cs/csnyumon/appendix_A.pdf

>>387
> ページ数も少ないし読みやすそうなので

あれは純然たる数学の本の体裁だから、
プログラミング言語入門的な本に比べると、
十万ページくらいある感じですよ。
あのシリーズは余分な解説はほとんどなくて骨子のみだし。

389 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 12:38:46 ]
>>388
>十万ページくらいある感じですよ。

そうだね。

故中西先生のLispの本も同じシリーズだったと思う。
とっつきは悪いけど時間が経てば理解が深まり名著だって
思うようになるんじゃないかな。最初に中西先生のLisp本
読んだときはさっぱりわからなかったもんなぁ。

390 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 12:42:49 ]
>>388
>>389
そうですか。
もう少しscheme勉強してから読むことにします。
でも絶版になったら嫌なんで買っておきます。

391 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 12:53:47 ]
証明の中でβ変換を並行処理してハァハァする本、という印象があるのだが

Schemeは並行計算や遅延評価に強いわけでもないだろうに

Haskellが「遠い」ように見えるのは型があってマクロがないのが原因だな



392 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:04:05 ]
高橋さんの本を読んでSchemeに対する理解が深まるってのは詐欺に近いと思う。

393 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 18:30:37 ]
journal.mycom.co.jp/news/2008/01/30/022/index.html

394 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 20:12:29 ]
>>393
このスクリーンショットは...
journal.mycom.co.jp/photo/news/2008/01/30/022/images/001l.jpg

395 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:28:26 ]
begin ってw
Pascal みたいやな

396 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:38:29 ]
pascalていうより、そのまんまschemeでわ。

397 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:22:39 ]
(prn "Hello, World!")

398 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:41:32 ]
MzSchemeとどこがちがうんだ?

399 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:50:41 ]
>>394
なにを思ってこの画面を載せたんだろーか

400 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:54:43 ]
いやそもそも^Cでuser breakかけた後はMzSchemeでそ

401 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 23:07:11 ]
>>394
arc関係なさすぎw



402 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:04:08 ]
ほんとに「人気の言語を作るには」がそのまんま形になった感じなんだね > Arc

403 名前:真人間になれ、忍 mailto:sage [2008/02/01(金) 00:10:43 ]
さらしとくw

04:07 PM shinobu@MBPro ~/Downloads/arc0
$ mzscheme -m -f as.scm
Use (quit) to quit, (tl) to return here after an interrupt.
arc> ^Cuser break

=== context ===
/Users/shinobu/Downloads/arc0/ac.scm:904:4
/Users/shinobu/Downloads/arc0/ac.scm:979:7

> (begin
     (display "Hello, World!")
     (newline))
Hello, World!
> ワラ


404 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:23:13 ]
shinobu の OS X ハッキング! にはお世話になっている俺がいる。

405 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:43:11 ]
arcつかえねーよっていう高度なdisだなw

406 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:01:55 ]
使い方わからずに試行錯誤を繰り返して、^Cしてようやく使えた気になってるのかな?

とりあえず魚拓
s04.megalodon.jp/2008-0201-0059-28/journal.mycom.co.jp/news/2008/01/30/022/index.html
s03.megalodon.jp/2008-0201-0100-52/journal.mycom.co.jp/photo/news/2008/01/30/022/images/001l.jpg

407 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 02:04:53 ]
なんかnewlispみたいw

408 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 07:40:31 ]
Arc、あんまり飛躍がなくてずいぶん大人しいなあ。ちょっと期待外れ。

409 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 08:37:01 ]
オブジェクトなマクロって何に使うの?>arc

410 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 11:00:14 ]
構文がファーストクラスってことかな?
なら((fn (x) (x T 'foo 'bar)) if)みたいなことができたり
(apply if '(NIL foo bar))みたいなことができるのかな?
CLみたくマクロと特別式に分かれてるのかな?
Schemeみたく構文として(プリミティブと合成の違いはあるけど)一緒くたなのかな?

411 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:01:40 ]
ラムダ式になっているだけに見えるが、
macro-expandとかしなくてもapply出来るわな、動的に。



412 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:09:06 ]
arc> (let for (fn () (pr "blub ")) (repeat 3 (for)))
Error: "#<procedure>: expects at least 3 arguments, given 0"

こういう時に匿名マクロが欲しい

413 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 17:32:32 ]
arc> (fn (for) (for))
Error: "#<procedure>: expects at least 3 arguments, given 0"

何か変だと思ったら束縛するより先にマクロ展開してる
マクロと同じ名前の局所変数がマクロを隠すことがない
逆にマクロが変数を隠す問題はfuncallに相当するものを使って回避できる
(リストの先頭に来なければマクロに間違われることもないから)

414 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 01:56:42 ]
ttp://blog.livedoor.jp/dankogai/archives/50994188.html

415 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 06:13:13 ]
>>385
その本もってるが、定理と証明ばっかりでさっぱり判らん。
1章はともかく、2章辺りから終始論理式と、「〜を仮定すると
〜を満たす〜があるとき〜は〜の〜という」みたいな口調で
うんざりした。だから何、と。書き方が数学屋さん向け。
時代的に無理だろうけど「はじめに」でLISPの基礎理論だ
とか言うなら、それで書いてくれた方が良い。
プログラマの心理は、手段みたいなものは最初どうでもよくて、
結果や効果からの興味で中身がどうなってるか、と関心が
向いてくと思うんだけど、そういうのを期待できる本じゃない。

416 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 09:19:47 ]
Lispの本質はマクロです
SICP読んだだけの人にはわからんのです

417 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 12:46:00 ]
>>413
schemeのスコープで評価してないだけじゃないかと。
schemeだと
((lambda (list) (list)) (lambda () 'うんこ))
=>うんこ
ちゃんとうんこが出てきます。

418 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 15:31:12 ]
ttp://d3.jpn.org/blog/2008/02/arc_source_review_1.html

419 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:16:18 ]
未完成の俺様Lispでポールが爆釣

420 名前:ポール@アークヒルズ mailto:sage [2008/02/02(土) 17:24:44 ]
沢山釣れた(@wぷ

421 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 18:05:26 ]
アークヒルズってどのポールだよ?



422 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:38:25 ]
arc いいんじゃない。なんか、こう、こざっぱりした感じで。

へ〜、イイ感じじゃん。


423 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:43:34 ]
>>417
これで便秘解消ですね!

424 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:46:12 ]
平方根があるのに三角関数がない?複素数はいいみたい。

arc> (sqrt 2)
1.4142135623730951
arc> (sin 3.14)
Error: "reference to undefined identifier: _sin"
arc> (acos -1)
Error: "reference to undefined identifier: _acos"
arc>
arc> (* 1+1i 1+1i)
0+2i
arc>

425 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:09:55 ]
高階関数はSchemeと同じみたい。ファーストクラス、λと同じ。

(def sum (f n)
(if (is n 0)
0
(+ (f n) (sum f (- n 1)))))
arc> (sum sqrt 10)
22.4682781862041
arc>

426 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:38:53 ]
スピードを比較するのは酷かもしれんけど...

arc> (def tak (x y z)
(if (> x y)
(tak (tak (- x 1) y z)
(tak (- y 1) z x)
(tak (- z 1) x y))
y))
#<procedure: tak>
arc> (tak 12 6 0)
12
arc> time
#3(tagged mac #<procedure>)
arc> (time (tak 12 6 0))
time: 18047 msec.
12
arc>
Schemeで書かれていることを考えれば悪くはない。

427 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:51:27 ]
CommonLisp = ベンツ
Scheme = ポルシェ
Arc = アルファロメオ

428 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:10:43 ]
なんだすぐ錆びるのか Arc

429 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 22:19:26 ]
また遅れるみたいですね... orz

xach.livejournal.com/156584.html

430 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:56:48 ]
きっと初心者がarcやったら混乱する
ポールは結局、前置記法に嫌気が差しただけに見える
pythonやMLみたいなのを設計した方が受けが良いと思う
頭に括弧がある限り、ただのLISP方言だよ

431 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:25:45 ]
煽りでも荒らしでも喧嘩腰でもないレスに1行も同意できないのは珍しい。



432 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:04:24 ]
Arcは予想通りというか、「Perlがこだわっているもの」を取り込んできた感じ(小飼氏の見方は半分くらい受け付けないけど)。
PaulにとってLispの価値は「美しいこと」より「現実的に強いこと」のほうにあって、
「スケッチ的に手を動かして、試行錯誤で形を作っていける力」「同じことを短く書く力」は
特に大きなウェイトを占めるから、かの言語にある程度近づくのは読めたことだろう。

ただしPerlと違うのは、Lispの構文(あるいは構文の無さ)の範疇でそれをやっているからこそ、
Perlの「しっかり覚えてもなお読みにくいという難しさ」は遠ざけることができているところかな。
「覚えなきゃ手が出せない替わりに、覚えれば物凄い速度で書き下ろせるし、混乱無く読めもする」
という所に着地するために、ArcはLispであることと、LispっぽくないことをPaul流に融合させてると思う。

>>430は「Lispである部分」を4行目、「Lispっぽくない部分」を1行目でネガティブに捉えているのだと思う。
でも、俺にはどちらも一つのヴィジョンのもとに選択され、良くまとまっているように思える・・・・・・のは多分、
俺がPaulの文章を読んでLispの世界に足を踏み入れた人間で、頭がまだちゃんと独り立ちしてないからかもしれないw

433 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 03:27:48 ]
arcのfnは構造化代入が使える?のね。
srv.arcに
(with ((i o ip) (socket-accept s)) 〜)
みたいな使われ方があって、withの機能かと思ったら、
with自体はarc.arcに
(mac with (parms . body)
`((fn ,(map1 car (pair parms))
,@body)
,@(map1 cadr (pair parms))))
とだけ書いてあった。つまり最初のを展開するとfnにたらい回しされる。
((fn ((i o ip)) 〜) (socket-accept s))
socket-acceptは多値相当をリストで返すんかな?
こういうのは便利のような気もするけど、つい効率の方を気にしてしまう。
名前付き引数ってわけじゃないのか。


434 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 04:18:26 ]
ac.scmに追加したら数学関数も動いた。
;;数学関数追加
(xdef 'sin sin)
(xdef 'cos cos)
(xdef 'tan tan)
(xdef 'asin asin)
(xdef 'acos acos)
(xdef 'atan atan)

arc> (cos 1)
0.5403023058681398
arc> (= pi (acos -1))
3.141592653589793
arc> pi
3.141592653589793
arc>

435 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 05:16:13 ]
文字列の扱いが楽だね。
arc> (+ "abc" "def")
"abcdef"

そういうのアリ!
arc> ("abc" 2)
#\c
あ、いいかも。

lambdaが無いのは寂しいけど
arc> ((fn (x) (* x x x)) 3)
27
arc>
さっぱりして気持ちいいな。

よし、Arc 気に入った。


436 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 06:17:56 ]
文字列を掛けるとどうなるん?
引き算すると??


437 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 06:19:04 ]
(* "a" 5)
=>"aaaaa"
(- "abcde" "bcd")
=>"ae"



な、わけねーだろ

438 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:31:39 ]
型推論によって
整数が期待されている所では
(+ "abc" "defgh" "ij") -> 10
文字列が期待されている所では
(+ "abc" "defgh" "ij") -> "abcdefghij"
リストが期待されている所では
(+ "abc" "defgh" "ij") -> ("abc" "defgh" "ij")
になるとか?

439 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 14:35:20 ]
>>437
俺Lispはかなり初期からそれやってるw

440 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:42:47 ]
Arcって文字列とリストを同じような感覚で操作できるみたいだ。

arc> (+ '(a b) '(c d))
(a b c d)
arc> (+ '(a b) '(c d))
(a b c d)
arc> (+ "ab" "cd")
"abcd"
arc> (rem 'b '(a b c d))
(a c d)
arc> (rem #\b "abcd")
"acd"
arc>

remはremoveかね。

441 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:45:05 ]
マッカーシー博士がLispを開発した時の気分しだいではこうだったのかもしれない。

(def test (n)
(if (> n 90) 'AA
(> n 80) 'A
(> n 70) 'B
(> n 60) 'C
'D))

シンプルなcond節でifだけで用が足りるからいいかも



442 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:54:15 ]
エディタの自動インデント規則もArc用をちゃんと作りたくなるな。
if とか with とか、2個単位でインデントしたくなる。
(if
 c1
  e1
 c2
  e2)

443 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:37:41 ]
なんかキモ系のAAにしか見えねえw

444 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:40:58 ]
ラムダ算法とかYコンピネータとかの概念を全く知らない
状態でLittle SchemerとかでSchemeを勉強しても
理解できますか?

445 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:43:17 ]
知らないことを開き直るべきではないけど、
とりあえず「知らなきゃどこにも進めない」ってものではないよ。

446 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:51:47 ]
>>>444

全く問題ないよ。
Schemerになりなさい。

447 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:57:42 ]
>>444
読めるよ。全10章中、Yコンビネータが出てくるのは第9章だけ。
これを理解するのに "To Mock A Mockingbird" が巻末で推奨されている。
"Litle Schemer" は習うより慣れろの精神で書かれているので読みやすい。

448 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:02:35 ]
Yコンビネータなんて見りゃどういう事か直感で判るだろ

449 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:03:57 ]
Arcはハッシュが標準装備か。連想リストを使わないでこれもいいかも。

arc> (= var (table))
#hash()
arc> var
#hash()
arc> (= (var 'x) 'x1)
x1
arc> (= (var 'y) 'y1)
y1
arc> var
#hash((y . y1) (x . x1))
arc> (var 'x)
x1
arc>

450 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:11:41 ]
この辺りはCommonLisp風なんだね。

arc> (cdr '())
nil
arc> (car '())
nil
arc> (is '() nil)
t
arc>

451 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:14:59 ]
こんなのもあるんだ〜。
arc> (type "a")
string
arc> (type 1)
int
arc> (type 0.1)
num
arc> (type 'a)
sym
arc> (type '(a))
cons
arc> (type 1+1i)
num
arc>



452 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:19:04 ]
>>445
>>446
>>447
>>448
アドバイスありがとうございます。
C++ばかりやっていて数学的基礎もあまりなく
どうかと思ってたのですが、まずはSchemerシリーズ
3冊を一読してから考えます。

453 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:54:10 ]
一言語を学び始めるのに入門書を3冊読む?気軽にやれよ

454 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:14:49 ]
The Little 〜
www.crockford.com/javascript/little.html

455 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:54:21 ]
Arcのリストと文字列って?

arc> (subst 'a '(b) '(a b c))
"aac"
arc> (subst "a" "b" "abc")
"aac"
arc>

456 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 13:26:47 ]
【普通のやつらの】 Arc Language 0 【上を行け】
pc11.2ch.net/test/read.cgi/tech/1202098949/

ついカッとして立ててみた。悪気はなかった。たとえスレが寂れても
後悔するつもりはない。

457 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:07:50 ]
正直サブタイトルは要らなかったと思う

458 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 15:15:24 ]
荒し呼んでるようなもんだもんなw


459 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 16:24:01 ]
ま、スレが盛り上がるのを期待してるよ。おれたちの期待の
斜め上を行ってくれ。w

460 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 18:29:14 ]
アルファブロガー隔離スレだろ

461 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 18:55:28 ]
たとえ荒氏でも廃れるよりはマシということかw

Arc自体、ちゃんとしたモノになるまでまだ何年かは時間が掛かるだろう。



462 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 19:06:57 ]
現役処理系で動く3-Lispの系統の実装ってありますか?
3-Schemeとか、3-Arcでもいいです。

; Smithの元の実装はMacLISPでした。

463 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 19:12:07 ]
HtDP (How to Design Programs) って読んだ人いる?
www.htdp.org/2003-09-26/Book/
これどんなもんなんかな?

464 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 21:45:46 ]
>>463
お前が読めばいいだろ。

465 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 09:32:49 ]
>>464
そんないじわるな事言わないで><

466 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:17:02 ]
何かと思ったら全部オンラインで読めるじゃん
読むぐらい自分でしろよ

467 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 10:20:38 ]
つーか読みもしないで損得勘定してるのが気に入らんな。
消え失せろ。

468 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 12:18:18 ]
>>467
偉そうな事言わないで><
ネットで吠える事しかできない低能くん。

469 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 12:30:13 ]
自爆かよ

470 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 15:22:53 ]
>< ←これがきもい

471 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 15:34:42 ]
468 デフォルトの名無しさん [sage] Date:2008/02/06(水) 12:18:18  ID: Be:
    >>468
    偉そうな事言わないで><
    ネットで吠える事しかできない低能くん。



472 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 19:30:38 ]
>>463
以前ざっと読んだよ。
いきあたりばったりでしかプログラム書いたことのない無能向け教科書。

473 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 20:25:59 ]
>472
つまりごく当たり前の事しか書いてないと言いたいわけか。

474 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 21:07:29 ]
>>473
思考の段取りもつけられないようなバカも
少なからず存在しているのが世の中なわけで。

プログラミング上の概念については何がとりあげられているかは
目次見ればわかる。あとはデザイン・レシピの部分を拾って
ざっと流せば自分にとって読む必要のあるなしは判断できるだろう。

475 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:03:52 ]
>>474
> 思考の段取りもつけられないようなバカも
> 少なからず存在しているのが世の中なわけで。
ちゃいます!!!
"少なからず"ではなく, 彼らの方が多数なんです, 現場に行けば...


476 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 22:31:14 ]
現場に恵まれていませんね

477 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 23:02:29 ]
... まあええやん。次いこ。

478 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 00:23:25 ]
>>474
絡む気は毛頭ないですが、
ざっと読むだけで必要、不必要が分かるってのは
言い過ぎな気がします

ざっと見た人が不必要だと思ったものでも、じっくり
読めばありな部分とかはないもんですかね?

基本的に安いものじゃないんで本はじっくり見る派です。

479 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 02:41:50 ]
関数型言語マニアのための論文紹介3:FelleisenとSICPとHTDP
d.hatena.ne.jp/sumii/20060413/1144920144
SICP目次
d.hatena.ne.jp/win_fmv/20000101
HtDP目次
d.hatena.ne.jp/win_fmv/20000102

HtDPはSICPより易しいです。
でも「計算機プログラムの構造と解釈」を読み通す根性がないなら
英語アレルギーを乗り越えてHtDPを読むのはなおさら無理です。
素直に「計算機プログラムの構造と解釈」を買って熟読しましょう。

480 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 05:48:04 ]
どこかのスレにあった紹介だと思うが、
よほどの超絶英語コンプレックスだったんだな、それ書いたやつ。

481 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 07:51:12 ]
>>478
ママに読んでもらえバカ。



482 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 08:00:49 ]
じゃあ僕はコンピューターおばあちゃんに読んでもらいます。

483 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 12:51:51 ]
guileはutf-8で日本語は使えないのでしょうか?


484 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:44:33 ]
>>483
> guileはutf-8で日本語は使えないのでしょうか?

guile> (let ((s "日本語表示テストです."))
(string? s))
#t
guile>


485 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 20:51:57 ]
日本語が使えるが何を意味してるかによる

486 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 21:12:09 ]
まあ、日本語なんてこっちじゃ乞食でも気違いでも使ってるからね

487 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 22:59:39 ]
gosh> (define (日本語が使えますか?) #t)
日本語が使えますか?
gosh> (日本語が使えますか?)
#t


488 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 23:27:38 ]
日本語schemeキタコレ

489 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 00:20:27 ]
全角カッコのあつかいはどうなるのでしょうか


490 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:27:27 ]
全角なんてありませんよw

491 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:34:32 ]
lispとかschemeとかやってるとチョコレートもらえないって
先輩が言ったんですけど、ほんまですか?




492 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:36:14 ]
あ、それは本当です。でも人に喋っちゃ駄目だよ。

493 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:38:25 ]
いつもの倍でお得になります。

494 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 01:47:57 ]
チョコレートもらえないからlispとかschemeとかやって
せつないきもちをまぎらわすんだよ

495 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 06:09:52 ]
チョコレートなんてLispで書けばいいだろ。

496 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 08:51:30 ]
((lambda (choco) (choco choco)) (lambda (choco) (choco choco)))

497 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 10:33:35 ]
guileでUTF-8で

guile> (define hoge "ほげほげ")
guile> hoge
"?\x81??\x81\x92?\x81??\x81\x92"
guile> (string-length hoge)
12

となってしまうけど、4にはならないの?

498 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 15:26:02 ]
>>497
guileではcharacterは8bitだったはず
(integer->char 256)はエラー
バイナリデータと文字が混在するファイルを扱う場合は
こっちのほうが割り切って使えるからいい

499 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:31:45 ]
ちょうどいいからお前らにUTF-8の文字数を数える
プログラムでも書いてもらおうかな。

【問題】上のGuileのような文字列のバイト列を
UTF-8とみなし、その文字数を返す関数を書け。

500 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 16:44:49 ]
宿題スレでLispの質問しちゃいけないわけじゃないでしょ?

501 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:15:55 ]
(define (utf8len str)
__(begin (define (follow-char? c)
____________(char<=? #\200 c #\277)))
__(and (string? str)
_______(let ((strlen (string-length str)))
_________(let loop ((acc 0)
____________________(i 0))
___________(cond ((= i strlen) acc)
_________________((char<=? #\0
___________________________(string-ref str i)
___________________________#\177)
__________________(loop (+ acc 1) (+ i 1)))
_________________((and (< (+ i 1) strlen)
_______________________(char<=? #\300
________________________________(string-ref str i)
________________________________#\337)
_______________________(follow-char? (string-ref str (+ i 1))))



502 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:19:21 ]
続きが書き込めない

503 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:52:54 ]
;; SICP挫折中の見習いです
(define (utf8-string-length s)
  (define (first-byte->length b)
    (define byte (char->integer b))
    (cond ((<= #x00 byte #xbf) 1)
          ((<= #xc0 byte #xdf) 2)
          ((<= #xe0 byte #xef) 3)
          ((<= #xf0 byte #xf7) 4)
          ((<= #xf8 byte #xfb) 5)
          ((<= #xfc byte #xfd) 6)))
  (define strlen (string-length s))
  (define (strlen-iter index len)
    (if (<= strlen index) len
      (strlen-iter (+ index (first-byte->length (string-ref s index)))
                  (+ len 1))))
  (strlen-iter 0 0))

504 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 17:53:58 ]
__(loop (+ acc 1) (+ i 2)))
_((and (< (+ i 2) strlen)
_______(char<=? #\340
________(string-ref str i)
________________#\357)
_______(follow-char? (string-ref str (+ i 1)))
_______(follow-char? (string-ref str (+ i 2))))
__(loop (+ acc 1) (+ i 3)))
_((and (< (+ i 3) strlen)
_______(char<=? #\360
________________(string-ref str i)
________________#\367)
_______(follow-char? (string-ref str (+ i 1)))
_______(follow-char? (string-ref str (+ i 2)))
_______(follow-char? (string-ref str (+ i 3))))
__(loop (+ acc 1) (+ i 4)))
_(else #f))))))
これならどうだ

505 名前:デフォルトの名無しさん mailto:age [2008/02/09(土) 21:41:09 ]
Windows Vistaなんだけど、
SBCL1.0.13よりLarcenyのほうが圧倒的に速いんだけど
こんなものなの?

506 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:52:43 ]
コンパイルした?

507 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 22:12:21 ]
>>462
3-Schemeと言っていい、Brownと後継Bloodはみつからず、
その代わり米澤研のRScheme, Blackが見つかりました。
RSchemeは論文に全コードが、Blackは米澤研のWebサーバ:/pub/black

508 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 23:38:58 ]
ウィンドウスxpで使えて最初から
hspみたいなライブラリがついてる実装って無い?

509 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 01:03:55 ]
>>505
測定したプログラムや測定方法を書いてくれたら追試してくれる人が居るかもよ

510 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 01:06:52 ]
Larcenyのほうが設計が10年以上新しいんだし、そんなもんじゃね。
>>508はPLT Schemeとかどうよ。

511 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 03:04:12 ]
scsh という Scheme シェルを入れてみた。未だ起動もしてないけど。

www.scsh.net/


それだけ。



512 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 08:43:08 ]
>>508
community.schemewiki.org/?scheme-faq-standards#H-3sv08v
community.schemewiki.org/?scheme-faq-standards#specialimpl

513 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 11:47:46 ]
>>510
見てみます
ありがとうございました

514 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:14:31 ]
>>505

Larceny めちゃくちゃ速いんで驚いたよ。
主要開発メンバーってLight Ship MacScheme 作ってた人でしょ。
この処理系、かなり期待。



515 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:31:00 ]
いやだからコンパイラで比べてるのかインタプリタで比べてるのかくらい晒してくれよ

516 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 22:47:46 ]
> (time (tak 12 6 0))
Words allocated: 0
Words reclaimed: 0
Elapsed time...: 156 ms (User: 156 ms; System: 0 ms)
Elapsed GC time: 0 ms (CPU: 0 in 0 collections.)
12

compile-file にしてもしなくても同じ結果。読み込んだ時点で
コンパイル済みなんじゃないかな。
記憶違いかもしれないけどアセンブラがどうとかってHPにあったような。
かなり最適化をしているのかも。

517 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:00:19 ]
現在のLisp処理系のコンパイラってどんな仕組みになってんの?
Lisp1.5の時代はLAPを使ってたけど、今はVMなんかね?

Arcのコード読みでああいう簡単なのはおおよそわかったけど、
本格的なのってどういう仕組みをとってるんだろう。

518 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:05:01 ]
ネイティブ吐くのもいるし、
独自じゃなくて、JVMをターゲットにするのもある。

519 名前:デフォルトの名無しさん mailto:sage [2008/02/10(日) 23:58:11 ]
最近ではC言語のソースを吐くってのは流行らんのかね?
あれ、良いと思うんだけどな。

520 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:03:19 ]
C言語のソースを吐かれても人間が可読でなければ意味がない。

521 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:04:18 ]
yaccとかlexの立場がないな



522 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:04:51 ]
いや、新しいCPUの最適化とかをC言語コンパイラに任す事ができるw。

523 名前:デフォルトの名無しさん mailto:age [2008/02/11(月) 00:30:25 ]
SBCLのManualページを見たけどよくわからない
・・・俺が馬鹿なのは知ってるから。
SBCLのコンパイルから実行までの手順をご教授願いたい。
正直言って
初めてLISPをインストールして
「どんなのかなあ?使ってみようかなあ」と思っても
CやJAVAのように簡単に入口の手順が調べられないんですよ。
「そんな厨はLISP使うな!」は無しでお願いします。

524 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:44:41 ]
「SBCLをコンパイルする」のか「SBCLでコンパイルする」のかで、話が変わると思うよ

525 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 00:47:36 ]
>523
で、プラットフォームは何?
Mac,Linux,Windows?

初めてでWindows上ならxyzzy上のLispなんかの方が手近だと思うが。
Meadowだ、slimeだ、Emacsだとかは面倒くさいでしょ?

526 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:01:22 ]
xyzzyは独自仕様だからお勧めしにくいな。俺のお薦めはCLISP。

527 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:08:39 ]
1. LispWorks Personal Edition をダウンロードする
2. インストールする
3. New File でファイルを編集
4. コンパイルボタンを押す
5. REPL から呼び出す

528 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:09:31 ]
って言うか、何のために「SBCLのコンパイルから実行」したいの?
それによっても答えが変わると思う

529 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:13:14 ]
i386とpowerpc以外のCPU
LinuxとFreeBSDとMacOSX以外のUnixLikeOSで動かせて
Gauche並の軽さ&速さとは言わないけど
Pythonくらいの軽さ&速さはあるCL処理系ってありますか?
SchemeでもGaucheより速い処理系も軽い処理系もあるけど
速さと軽さのバランスが一番いいのはやはりGauche
コンパイルすればCLのがチョッ速だと思うけど重い処理系が多いように思えます

530 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:16:48 ]
>CやJAVAのように簡単に入口の手順が調べられない

と書いてあるから、SBCL 自体のコンパイルをしたい訳ではないと予想。
cc や javac を使う様な感じで、コンパイル済みファイル(fasl?)を作成して
それをロード→実行する方法を聞いているんじゃないかしら。

すまんが俺は最近 SBCL を触っていないので、やり方が分からん。

531 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:18:32 ]
>>529
CLISP



532 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:22:00 ]
わざわざ答えて頂いたのに申し訳ないのですが
CLISPの最近のverはi386-OpenBSDでも動かないのです
(ビルドは出来るけどsaveinitmem:executable Tとか動かない)
それにちょっと遅すぎます
ECLのほうが速いくらいです

533 名前:デフォルトの名無しさん mailto:age [2008/02/11(月) 01:23:15 ]
>524、525
すみません説明不足で
要するに先に出てた、SBCL VS Larceny を
Tak関数を使ってやりたいのです。

OS:Windows Vista
LISP:SBCL1.0.13
でTak関数がtak.clというファイル名であるとして
(compile-file "tak.cl")
とすれば、tak.fasl ファイルができるのですが・・・
ここから先が・・・orz

でもコンパイルしたとしても
実行時にSBCL起動して
(time (tak 12 6 0))
なんてすると意味の無いような気がするし、
"(time)"の部分も当初の tak.cl に入れて
コンパイルすればいいのでしょうが、
そこまで頭が回らないので助けていただこうかと。






534 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:23:53 ]
そんな無理して CL 使わんでも…。
今度は CLISP より ○○ のほうが優れているように思えます!! とか言いそうだな…。
無理せず Gauche 使えばいいじゃん。

535 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:25:40 ]
>>532
そういう事は先に書かないと駄目だよ
ECL はネイティブコンパイルするから CLISP よりも速くて当然なんじゃないの?

536 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:27:38 ]
ECLは速さはまあ及第点なのですが
重すぎるのが難点
KCLファミリーでありながらCLtl2な所とか
長所もいろいろあるのですが
(*package*がCOMMON-LISP-USERだからCLtl2とみなしてもいいんですよね?)

537 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:29:18 ]
Larceny が勝利!!よって Scheme >>> CL !!! とかやりだしそうだな…。
まぁ、10年以上後発なんだし結果は見えているような。

538 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 01:31:25 ]
元気な奴だな。マニュアルも読まれずに評価されるCLコンパイラがちょっとだけ気の毒

539 名前:529=532=536 mailto:sage [2008/02/11(月) 01:43:40 ]
普段はSchemerですが
CLにも敬意を表してちゃんと使えるようになりたいと考えております
多分に主観的ですが
エレガントさはSchemeに分が
それ以外の大部分はCLに分があると思っています

LuaみたいにAnsiCさえあれば動くぜ!みたいな処理系がCLにもSchemeにもほしいものです

540 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:09:14 ]
>>539
GC等のことを考えると速度的なペナルティ無しに完全にANSI-Cの範囲で記述するのは難しい
んじゃないかな。遅い処理系なら作れると思うけど、速くするには何かズルしないと。w

541 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:09:25 ]
(define (valentine choco)
     (if (zero? choco)
       (display "お前は既に死んでいる")
     (display "カエルchokochoko3chokochoko/n合わせてchokochoko6chokochoko")))




542 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:11:41 ]
>>533
(load "tak.fasl")

543 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 02:37:04 ]
Gaucheの本ってまだぁ?チンチン

544 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:26:33 ]
Common Lispに敬意を払いたいといいつつ
takを選んでしかも最適化宣言無し…意図が無いとしたら天才かもしれん。

haskell使えば?

545 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 04:46:57 ]
tak の人とは別人じゃないかな?
俺も Schemer が余興でやるなら CL より Haskell が良いと思う

546 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 17:38:54 ]
ttp://lispuser.net/memo/lisp/2006-12-08-03-54.html
これを参考にしてSchemeでScheme処理系を書いている。
↑これはわかりやすくて短くていいわ。
それと「Schemeによる記号処理入門」森北出版



547 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:03:40 ]
そこのサイトって誰が書いてるのかわからんし。
結局LISPユーザー向けじゃなくてACLユーザー向けのサイトじゃん。

読んでいて ム カ つ く んですよね。

548 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:06:07 ]
そこはCで書いてくれ

549 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 18:06:35 ]
またバストダンジョンか

550 名前:546 mailto:sage [2008/02/11(月) 19:40:01 ]
>>547
そこってなんかヤバイんかい?

しっかりしたまともな内容だと思うけど...



551 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:47:46 ]
>>550
ごめんかんちがいかも。
でもなんか気色悪いわ。



552 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:49:08 ]
>>547 は別のサイトと勘違いしてるっぽい感じがするけど

553 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 19:52:38 ]
>>547
俺には一部のACL向けの記事があるだけのように思うが。
ちゅうか中の人はCLISPの開発者なんだし、誤解のような気もするけど。

554 名前:547 mailto:sage [2008/02/11(月) 20:55:01 ]
>>553
そうなんだ?完全に勘違いですね。ごめんなさい>>All

555 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:08:43 ]
日本語で PLT Scheme を説明してるサイトってどっかにありませんかね?


556 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:46:32 ]
>>>555
Shiroさんとこのwilikiにある↓をいつも参考にしてるよ。
ttp://practical-scheme.net/wiliki/wiliki.cgi?MzScheme

557 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 21:48:00 ]
あ、まちがえた。MzじゃなくてDRの方だよね。

558 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:00:04 ]
Drに入ってる言語のオプションがよくわからないんです><

559 名前:555 mailto:sage [2008/02/11(月) 23:13:00 ]
>>557
PLT Scheme で GUI を作りたいと考えています。

560 名前:デフォルトの名無しさん mailto:sage [2008/02/11(月) 23:27:19 ]
>>559
Drは使ったことがないのでよくわからないけど
MrEDと連携してグラフィクスなんかできたんじゃ
なかったっけ。

561 名前:デフォルトの名無しさん [2008/02/12(火) 19:14:40 ]
HaskellにはLispのような優秀なマクロがないので埋め込み言語を実装しにくいって本当かね?



562 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:45:30 ]
マクロよりS式の方が大きいでしょ。
S式はDSLのプロトタイプに最適だもん。
Lisp1.5の時代から、俺eval、俺apply作れたんだから。

563 名前:デフォルトの名無しさん mailto:sage [2008/02/12(火) 19:47:36 ]
一方、しっかりした仕様のある言語なら、
pugsの例を見るまでもなくHaskellも結構いける。
宣言型のコード書きやすいから。
Prologはどっか行っちゃった。

564 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 08:57:01 ]
第2回gauche.nightチケット売り切れました。
本当にありがとうございました。

565 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 12:31:55 ]
どういたしまして

566 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 00:50:36 ]
>>564
本も売り切れるといいね。

567 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 01:05:33 ]
初心者です.マクロについて質問させてください.
以前に出ていた日本語のScheme本から(一部抜粋)
(define-syntax Cond (syntax-rules (else =>)
;; #0
((Cond (else result1 result2 ...)) (begin result1 result2 ...))
;; #1
((Cond (test => result)) (let ((temp test)) (if temp (result temp))))
;; #2
((Cond (test => result) clause1 clause2 ...)
(let ((temp test)) (if temp (result temp) (Cond clause1 clause2 ...))))
;; #3
((Cond (test)) test)
;; #4
((Cond (test) clause1 clause2 ...) (or test (Cond clause1 clause2 ...)))
;; #5
((Cond (test result1 result2 ...)) (if test (begin result1 result2 ...)))
;; #6
((Cond (test result1 result2 ...) clause1 clause2 ...)
(if test (begin result1 result2 ...) (Cond clause1 clause2 ...)))))
(let ((=> #f)) (Cond (#t => 'ok)))
scmだと本の解説通り ok と表示されるのですが, scm ではないある処理系に
読み込ませたところ,'ok がprocedureではない,というエラーになりました.
どうやら「=>」に#fが束縛されておらず keywordである「=>」として扱われたようです.
正しくは,すべてのsymbolの束縛関係が解決されてから syntaxに渡され
(て,最終的にokとな)ると考えて良いのでしょうか.

568 名前:567 mailto:sage [2008/02/15(金) 01:32:22 ]
もしそうだとすると,その束縛関係が参照されるのは,
syntax定義の時点でしょうか,それとも
syntax呼び出しの時点でしょうか.

569 名前:567 mailto:sage [2008/02/15(金) 01:57:21 ]
>>568 の質問の形を変えます.
syntax定義時と呼び出し時とで異なる値に束縛されたsymbolは
どちらの値に置き換えられて評価されるのでしょうか.
単純なscopeの優先度からすると,syntax呼び出し時の値が使われそうですが,
closureやsyntaxが制作者の意図通り動くことを保証するためには
syntax定義時の値が使われるべきなのではないかと思うのです.
closureだとclosure定義時の環境が参照されると理解しています.

570 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 02:48:34 ]
そこまで確信してるなら「scm ではないある処理系」の製作者に直接言えば?

571 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 08:29:51 ]
どちらが正しいかを決めるルールが存在するとは限らない。



572 名前:567 mailto:sage [2008/02/15(金) 08:52:11 ]
混乱していましたが一晩寝たら少し整理できたように思います.
本の説明とscmの実装が正しいとして,束縛関係の優先順位が
1.syntax定義時
2.syntax呼び出し時
であれば納得できそうです.

573 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 12:51:51 ]
R5RSに於いては
マクロに於けるリテラル識別子(この場合はelseと=>)がマッチするのは
マクロ定義とマクロ使用でともに同じ束縛を持つか
ともに束縛を持たない場合のみだから
その「scm ではないある処理系」の挙動は正しくない。
マクロのパターンマッチに束縛情報が使われることから
束縛関係を解決してから展開されるという解釈は正しいと思う。
ただしSchemeの場合は値ではなく場所に束縛される。
だから
(define foo 100)
(let ((foo foo)) foo)
ではトップレベルのfooとlet式中のfooは同じ値で違う束縛である。
(さらに細かく言えば束縛されるのはSymbolではなくidentifierである。)
このCondの例は定義時に=>が束縛を持たなかったのに(あるいは定義時の字句的束縛を持っていたのに)
使用時に=>がローカルな束縛を持っていたから#1にマッチしなかっただけである。
同じ束縛を持っていた場合は変数参照式として値が使われることはなく、リテラル識別子として#1にマッチする。
また、マクロ使用において束縛関係の優先順位が
1. 定義時
2. 使用時
というのは逆。
マクロ使用式の識別子の束縛は使用される式の位置に於ける字句的束縛である。
だからマクロ名である構文キーワード(この場合はCond)はローカル変数束縛に隠蔽されうる。
ただし展開され、挿入された式は定義に於ける字句的束縛を持つ。

犬飼大氏はscmやSLIBはR5RSに準拠してると仰ってるけれども
scmや派生処理系のGNU guileはマクロ周りを含め準拠していない部分も結構あるから
R5RSの学習には不向きだと思われる。

574 名前:567 mailto:sage [2008/02/15(金) 13:04:47 ]
>>573
要を得ない質問の意図をくみ取ってくださり
的確なご解説をいただきましてありがとうございます.
>>573を読み返して考えてみます.

575 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:10:32 ]
C言語風に言い換えれば束縛という名詞は変数のアドレス。

(define x 100)
(define y 1000)
(define-syntax foo (syntax-rules () ((foo y) (+ x y))))
;パターン(foo y)に現れていなくてテンプレート(+ x y)に現れている識別子は+とx
;さらに自由識別子だから
;+とxは挿入された場所の字句的束縛ではなく
;マクロ定義された場所の字句的束縛を持つ
;yはマクロに於ける仮引数だからマクロ使用の式の値になる

(let ((x 10))
 (foo y))
-> 1100
(let ((x 10))
 (foo x))
-> 110
(let ((y 1))
 (foo x))
-> 200
(let ((y 1))
 (foo y))
-> 101
(let ((+ -))
(foo 10000))
-> 10100

576 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:10:53 ]
R5RS保健的マクロの束縛識別子は処理系によって解釈が分かれてるから使わない方が吉かも。
束縛識別子とは(let ((x 10)) ...)とか(define x 100)に於けるxのことで
変数捕獲を防ぐ為にリネームされるハズなんだけど
リネームしてくれないscm系
必要最小限にリネームするGauche系
必ずリネームするScheme48系があって
それぞれ挙動が違う。

577 名前:567 mailto:sage [2008/02/15(金) 14:16:58 ]
>>573
ありがとうございます.ようやく理解できました.
マクロ使用における束縛関係の優先順位も,使用時の束縛関係が
定義時の束縛関係に優先するとしたほうが自然であると納得できました.
私の混乱の原因のひとつに,マクロのtemplate上のsymbol「=>」と,
マクロを適用するユーザコード上のsymbol「=>」とを混同していたことが
ありました.これらを明確に区別すべきでした.
なお,>>567に書きました非scmの処理系はbigloo(ver.3.0c)です.
また,guileはdefine-syntaxやsyntax-rules自体を実装していないようです.

578 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:18:31 ]
guileは(use-syntax (ice-9 syncase))をすると
syntax-caseとsyntax-rulesが使えるようになります

579 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:22:37 ]
束縛識別子でもlet系の場合はどの処理系もリネームしてくれるんだった。
defineは使わない方が吉、の間違い。

scm系はリネームせずにdefineします。

Gaucheは(多分)set!として働く場合はリネームしませんがそれ以外はリネームします。

Scheme48系は常にリネームします。
なのでマクロテンプレート以外から参照できません。

580 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:28:19 ]
ああさらに間違い。
Gaucheはトップレベルdefineはリネームせず、内部defineのみリネームするようです。

581 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:36:22 ]
また少しだけ衛生的マクロが嫌いになりました



582 名前:567 mailto:sage [2008/02/15(金) 14:36:34 ]
>>575 - >>580
みなさま情報ありがとうございます
>>578 の方法でguileでも>>567のコードを正しく評価できました

583 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:38:29 ]
>>577
マクロテンプレート(例えば(let ((temp test)) (if temp (result temp))))中の(この例では現れていませんが)=>は
マクロ定義された場所で可視だった束縛を参照します。

マクロパターン(例えば(Cond (test => result)))中の=>は
マクロ使用式(Cond (#t => 'ok))中の識別子=>とのマッチングに使われます。
マクロ使用式の=>とマクロ定義の=>がともに未束縛であるか
或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする訳です。

584 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 14:59:43 ]
テンプレート(foo X Y)に於いてfooという識別子に意味はありません。
最初の識別子はマッチングに利用されません。
なので(_ X Y)等と書くこともあります。

XとYはいわばメタ仮引数。マクロ使用式の同じ位置の式にマッチします。
そしてテンプレート中ではマクロ使用式の同じ位置の式が挿入されます。

(syntax-rules (hoge funi) ...)に於いてhogeとfuniはリテラル識別子となります。
パターンに現れる場合はマッチングにのみ利用されます。
マッチングは同じ識別子で且つ同じ束縛である場合にのみ成功します。

テンプレート中に現れる識別子のうち、パターンの中にリテラル識別子以外で現れた識別子以外は
マクロ定義された場所で可視だった束縛を参照します。
ただし束縛コンストラクタで作られる場所に束縛される場合は実質的に改名されます。

なのでテンプレート中に=>が出現してたらそれはマクロ定義された場所の束縛を参照します。

(define bar 100)
(define-syntax foo (syntax-rules (bar)
 ((foo bar) bar))
(foo bar)
-> 100
(let ((bar 10000))
 (foo bar))
=> ERROR! ;パターンマッチングに失敗

585 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:00:33 ]
最初の単語から間違えたorz
パターン(foo X Y)の間違い

586 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:36:36 ]
リテラル識別子ってsyntax-rulesのところで束縛されているように見えるけど
本当に束縛してしまうと絶対にマッチしないパターンになるのか
紛らわしいな

587 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 15:54:38 ]
なんか長々と分かりにくい書き方だったな
リテラル識別子はパターン部分で特別扱いするだけ
でもリテラルといいながら変数と看做したときの束縛までマッチングに利用するのは少し変な気がする。

パターン変数:任意の式にマッチする。テンプレート中ではマッチした式として挿入される。
リテラル識別子:同じ束縛を持つ同じ識別子とだけマッチする。テンプレート中ではパターン変数以外の識別子と同じ扱い。
パターン変数以外の識別子:テンプレート中の変数参照はマクロ定義された位置での束縛の参照が挿入される。
 テンプレート中の束縛コンストラクタで新たに束縛される場合はその参照と共に改名される。

これの方がいいかな

588 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:01:42 ]
ttp://www.r6rs.org/final/html/r6rs/r6rs-Z-H-14.html#node_sec_11.19

>A literal identifier matches an input subform if and only if
>the input subform is an identifier and
>either both its occurrence in the input expression and
>its occurrence in the list of literals have the same lexical binding, or
>the two identifiers have the same name and both have no lexical binding.

589 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:55:31 ]
R5RSの3.1によれば
構文の型の名前は全て構文に束縛されていて構文キーワードである
変数とは構文キーワードでない任意の識別子である(elseと=>も構文キーワードだから変数でない)
またR5RSの4・5章によれば
defineは
(define <変数> <式>)
(define (<変数> <仮引数部>) <本体>)
(define (<変数> . <仮引数>) <本体>)
のいずれか
set!は
(set! <変数> <式>)
lambdaは
(lambda <仮引数部> <本体>) 但し<仮引数部>は(<変数1> ...)、<変数>、(<変数1> ... <変数n> . <変数n+1>)のいずれか
てことは構文キーワードをを隠蔽するローカル変数あるいはトップレベル変数をdefine、set!、lambda、let、let*、letrec、doで作る事はR5RS外だったんだ
構文キーワードの変数参照がR5RS外って事は知ってたけどこの事は知らなかった

だけど4.3にはローカル変数束縛がキーワード束縛を隠蔽しても良いって書いてあるけど
どうすれば構文キーワードを隠蔽できるローカル変数束縛ができるの?
他方、構文束縛は変数でなく識別子に対して行われるからローカル構文束縛で隠蔽されることはあり得る。

7.2.1の抽象構文に於いては変数と識別子が同一されているから<変数>の解釈が2パターンあるってオチなんだろうけど

590 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 16:56:06 ]
typo
同一されている->同一視されている

591 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:14:38 ]
Gauche0.8.13がリリースされてたのか!
気付かなかった



592 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 18:15:03 ]
Schemeのconsを少し勉強していたら以前さっぱりだったC++の
再帰のメタプログラムがわかるようになってきた。
両方勉強しようと思う。

593 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 01:49:25 ]
すみませんが、質問です。

DrSchemeのGUI環境で、選択できる言語の一つに、遅延評価のLazy Schemeとい
うのがあるのですが、これで tarai を回して, time関数で時間を計ろうとすると、
tarai関数は実行されず、promiseオブジェクトが返ってきてしまいます。

> (time (tarai 200 100 0))
cpu time: 0 real time: 0 gc time: 0
#<promise:?>

どこかにforceを書けばいいのかと思ったのですが、いろいろやってもうまく行
きません。

> (time (force (tarai 200 100 0)))
cpu time: 0 real time: 0 gc time: 0
#<promise:?>

どなたか見当のつく方、アドバイスをいただけないでしょうか?


594 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 02:12:54 ]
forceしろ

595 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 08:50:34 ]
timeがpromiseを返してるのでは?

596 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:06:33 ]
DrSchemeを触らずに595を書いたけど
見当はずれだったみたい
ごめんなさい
とりあえず
(force (delay (time (tarai 200 100 0))))
したら計算できた
syntaxにおけるimplicit forcingがうまく働いてないのかも
forceはprocedureだから引数がimplicit forceされてforceしようとした値がpromiseじゃなくなってるとか
implicit delayとdelayが違う物みたいだし
doc読んでないので見当違いかもしれないけど


597 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:08:30 ]
あ、((lambda (x) x) (time (tarai 200 100 0)))でもいいみたい

598 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:11:48 ]
>>596
> (force (delay (time (tarai 200 100 0))))

delayいらないんじゃね?

599 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:12:56 ]
(time (tarai 200 100 0))が関数に渡されたときはちゃんと200が返るけど
マクロを含めsyntaxに渡されたときは#<promise:?>が返る

600 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:14:05 ]
>>598
(force (time (tarai 200 100 0)))だとforceに200が渡されてエラー
forceは関数だからだと思われる
明示的にdelayしてないとimplicit forceされる

601 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:23:37 ]
implicit delayされた物はimplicit forceされる
explicit delayされた物はexplicit forceしなくてはいけない
implicit delayされた物をexplicit forceすることはできない
explicit delayされた物はimplicit forceされない
implicit forceされるのは値を受け取る継続が関数の場合のみ
timeはsyntaxであるから#<struct:promise>でなく#<promise:?>が返される
ってことかな?



602 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:34:26 ]
implicit promiseはimplicit forceされると最早implicit promiseでなくなる
他方、explicit promiseはexplicit forceされてもexplicit promiseのまま
(define x (call/cc (lambda (return) (delay (return 'value)))))
x
-> #<struct:promise>
(promise? x)
-> #t
(force x)
(promise? x)
-> #f
x
-> 'value
こんな感じなのかな

603 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 12:42:06 ]
> (time 1)
cpu time: 0 real time: 0 gc time: 0
1
> (time (+ 1 1))
cpu time: 0 real time: 0 gc time: 0
#<struct:promise>

だなあ。

604 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:16:33 ]
v372@PPCmacだと
ようこそ DrScheme, バージョン 372 [3m].
言語: Lazy Scheme.
> (time 1)
cpu time: 0 real time: 1 gc time: 0
1
> (time (+ 1 1))
cpu time: 0 real time: 0 gc time: 0
#<promise:?>
になりますね
とにかく構文に渡されたimplicit promiseはimplicit forceされないので
implicit forceされた物を構文に渡さないといけないみたい

605 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 13:24:37 ]
いや違った
構文の値を受け取る継続がトップレベルまたは構文の場合は
implicit forceされない…のかも

606 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:14:59 ]
単に値をpromiseで持ち回ってるのではなくて
ちゃんと正規評価してると考えた方がいいのかも
ifやcond遅延評価処理系では関数的な構文
トップレベルでは評価されない
そういった意味では構文はquoteとdefineとset!とlambdaとその派生式のみになる
timeやifやcondやandやorは関数的な構文なので評価されない
これで辻褄が合うと思う

607 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:18:15 ]
typo
ifやcond*などの*遅延評価処理系では関数的な構文
つまり(quoteなどの関数では記述できない構文)以外のことね

608 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 14:19:34 ]
(quoteなどの(関数では記述できない構文))以外

609 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:13:46 ]
>>603はv360

610 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:19:12 ]
ようこそDrScheme, バージョン 360.
言語: Lazy Scheme.
> (fact 10)
3628800
> (time (fact 10))
cpu time: 0 real time: 0 gc time: 0
#<struct:promise>
> (force (time (fact 10)))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
> (force (delay (time (fact 10))))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
> (+ 0 (time (fact 10)))
cpu time: 0 real time: 0 gc time: 0
3628800

だな。このバージョンのトップレベルはなんかおかしいな。

611 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:40:16 ]
・自己評価データは評価される
・変数参照は評価される
・手続き呼出しは評価される
・マクロ使用は展開される
・defineは束縛した変数が参照されるまで評価されない
・quote、begin、lambda、quasiquote、delayは評価される
・構文定義構文は不明
・これら以外は評価されない
・評価される式から参照される式は評価される
という構文周り以外はオーソドックスな実装になってるみたい
末尾再帰がspace leakしないし



612 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:44:28 ]
・これら以外は(トップレベルでは)評価されない、に訂正
トップレベル以外で評価される文脈に於いては構文も評価される

613 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:47:00 ]
defineはトップレベルでも評価されるが
束縛された式(正しくない表現だけど意図を察してください(^_^;))は
変数が参照されるまで評価されない、という表現に訂正

614 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:54:10 ]
v360とv372は評価されなかった構文の値の表記が異なるだけで
挙動自体は同じみたいですね
とにかくifもcondもandもorも正格評価の為に構文とされちゃった物は
関数でラッピングしちゃえばいい
(define lazy-if
 (lambda (pred then-clause else-clause)
  (if pred then-clause else-clause)))
みたいに

615 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 16:57:50 ]
と思ったら
> (force (delay (time (fact 10))))
cpu time: 0 real time: 0 gc time: 0
※ force: expected argument of type <promise>; given 3628800
ここが違いますね
v372だと時間が計測されて3628800が返ります

616 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:05:28 ]
time構文はトップレベルでも式が自己評価データの場合は評価されるんだ
でも式が変数参照だと?じゃないpromiseを返す
単にバグバグなだけかも…

617 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 17:12:19 ]
自己評価データでなくリテラルの場合だった

618 名前:567 mailto:sage [2008/02/16(土) 18:03:55 ]
DrSchemeの話題で盛り上がっているところ申し訳ありません.
macro 展開の際に,あらかじめ symbol の束縛関係が参照されると理解しました.
この点についてもう少し具体的に質問させてください (>>589の記述に関係しているのかもしれません).
内部で set! を呼ぶだけの macro Set1 を書いてみました.
;; マクロ定義
(define-syntax Set1 (syntax-rules () ((_ macroSymA macroSymB) (set! macroSymA macroSymB))))
;; 前準備
(define variable 200)
(define newValue 900)
variable ;;==> 200
;; マクロ呼び出し
(Set1 variable newValue)
;; 結果
variable ;;==> 900
もしも処理系が macro 適用時に「手続き set! は第1引数として symbol を取る」という事実を知らないで
無条件に macro に渡された引数の束縛関係を解決 (symbol を束縛値に置換) してしまうのであれば,
(newValue を束縛値 900 に置換するのと同様に) variable も束縛値 200 に置換してしまってから
macro 展開が行われるので,評価対象が (set! 200 900) となってエラーになってしまうはずです.
実際にはそうならないのは,処理系が macro 適用時に
(set! macroSymA macroSymB) が特殊な手続き set! の呼び出しであることを認識して,
(第2引数の newValue のほうは通常どおり束縛値 900 で置換してよいのだが)
第1引数である variable については束縛値で置換することを敢えて行わず,
symbol 「variable」 のまま macro 展開しているからである,と理解してよいでしょうか.

619 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:36:03 ]
束縛関係の解決と評価(この場合は変数参照)は違います。
束縛関係の解決とは
C言語風に言えば「変数名がどのアドレスを指すかを確定する事」であり
実際にそのアドレスから値を読み込む事ではありません。
マクロ置換に於いては
syntax-rulesの第一引数のリストに列挙されている識別子のみ
アドレスも使ったマッチングが行われます。
syntax-rules ()のように識別子が無い場合はアドレスはマッチングに利用されません。
アドレスはマッチング、すなわちどの置換パターンを利用するかを決定するのにのみ利用されるだけです。
そして置換された後の式によって変数が参照されるかどうか決まります。
この場合は置換後の式が(set! variable newValue)なのでvariableは評価されません。
set!の第2引数は評価されるのでnewValueが変数参照されて900となります。
しかし置換後の式が例えば(+ variable newValue)ならば手続き呼出しですので
+が変数参照されて#<procedure +>に
variableが変数参照されて200に
newValueが変数参照されて900に評価されてから
手続きが呼び出されます。

620 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:44:05 ]
(A B C)のリストが評価される場合(A B Cは識別子)
Aが構文に束縛されているかどうかを調べ
・構文に束縛されている場合
 ・primitive構文に束縛されているなら、その評価規則に従って評価します。
 ・マクロに束縛されているならパターンマッチを行い、テンプレートに従って置換した後、その式を評価します
・場所に束縛されているなら
 ・手続き呼出しを行います。AとBとCはすべて評価されますが、順番は決まっていません。
  AやBやCが評価されるときに初めて変数参照として値が読み出されます

621 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:52:27 ]
マクロ置換された式がリストならまた620の用に評価されます。
primitive構文はdefine、if、quote、lambda、set!のみで
他の構文は全てマクロです。(R5RSの場合。処理系独自のprimitive構文もあり得る。)



622 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 18:56:49 ]
(A B C)という手続き呼出しの場合
AとBとCが評価される順番は決まっていませんが
手続きが呼び出される前には評価されます。
つまりAとBとCが評価された後にAが束縛されていた場所の値を手続きとして呼び出します。
もしAの場所の値が手続きでなければエラーとなります。

623 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:07:03 ]
マクロのパターンマッチングは式の形(とリテラル識別子の場合は束縛されている場所)によってのみ行われます
なので例えば
(define x '(1 2))
(define-syntax foo
 (syntax-rules ()
  ((foo (x y)) (list y x))
  ((foo z) (list z))))
(foo x)
-> '((1 2))
となります。
つまり(foo (x y))にではなく(foo z)にマッチした訳です。
(foo x) --(置換)-> (list x) --(部分式の評価)-> (#<procedure list> (1 2))
-> '((1 2))
というわけです。

624 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:35:58 ]
リテラル識別子とのマッチングは
正しくはアドレスではなく束縛によって行われますので
構文に束縛されているリテラル識別子は
同じマクロ変換子に束縛されている識別子にマッチします。
構文に束縛されている識別子は
場所には束縛されていませんので
アドレスという概念は当てはまりません。
ローカルな変数束縛によって構文束縛が隠蔽される事も
ローカルな構文束縛によって変数束縛が隠蔽される事もあります。
なので束縛の種類とその束縛されているモノと字の綴りが同じ識別子のみが
リテラル識別子にマッチするという方が正しいでしょう。

625 名前:デフォルトの名無しさん mailto:sage [2008/02/16(土) 19:48:28 ]
4s/マクロ変換子/構文/

626 名前:567 mailto:sage [2008/02/16(土) 21:05:57 ]
>>619 - >>625
早速のご返答ありがとうございます.
いま R5RS も見ながら考えさせていただいていますが,もう少し時間をいただきます.

問題の本質とは少しずれますが,私が混乱していた原因の一つに,syntax-rules の
第1引数である literals に含まれている literal-identifier についての誤解があったようです.
「literal」という名前から,字面の一致だけを見るものだと思いこんでいましたが
正しくは,R5RS や >>573 さんはじめ上の書き込みにもさんざんあるように,
literal-identifierは
>>583:
>ともに未束縛であるか
>或いは同じ束縛(例えばトップレベル変数)を持つ場合にのみマッチする
ということなんですね.思いこみで記述が頭に入っていませんでした.

なお,577:で
5s/template上のsymbol/pattern上のsymbol/
でした.

627 名前:593 mailto:sage [2008/02/18(月) 00:57:16 ]
皆さん、ありがとうございます。遅くなってすみません。
途中から議論が分からなくなってしまったのですが、>>596さんのコードを実
行したところ、tarai は実行されますが、表示される時間は 0 です。

> (force (delay (time (tarai 800 400 0))))
cpu time: 0 real time: 0 gc time: 0
800

すみませんが、これはどうにかならないでしょうか?

628 名前:593 mailto:sage [2008/02/18(月) 00:59:59 ]
あ、バージョンは最新の 372 です。


629 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 01:01:00 ]
promise作って終りかw

630 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 10:52:21 ]
ちゃんと800が返されてるから
正しいのでは?
タライ回し関数は遅延評価で計算すると
正格評価にくらべて格段に速い

631 名前:630 mailto:sage [2008/02/18(月) 11:04:00 ]
timeで計測できないくらいの短時間で計算できてるって意味です



632 名前:593 mailto:sage [2008/02/18(月) 13:59:55 ]
いや、もっと時間はかかってます。
(force (delay (time (tarai 1000 500 0)))) を実行してみてください。
これで0秒なのは、おかしいでしょう?

633 名前:593 mailto:sage [2008/02/18(月) 14:02:07 ]
と言うか、先に0秒という計測結果が表示されてから、10秒ほどして 1000 と
いう計算結果が表示されるのです。もしもっと早いマシンをお使いなら、引数
を適宜増やしてお確かめください。


634 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 14:48:40 ]
確かに
time構文はLazy Schemeでは使い物にならないと考えた方がいいかも

635 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:18:20 ]
たらいまわしべんちでtime構文が使えないなら、Lazyである意義などない!

636 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 16:00:56 ]
こんなんで我慢してちょ

(define (bench exp)
__(let* ((start (current-milliseconds))
_________(value exp)
_________(end (current-milliseconds)))
____(display start)
____(newline)
____(display value)
____(newline)
____(display end)
____(newline)
____(display (- end start))))

ミリ秒でしか測れないし
余計な出力もあるのがダサいけど

637 名前:593 mailto:sage [2008/02/18(月) 17:06:55 ]
>>636
ありがとうございます。ちゃんと動きました。
ありがたいことに、自分にも隅々までよく分かるコードです。
しかし、遅延評価であるがゆえに、逆に副作用だらけになってしまったのが、
少し泣けます。

638 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 00:54:51 ]
正規表現ってRnRSにもSRFIにも入ってないの?

639 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 01:05:04 ]
community.schemewiki.org/?scheme-faq-programming#H-1w56qpn

640 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:33:26 ]
実装はいくらでもあるが、標準仕様がないのはなぜかと問いたい
共通語がないと不便じゃないか

641 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 12:45:47 ]
R6RSでUnicode化も決まったので、"Beyond R6RS"に入ってます。
schemers.org/Documents/Standards/Charter/status-jun-2006/status-jun06.html#g11



642 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:19:47 ]
正規表現は構造を文字列で表現するとこがLISPっぽくない。
まあ普及しちゃったからしょうがないけど、必要悪だろ。

643 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 15:01:38 ]
LISPから必要悪を取ったらλしか残らない

644 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 15:40:04 ]
すみません、MzSchemeやGaucheで、実行中のスタックの遷移を表示するにはど
うしたらよいでしょうか?

www1.ocn.ne.jp/~scheme/petite-start.html
↑のページで紹介されている、ChezSchemeの trace関数のようなものです。


645 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 15:50:08 ]
DrSchemeでプロセス間通信とかできますか?
Schemeにはそもそもプロセスという概念が無い?
今はただ関数定義程度の練習レベルです。

646 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 15:51:20 ]
つまり、Schemeで出来ること、あるいはSchemeの用途
がイマイチ分かってないということです。

647 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:32:37 ]
gccでプロセス間通信とかできますか?
Cにはそもそもプロセスという概念が無い?
今はただ関数定義程度の練習レベルです。
つまり、Cで出来ること、あるいはCの用途
がイマイチ分かってないということです。

648 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 18:39:45 ]
>>647
そうか。意味不明だったか。確かに。

どういう分野に活かしていくのが普通なんでしょうか?
例えば、CやC++ならネットワークプログラミングとかOSとか
デバイスドライバとか作成しますが、Schemeのアプリケーション
とはどういったものになりますか?コンパイラ作成用途とかになる
んですかね?

649 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:07:12 ]
そういうのはライブラリに拠るんだから一概にどうとは言えないよ。
まあ記号処理には強いだろうね。

650 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:11:01 ]
>>649
記号処理ですか。未知の分野なのでもう少し精進して
調べて見ます。

651 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:42:31 ]
>>644

MzScheme だとライブラリを使えばtrace、untraceもOK。
> (require (lib "trace.ss"))
>




652 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 20:51:09 ]
>>645

Petite Chez Scheme だとprocessを使って
他のプロセスにデータを送れたよ。
fprintを使うんだったかな。

>>650
数式処理には向いていると思う。
他にもいろいろと応用はあるんじゃないかな。

653 名前:644 mailto:sage [2008/02/20(水) 21:35:05 ]
>>651
MzScheme, DrSchemeでうまく行きました。
ありがとうございました。

Gauche はこんな感じのようです。

・トレース - 結城浩のSICP日記 - sicp
sicp.g.hatena.ne.jp/hyuki/20060507/trace


654 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:41:28 ]
>>650
使用言語の選択を誤っていると思う
あなたの場合Lispを選択する意味はないのではないか
一般に手に入る資料が豊富な分C/C++でやるのがよい

655 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:44:42 ]
>>654
C/C++は習得済みで業務で使用してます。
Schemeでプロダクトコード書くわけではないので。

656 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 21:58:03 ]
lispやってる奴がもれなく超人に見える
だからやりたい
とか言う程の物さ

657 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:16:40 ]
>>655
言語の話とライブラリの話がごっちゃになってないかな。

言語の特徴としては、再帰的な処理の記述とか、
メタなプログラミングが楽とか色々あるけど。
そういうことが知りたいんじゃないんだろうし。

Schemeのアプリケーションって言われても、
ウェブアプリケーションサーバ書いてる人もいれば、
.NET向けのアプリケーションを書くために処理系を実装してたり、
日常的に使うスクリプトをSchemeで書いてる人もいたりして様々。

658 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:22:45 ]
>>657

>再帰的な処理の記述とか、 メタなプログラミング
ここが勉強したいと思ったきっかけです。

>Schemeのアプリケーションって言われても、
>ウェブアプリケーションサーバ書いてる人もいれば、
>.NET向けのアプリケーションを書くために処理系を実装してたり、
>日常的に使うスクリプトをSchemeで書いてる人もいたりして様々。

色々できるんですね。ありがとうございます。

659 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:30:23 ]
>>658
ttp://practical-scheme.net/index-j.html

にある文章をいくつか読んでみたらどうだろう。ここのスレの人とかが、
何故敢えてLispやSchemeを使うのか、理解する助けになると思う。

660 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:32:48 ]
たぶん、プロセス間通信みたいな処理が好きな人は
SchemeよりEmacs Lispの方が楽しめると思う。
CL使わないとLispらしさのかけらもないコードになっちゃうけど。

661 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:52:37 ]
>>657
>言語の特徴としては、再帰的な処理の記述とか、
>メタなプログラミングが楽とか色々あるけど。
>そういうことが知りたいんじゃないんだろうし。
とオレも思ったのだが
>>658
>>再帰的な処理の記述とか、 メタなプログラミング
>ここが勉強したいと思ったきっかけです。
という意外な応答
真意がつかめない



662 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 22:58:39 ]
便乗質問で恐縮です

Larcenyでtraceは使えるんですが、再帰関数をtraceしても
再帰的にtraceしてくれません
何かうまい使い方があるのでしょうか?

663 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 00:40:01 ]
>>659
読んで見ます。

>>661
C++でテンプレート使ってライブラリ書きたいんですが
再帰とメタファンクションを使わなければいけないんですよ。
で、そもそも再帰とベースとする言語として関数型言語
を覗いたわけです。

664 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 07:29:08 ]
>>662

そうなんだよね、traceがちょっと他と違っている。
libにtrace.schがあるんでこれをハックしてみるとか。

665 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:55:30 ]
guile + swig でc++のメタ制御してみて便利さを体験してみたら?
Gimpのスクリプトで遊んでみるのもいいかも

666 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 14:52:33 ]
gauche本の発売日が1ヶ月伸びてますが、
やっぱりあれだけ赤が入ると無理だったのでしょうか。

667 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 16:23:22 ]
Gauche本てどんな読者が対象なんだろう。

668 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:23:12 ]
このスレの住人

669 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:24:08 ]
まぁ、まんざらでもないよなw

670 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 17:49:47 ]
The Little Schemer読んでる俺も対象に入れてくれお

671 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 18:54:27 ]
>>670
ナカーマ
象さん分かりやすいが、文法のリファレンスも欲しい今日この頃。
お勧めありますか?



672 名前:デフォルトの名無しさん [2008/02/21(木) 19:05:40 ]
つR5RS

自分はA5用紙に印刷して綴じて常に携帯してる
ついでに電子辞書にもtxtファイルで入れてる

673 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 20:28:28 ]
carとcdrは何と読めばいいんでしょうか?
カーとクダーでいいですか?

674 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 20:29:03 ]
>>672
thx 日本語訳あったんで落とした。

675 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:29:24 ]
>>673
おk

676 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:12:42 ]
>>671 ( ^ω^)λ(^ω^ )ナカーマ
漏れはネットのあちこち入門サイトにお世話になってるお

677 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:23:57 ]
再(再(再(再帰)帰)帰)帰

678 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 22:56:02 ]
C/C++で仕事するのが面白くなくて辛いです。
Scheme勉強するのは楽しいです。
仕事の時間は無駄な時間に感じます。

679 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:04:03 ]
仕事というのはそういうものですよ

680 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:17:53 ]
確かに、金をもらわなきゃ誰もやらないようなことだからこそ、
金をもらえるんだものね。
金なしでやる人が大勢いるようなことなら、誰も金を出すわけない。

681 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:25:36 ]
家に帰ってSchemeにポートするつもりで作れYO!
ようやって作ったScheme版で独立すれば?という夢ぐらいは持ちたいものだw



682 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:27:08 ]
だれかR6RSの日本語訳早く作れよ

683 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:15:56 ]
R6RSの解説を読んだら、Schemeの欠陥が色々書いてあった
CLは細かいところまでよくできてるっぽいし
見かけによらないものだなーと

684 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:50:01 ]
>>677
先頭の再と末尾の帰が!

685 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 00:52:27 ]
>>683
>CLは細かいところまでよくできてるっぽい
と思えない俺は異常かおrz

686 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:13:30 ]
(再(再(再(再帰)帰)帰)帰)

687 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:13:33 ]
Common Lisp規格まとめ役のスティール親分が、
Schemeみたいにsymbol-valueとsymbol-functionを統合しとけば良かったなあ
けど互換性を重視したから難しかったんだよ
そう言っておられたぞ。

688 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 01:35:56 ]
Gauche-libsvmのリンク先に飛べない

Gauche c-wrapperはswigみたいなもの?
なんでswigにしなかったの?


689 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 05:46:08 ]
>>687
へー、初耳だ。
どこで言ってたの?


690 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 09:35:15 ]
>>686
それでよし

691 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 09:37:24 ]
>>687
>symbol-valueとsymbol-function
CL最醜の汚点だと思う



692 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 11:14:06 ]
>>689
bitの井田さんのインタビューかな?

693 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:06:12 ]
>>691
ちなみに、funcallを書くのは面倒だけど
フォームの頭に構文の名前 (funcallやlambdaやifやマクロの名前) を必ず書きましょう
と考えると汚くはない

funcallが汚いんじゃなくて、funcallを省略できる設計が汚い

694 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:10:21 ]
funcallはあまり気にならないな。むしろ判りやすい。
SPECIAL変数付近の扱いはちょっと汚いかなと思う。

695 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:54:19 ]
個人的にはCLで名前空間が単一/一様でないのは気にかかるところだ
関数とその他の値とを区別無くfirst class objectとして扱うコードを
書きたいときに柔軟性を制約する一因とはならないのだろうか?

696 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 12:58:11 ]
>>693
その話は関連する話ではあるけど、
symbolがsymbol-valueとsymbol-functionの二つ持つという話そのものから、
ちょっと離れていっていると思います。
一つしかない場合もその種の議論は成立するのですから。

>>694
スペシャル変数は、スレッドローカルな変数とか、
elispみたいなバッファーローカルな変数と同様の「パターン」で、
ある種のライブラリ、応用にはとても自然なeval拡張だと思う。
別の機構も考えられるけども、とてもLisp的だと思う。
(拡張というのはレキシカルスコープなevalに対して)

697 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:01:00 ]
>>695
そういう「特殊な」ことをやる場所ではfuncallを使う。
そういうとこへ関数を渡すときは #' を付けてましょう。
というのが CL 的発想だと思う。大きなプログラムの中での可読性を
考えれば、そんなに悪くないと思う。
純潔なSchemerには我慢できないだろうけど。w

698 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:29:54 ]
>>695
> 関数とその他の値とを区別無くfirst class objectとして扱うコードを

CLが違うのはシンボルにセルが2つあるのと関数を適用するときの特別扱いであって、
「区別無くfirst class objectとして扱う」こと自体は普通に書けるじゃん。

699 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:40:16 ]
座席が区別されてるだけで乗客は区別されない

700 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:43:02 ]
>>696
>一つしかない場合もその種の議論は成立する
そうです
Schemeでも関数なのかマクロなのか判断できなくて困ることがある
CLを汚いと言えるほどSchemeは綺麗じゃない

変数と関数じゃなくて
コンパイル時と実行時とで名前空間を分ければいいのかな?

701 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:44:44 ]
俺は人間が汚れてるから、ちょっと汚い言語のほうが好きだな



702 名前:695 mailto:sage [2008/02/22(金) 13:51:18 ]
>>697>>698>>699
なるほど

703 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 12:21:19 ]
>>688

>Gauche c-wrapperはswigみたいなもの?
そう、ヘッダファイルからスタブを自動生成して関数やデータやマクロなんかをGaucheで使えるようにするもの。

>なんでswigにしなかったの?
最初swigを見たとき、バインディングの作り方がよく分からなかったから。
あと、コンパイルとかInterfaceファイルを作るのが面倒そうだったから。

704 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:07:34 ]
The Reasoned Schemer

この本はどのような人を対象としてるか読んだ人分かりますか?
なんかProlog的なコーディングをSchemeでもできるという紹介
文でしたが、これはScheme的ではない異色の内容なんですかね?

705 名前:デフォルトの名無しさん mailto:sage [2008/02/23(土) 17:21:57 ]
とてもScheme的な応用の本。
言語プリミティブ的なものが応用対象だから。

706 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:18:06 ]
LispとPrologとは両輪だという話を読んだ覚えがある。
On LispでもPrologやってるし。

707 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:20:49 ]
両輪というより、レイヤーが違う感じかな

708 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:30:57 ]
Lisp/Schemeにはないが、
ML/Haskellはパターンマッチ渡しがあるから、
論理型言語とは「項書換えシステム」で統一的な見方ができる。
The Reasoned Schemerはその点でも面白い。S式は面白い。

709 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:50:24 ]
買ってみようかな

710 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 17:58:54 ]
The Little Schemerで教えてください。 P.121です。

1> (apples peaches pumpkin pie) はrelではない。なぜならペアのリストではないから。
2> ((apples peaches) (pumpkin pie) (apples peaches)) はrelではない。ペアのセットではないから。
3> ((apples peaches) (pumpkin pie)) はrelですか? yes
4> ((4 3) (4 2) (7 6) (6 2) (3 4)) はrelですか? yes
どういうことなのかさっぱりわかりません。

711 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 18:02:25 ]
>>710
まだそこまで読んでない。




712 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 18:09:41 ]
「セット」は重複要素を許しません。それで後は分かりませんか?
;; カッコに全角を使うのは辞めてください。釣りかと思います。

713 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 18:15:06 ]
>>712
サンクス!そういうことか!
ていうか、章の始めで教わってんじゃん・・・1日悩んじまったorz
全角ゴメン。気をつけます!

てかP.121じゃなくてP.119だし・・・

714 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:07:24 ]
javascriptがlispに匹敵する表現力があるって聞いたのだけど本当?

715 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:39:24 ]
brainfuckですらLispに匹敵する表現力がありますけど?

716 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 19:40:14 ]
>>714
ecmaスレで聞けよw

717 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:31:44 ]
アセンブラ表現力最強ですけどっ!!

718 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:35:09 ]
表現力最強じゃなくて記述力最強だ
まあいいや

719 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 20:37:18 ]
どちらにしても曖昧だな。強弱比較できるような概念でもあるまい。

720 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:01:45 ]
スペックじゃんけんがしたいならHaskellを選べばいいと思うよ。

721 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:11:19 ]
brainfuckにすら負けてる正規表現やcppの立場って・・・



722 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 21:19:45 ]
そのためのPEGとtemplateだろ?

723 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:19:15 ]
初心者は抽象化が苦手だ、とMatzが言ってた
チューリング完全性だけが重要なら、抽象化はどうでもいいはずだが、現実は違う

724 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 00:48:20 ]
>>714
JavascriptのクラスシステムはJavascriptで書かれてます。
次のバージョンからは組み込みになりますが。
prototype base object systemあたりでググってください。

725 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 13:22:52 ]
Little schemer P122 P123 に出てきた

Go and get one!
Or better yet, make your own.


”先へ進んで、完璧を目指せ!
もっといいのは、自分の力でやることだ。”

という意味であってる?

726 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:17:26 ]
>>725

邦訳の「Scheme手習い」元吉文男、横山晶一訳 
たぶん、7章の最後の文だと思うんだけど。

「自分で行って手に入れよ。
さもなくば、独自のものを作れ」

となっている。

727 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:34:52 ]
俺はなんかそんな堅苦しいメッセージじゃなくて、
「ここで一休み、お菓子取ってきなよ♪
 でなきゃ、自分で作ってみてはどうかな?」
という意味に取ったけど。

728 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:38:29 ]
>>726
全然違ってた。。

邦訳なんかあったんだ
まあ内容には関係ないからいいか

>>727
お菓子はないだろw

729 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:41:23 ]
>>728
いや、まじめに。だってクッキーの作り方書いてあるじゃん。

730 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:50:15 ]
>>726
その訳でクッキーのレシピはどうなってるの?

731 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:53:27 ]
>>729
ああ、あの囲みのコード?
おれはてっきりあれを自分で完成させろということかと思った。
アメリカンジョーク?



732 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:55:26 ]
>>731
あのコードをみて Make your own cokkies.ということかと・・・・

てか、度々「一休みしてお菓子食べなよ!マスタード忘れないようにNE!」
みたいなメッセージが出てきてるじゃん?

733 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 22:58:15 ]
>>730
クッキーのレシピがlambda式風に書かれている。

戒律風に訳されているので、この部分も戒律風にわざと訳したのかもね。

734 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:00:22 ]
(define クッキー
  (lambda ()
   (焼く
    (quote (180 度))
    (quote (12 分))

735 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:02:47 ]
>>733
そんな風になってるのか。

736 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:02:51 ]
アメリカンジョークというより、ウィットという感じかな。

737 名前:デフォルトの名無しさん mailto:sage [2008/02/26(火) 23:03:45 ]
もうフリードマンさんの本全部読んでみたくなってきたw

738 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:17:17 ]
>>725
後半は、
「まだまだいいのがあると思うなら、自分で作ることだね」


739 名前:デフォルトの名無しさん mailto:sage [2008/02/27(水) 01:45:50 ]
www.ccs.neu.edu/home/matthias/BTLS/

> A Food Preparation Place

740 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 10:57:55 ]
Little Schemer
Seasoned Schemer
Reasoned Schemer

があるんだけど、Little Schemerだけ紙質が悪いんだが
何で?わら半紙みたいでツルツルしてない。

741 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 11:25:16 ]
>>738
それが一番しっくりくるかな



742 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 13:49:27 ]
>>740
学生用のテキストは安いのを作ることがある。


743 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:04:29 ]
>>742
ツルツル版もあるの?

744 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:05:50 ]
ハッ!ハッ!ハッ!ハッ!
はげまるくーん

745 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:16:05 ]
醤油こぼしたらオシマイだよ。

746 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 14:17:46 ]
Schemeすげー、関数を渡せるなんて。C#のdelegateの構文に似たような
ものがあったな。

747 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 20:41:32 ]
関数ぐらいCでも渡せるだろう

748 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:13:03 ]
クロージャにしても継続にしても
Cでスタックを使うところにヒープを使えば自然と思いつきそうなものだが
Schemeみたいな高級言語で教えるのとどっちが分かりやすいのかね

749 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:15:36 ]
>>747
ポインタはね。関数は無理なのよ。しかも定義を呼び出し関数内に書ける
のがいい。C++のBOOST_FOREACHに似てる感覚。

750 名前:デフォルトの名無しさん mailto:sage [2008/02/28(木) 23:56:38 ]
JavaScriptでも出来るぞw

751 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:05:37 ]
高級言語ならそれぐらい出来て当然



752 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 00:22:34 ]
高級言語w

753 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:20:15 ]
wが意味するところがよくわからないんだが、
巷ではJavaScriptって、高級低級で二分するなら低級のほうに入るのか?

754 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:29:40 ]
それはないw

755 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:39:48 ]
javascriptは超高級だと思うぞ

高級・低級の分かれめってなんだか知らない(たぶん、時代によって変わる)けど、
lambdaが使える言語はみな高級だと思う。
あと、低級っていっても馬鹿にしてるわけじゃないことをお忘れ無く。


756 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 03:54:56 ]
プログラミング初心者が集まる言語のスレなら
「ひょっとしてこの人、高級の意味を誤解してるのかな」
という想像が最初に来るところだけど、Lispスレだからな。一応「その心は?」と聞きたくなる。

757 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 04:36:48 ]
まあ高次とか低レイヤーとか書いたほうが語弊は少なさそうだな
意味わかりにくくなるけど

758 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:18:13 ]
機械語に対してほとんど全てのプログラミング言語は高級言語だけどね。
今低級・高級を再定義するなら、機械が直接対応しない概念(クロージャとか)を
扱えるものが高級言語、でどうだろう。
シンタクスによる区別だったのをセマンティクスによる区別で再定義というか。

759 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:35:06 ]
実際のところ、CやC++のコンパイラは関数型言語で記述されてますか?

760 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 09:43:06 ]
されてません

761 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 10:07:48 ]
環境にアクセスできるクロージャへのポインタを渡すのはCでは無理だな



762 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:28:20 ]
boost.lambda
ならあるぞ

763 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:40:47 ]
c-wrapperのデモビデオがみれなくなってる
std::vectorとかポインターをcに渡すことはできるの?

764 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:48:11 ]
>>760
何で記述されてますか?

765 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 12:50:28 ]
「Cは昔、関数型言語って呼ばれてました。
値を返さない手続きがない(void以前)ので」ってオチ禁止

766 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 14:44:35 ]
CコンパイラはCで書かれてることが多いんじゃないかな?
あまり関係ないけど
GCCはLispライクな中間コードにコンパイルしてから
CPUコードを出力するって聞いたことがあるけど

767 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 15:31:53 ]
Little Schemerだけど Chapter 8から難しくなってきた。

--------------------------------------------------------
The Tenth Commandment

Build functions to collect more than one value at a time.

”一度に複数の値を集めるための関数を作れ!”
--------------------------------------------------------
これが言わんとする深い意味はなんですか?

直前のmultiremberEco関数の例で確かに二つのリストに振り分けてるのは
理解できるんだけど。(tunaに一致するもののリストと一致しないもののリスト)

条件に応じて、その条件を満足する値(アトムなど)あるいは満足しない値を集めろ!
って意味なのかな?

768 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 21:33:46 ]
>>763
>c-wrapperのデモビデオがみれなくなってる
今確認してみましたが、こちらからは見れました(ホームページのやつですよね)。

>std::vectorとかポインターをcに渡すことはできるの?
ポインターの受け渡しはできますが、今のところ c-wrapper は C++ には
対応していないので、残念ながら std::vector は無理です。



769 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 22:25:51 ]
>>767
俺もそこらへん読んでる。急に難しくなってきたね。
説明できないのでもうちょっとよく読んでみる…

770 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 00:44:35 ]
> multiremberEco
multirember&co関数かと。

771 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 01:04:22 ]
little schemer - multirember&co - reprise for dec 2006
groups.google.co.jp/group/comp.lang.scheme/browse_thread/thread/a059f78eb4457d08/be4705d06e96a2e4?hl=ja&lnk=gst&q=little+schemer+-+multirember%26co#




772 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 02:16:04 ]
>>767
「at a time」でやることによって、
純関数型に特徴的なプログラミングスタイルが登場します。

昔birdが書いたコンパイラの純関数型ワン・パス・パーザや,
DanvyのTABA(There and Back Again)パターンや、
purely functional algorithmに出てくるようなコードなどでも
この章で使うようなテクニックが使われてます。

Little Schemeは非常に簡単な例でやっているので、
何が何だか分からない奇妙なパズルをやらされている気分になるかもしれませんが、
無意味なことはほとんどないので、著者を信じて頑張ってください。

まあバリバリ手続き型で書きたい人には苦行すぎる面もありますが。


773 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 12:01:59 ]
>>770
&か。何の文字かわからなかった。

>>772
実用的なコードの源泉かあ。
今は習うより慣れろのレベルだけど、Schemerシリーズは全部やる。
単純な例でも脳の体操にもなるし。

774 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:26:31 ]
www.amazon.com/Scheme-Programming-Language-3rd/dp/0262541483/

The Scheme Programming Language, 3rd Edition

これは評価が高いですが、やはり良書ですか?
CのK&R相当らしく、数日でたくさん学ぶ人もいるらしいですが
どうなんでしょう。

775 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:42:06 ]
>>774

Second Edition と村上さんの邦訳をもっているけど、
3rdはかなり改訂されてるんかい?

776 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:49:40 ]
www.scheme.com/tspl3/

777 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:55:25 ]
>>776

おお、公開されてるんだ。Dybvigさん、太っ腹。

778 名前:デフォルトの名無しさん mailto:sage [2008/03/01(土) 21:59:06 ]
Schemers.Incの「The Schemer's Guide」が好きだったなぁ。
初心者向けの良い本だと思う。

779 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 00:08:16 ]
Little Schemer P146
にある以下のプログラムなんですが、

(define evens-only*&co
(lambda (l col)
(cond
((null? l) (col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l)) (evens-only*&co (cdr l)
(lambda (newl P S)
(col (cons (car l) newl) (* (car l) P) S))))
(else (evens-only*&co (cdr l)
(lambda (newl P S)
(col newl P (+ (car l) S)))))))
(else
(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))

特に (col (cons al dl) (* ap dp) (+ as ds)) とする意味が分かりません。
こういうものはどういう思考で捉えていけば良いのでしょうか?
具体値で考えると確かに正しいことは分かるのですが、それを一般式で
表すのが難しくて思いつきません。



780 名前:779 mailto:sage [2008/03/02(日) 00:31:17 ]
具体値を入れて考えたメモを見ていたら何となく見てきました。

(evens-only*&co (car l) ; ここから以下がよく理解できない
(lambda (al ap as)
(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds))))))))))

(car l) と (cdr l) について再帰してそれぞれの結果を得る。
まず、(cdr l) に対して結果を得る。つまり、dl dp ds が具体値に
決まる。その後、その結果に対して、(car l) に対する再帰の結果
である al ap as を得て、(cdr l) に対する結果とマージする。

よく分からなかったのはlambda関数のパラメータでした。
自分としてのキーポイントは、
@lambda関数のパラメータが具体値に求まる。
Alambda関数のパラメータが具体値に求まる順番はネストの深い
ものから始まる。

という風に考えるとよいかなと思いました。

781 名前:779 mailto:sage [2008/03/02(日) 00:36:37 ]
表現がおかしかったです。

(evens-only*&co (cdr l)
(lambda (dl dp ds)
(col (cons al dl) (* ap dp) (+ as ds)))

要は、まず上の部分の (cdr l) の再帰が先に終了し、そのパラメータであるdl dp ds
が具体値に求まる。その後で、具体値に求まったdl dp dsとともに
(evens-only*&co (car l) (lambda (al ap as) ・・・の (car l) の部分の再帰が行われる。




782 名前:779 mailto:sage [2008/03/02(日) 00:42:43 ]
やはりパラメータが具体値に求まるというのはおかしいですね。
パラメータは変数なので。。

ただ具体的な値で追っていくと、例えば

(col (cons al (2 4)) (* ap 8) (+ as 4)))

みたいな感じで、dl dp ds 部分が決まっていくようです。
パラメータが具体値に求まるというのは、その程度の意味です。

783 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 01:58:27 ]
>>779-782
; direct style
(define (fact n)
(if (= n 0) 1
(* n (fact (- n 1)))))

; accumulator style
(define (fact n) (factacc n 1))
(define (factacc n acc)
(if (= n 0) acc
(factacc (- n 1) (* n acc))))

; continuation passing style
(define (fact n) (factacc n (lambda () 1)))
(define (factacc n cc)
(if (= n 0) (cc)
(factacc (- n 1) (lambda () (* n (cc))))))

accumulator styleは演算子が可換、
あるいは逆から数え上げることが可能(e.g. (from n) ←→(to n))でないと困る。
例えばリストに対する演算の場合。consは可換でない。







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<210KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef