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

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

LISP Scheme Part5

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

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

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

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

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

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

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

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

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

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

265 :デフォルトの名無しさん:02/06/27 02:54
Scheme関連の書籍が少ないなぁ….
SICPもいいけど,実用的なプログラムを書くときのknow howとかが少なくて
最初はtoy programしか作れなかったよ.
入出力書きづらい.

266 :デフォルトの名無しさん:02/06/27 09:08
つーか文字列処理がインデックス参照なんでやりにくくない?

267 :デフォルトの名無しさん:02/06/27 10:26
>>266
string portの方が何かと便利じゃない? srfiにもなってるし。
regexp関連のインターフェースもsrfiになってほしい…



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

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

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


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

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

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


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

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

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


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


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

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


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

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

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

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


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



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


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

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

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

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

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

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

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

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


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

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



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

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

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



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


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

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

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

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

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



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

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

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


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

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

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

304 :273:02/06/29 23:50
>>302
(define s (1 (2 3 4) 5 (6 7)))
(rev s) => ((7 6) 5 (4 3 2) 1)
s => (1 (2 3 4) 5 (6 7))
みたいな感じ。良い例ではありませんが。

>>303
他の言語ならエラーが発生してプログラムの実行が停止するような処理
でも、Perl の場合は勝手に決めて処理を進めてしまう事がありますよね。
具体的にどんな状況かって言われると説明しづらいんですが、Perl の
曖昧さ故にデバッグしづらい場面ってのは結構あると思います。
それらを含めて、将来メンテナスするであろうコードに Perl を使うのは
先々不安って言ったんですよ。


305 :303:02/06/30 00:05
>>302
コードにするとこんな感じ?
(define (rev s)
 (if (pair? s)
  (let loop ((x s)(r '()))
   (if (pair? x)
    (loop (cdr x)(cons (rev (car x)) r))
    r))
  s))


306 :303:02/06/30 00:09
Cに直すとこんなかな。
scm rev(scm s) {
 if (pairp(s)) {
  scm x = s;
  scm r = nil;
  loop:
  if (pairp(x)) {
   scm tmpx = cdr(x);
   r = cons(rev(car(x)),r);
   x = tmpx;
   goto loop;
  } else {
   return r;
  }
 } else {
  return s;
 }
}

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

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


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

309 :303:02/06/30 00:29
>>307
同じでしょう。
まあ、mapしたものをreverseするのは無駄だから
専用化したものをはさむとか。
この辺はトランスレータとかが勝手に最適化して欲しい気はするけど。

(define (map-reverse proc l)
 (let loop ((x l)(r '()))
  (if (pair? x)
   (loop (cdr x) (cons (proc (car x)) r))
   r)))

(define (rev s)
 (map-reverse
  (lambda(x)(if(pair? x)(rev x)x))s))

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

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


312 :273:02/06/30 00:53
Common Lisp に mapcon ってのが既にあるみたいね。nconc だけど。


313 :デフォルトの名無しさん:02/06/30 00:58
scmってなんだろ?

OOで、再帰を意識するなら
public List::reverse(){
List list=new List();
reverse(this.size,list);
return list;(付け替えしてもいいし)
}

private List::reverse(int i,List list){
if(entry[i] is List)entry[i].reverse()
list.add(entry[i])
reverse(i-1,list);
}

だよね?

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

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


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

reverse! はどう書くの?

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

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


319 :srfier:02/06/30 10:54
>>315
map!はsrfi-1にあるよ。
同じくsrfi-1の、foldを使ってmutation無し、reverse無しバージョン

(define (rev s)
 (if (list? s)
  (fold (lambda (e p) (cons (rev e) p)) '() s)
  s))


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

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

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

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

ただ、一方で、

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

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

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

これどういう事?


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

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

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

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


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


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

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

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


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

当方schemeオンリー

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


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

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

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

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

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

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

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

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


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


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

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

339 :デフォルトの名無しさん:02/07/02 00:32
(define (come! scheme)
 (let loop ((n 0))
  (cond ((= n 0) (display scheme) (newline))
     ((= n 1) (display "キタ"))
     ((even? n) (display "━━"))
     ((= n 3) (display '(゚∀゚)))
     ((= n 5) (display '(∀゚ )))
     ((= n 7) (display '(゚  )))
     ((= n 9) (display '(  )))
     ((= n 11) (display '(  ゚)))
     ((= n 13) (display '( ゚∀)))
     ((= n 15) (display '(゚∀゚)))
     ((= n 17) (display "!!!!!")))
  (if (< n 17) (loop (+ n 1)) (newline))))

(come! 'Gauche)

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


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


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

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


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

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

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

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


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

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




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

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

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

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

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


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

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


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


354 :デフォルトの名無しさん:02/07/03 09:02
>>350
call-with-* 系は、dynamic-windでcloseするようにしてしまうと
コルーチン系の動作が書けなくなる (一度call-with-*の中で別の
コンテキストにスイッチしたらファイルが閉じられて、コンテキストの
再開ができなくなる)。

dynamic-windはもっと基本的な要素を実装するのに使ったほうが良い。
ダイナミックスコープを持つ変数とか、エラーハンドラとか。例えば

(define (error arg)
(display "unhandled error: ") (display arg) (newline)(quit 1))

(define (with-error-handler handler thunk)
(call/cc
(lambda (cont)
(let ((oerror error))
(dynamic-wind
(lambda () (set! error (lambda (arg) (cont (handler arg)))))
thunk
(lambda () (set! error oerror)))))))

こうすると、thunkの中で(error なんとか)とすると常にhandlerが呼ばれる。


355 :デフォルトの名無しさん:02/07/03 12:29
>御安心ください。私も Emacs Lisp, Scheme, Common Lisp の順番で
>学習しましたカラ。Common Lisp は現在進行形。
学習するって何を?
文法だけなら、3日あれば十分なような・・・



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

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

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

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

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


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

362 :デフォルトの名無しさん:02/07/03 21:47
>>354

なんでwith-error-handlerの中でcall/ccつかっているの?

363 :デフォルトの名無しさん:02/07/03 23:00
>>354
ファイルオープンや例外とかの継続巻き戻しスタックは、複数欲しい気がする。
例えばエラーかなんかでトップに戻ったときは全部ファイル閉じてて欲しいし、
自分で明示的に継続切り替えたらそのまま状態を保持するとか。
この辺のプロトコルをSRFIで作ってくれないかなあ。

364 :デフォルトの名無しさん:02/07/03 23:24
>どうせ文法知ってるだけのくせに。
それ以外に何が・・・・痛い


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


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

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

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

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

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

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

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

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

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


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

376 :354:02/07/06 04:36
>>362
>なんでwith-error-handlerの中でcall/ccつかっているの?
thunk中でエラーが起きたら、handlerを呼び出した後
with-error-handlerから返るためだけど。何か変?



377 :デフォルトの名無しさん:02/07/06 05:52
最近、高階関数を勉強してその魅力にはまっているのですが、
かっこいい高階関数の例を教えてもらえませんか?
例えばこんなの。

(define (for-each-tree f g n tree)
 ;; depth-first
 (cond ((null? tree) n)
    ((not (list? tree)) (f tree))
    (else
     (g (for-each-tree f g n (car tree))
      (for-each-tree f g n (cdr tree))))))

(define (flat tree)
 (for-each-tree list append () tree))

(define (sum tree)
 (for-each-tree + + 0 tree))

(define (map-tree f tree)
 (for-each-tree f cons () tree))

(define tree '(1 (2 3) (4 (5 6) 7 ((8)) 9 10)))

> (flat tree)
(1 2 3 4 5 6 7 8 9 10)

> (sum tree)
55

> (map-tree - tree)
(-1 (-2 -3) (-4 (-5 -6) -7 ((-8)) -9 -10))

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


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


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

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

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


383 :デフォルトの名無しさん:02/07/06 08:35
(define (flat tree)
(if (list? tree) (apply append (map flat tree))
(list tree)))

(define (sum tree)
(if (list? tree) (apply + (map sum tree))
tree))

(define (map-tree f tree)
(if (list? tree) (map (lambda (tree) (map-tree f tree)) tree)
(f tree)))
apply はちょっと邪道かな。でも便利だし

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

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

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


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

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


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

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

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


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

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

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

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

(set-xy)

を評価しても

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

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

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

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

396 :デフォルトの名無しさん:02/07/06 18:34
>>394
set-xyの内部のdefineはinternal defineと解釈されます。つまり
(define (set-xy) (letrec ((x 1)(y 2)) ))
と同じ。xやyはローカル変数になると考えると良いでしょう。
トップレベルのxやyを変えたい場合はマクロを使って
(define-syntax set-xy
(syntax-rules ()
((_) (begin (define x 1) (define y 2)))))
とするか、define-valuesのような拡張 (MIT Schemeにあるかどうか
知らんけど)を使うしかないでしょう。
(define-values (x y) (values 1 2))


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


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

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


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


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

402 :377:02/07/07 01:39
>>380>>382
元ネタは
http://www.sampou.org/haskell/article/whyfp.html
の3章の redtree という関数です。

>>383
こんなんでどうでしょうか?

(define (for-each-tree f g tree)
 (if (list? tree) (apply g (map (lambda (tree) (for-each-tree f g tree)) tree))
   (f tree)))

(define (flat tree)
 (for-each-tree list append tree))

(define (sum tree)
 (for-each-tree + + tree))

(define (map-tree f tree)
 (for-each-tree f list tree))

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

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

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


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


405 :399:02/07/07 10:22
>>403
ありがとうございます。man termios とか google とかで調べて何とかできそ
うなところまできました。

gauche の termios のところにある、入力を echo しないで受け取るプログラ
ムをいじくって、dynamic-wind の before 部分を以下のようにしました。

(dynamic-wind
(lambda ()
(slot-set! attr 'lflag (logand lflag (logand (lognot ICANON) (lognot ECHO))))
(sys-tcsetattr port TCSANOW attr))

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

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


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

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

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

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


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

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

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

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

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

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


416 :デフォルトの名無しさん:02/07/10 15:33
ネタがないようなので Paulたちについて語りますか?

ttp://www.shiro.dreamhost.com/scheme/index-j.html

Paul Graham (Lisp)
技術野郎の復讐 -- Revenge of the Nerds
「全ての言語(Java,Perl,Python, ..)は 1958年に作られた Lisp に今ごろ追いついてきている」

Paul Prescod (Python)
Python と Lisp の関係について
「Python は Lisp じゃねーぞ(゚Д゚)ゴルァ」

417 :デフォルトの名無しさん:02/07/10 19:38
Peter Norvig (Lisp)
PythonてLisperにもなじみやすくて(・∀・)イイ!
AIMAの例書き直しちゃったよ。

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


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

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

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

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

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

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

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

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

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

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

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

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


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


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


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

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

435 :デフォルトの名無しさん:02/07/15 05:29
>>433
あの説明は分かりにくい。R5RSでは削られたんだし、忘れよう。
低レベルのhygienicマクロを理解したければor使いたければ
標準ではないが、syntax-caseの動作を見るのが良いと思う。

identifierとは、変数を表すシンボルに束縛情報がくっついたものだと
思えば良い。
(define-macro foo
(syntax-rules () ((_ val) (let ((a 3)) (+ a val)))))
というマクロを考えてみる。これは次のように展開される。
(foo 4) ===> (let ((a 3)) (+ a 4)) ==> 7
では次の式はどう展開されるか。
(let ((a 2)) (foo a))
字面で展開すると
(let ((a 2)) (let ((a 3)) (+ a a))) ==> 6
となってしまいそうだが、hygienic macroにおいては、
* マクロfooに渡されるaというidentifierは、let ((a 2))で束縛されたもの
* マクロfoo内で使われるaとういidentifierは、マクロ内で挿入されるlet ((a 3))で束縛されるもの
というふうに束縛情報を一緒に持っているので、ふたつのaが混同される
ことがない。つまり
(let ((a 2)) (foo a)) => 5
となる。

で、これと同じことをsyntax-rulesを使わずに表現しようとすると、
「束縛情報をデータに付随させる」という操作を明示する必要が
ある。それに使われるのがsyntax。


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


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

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

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

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

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

442 : :02/07/16 03:53
>>441
リストを (a . (b . (c . d))) のように表現する。

443 :デフォルトの名無しさん:02/07/16 03:53
>>441
'(a b c d e)
==> '(a . (b . (c . (d . (e . ())))))


444 :デフォルトの名無しさん:02/07/16 04:05
>>442
アホか?
そんなのいちいち書いてられっかよ。
ふつー、全部inline化、macro-expandしてppした巨大関数1こを納品。
これよ。
人間の頭じゃまずメンテできないし、納品しても安心。

445 :デフォルトの名無しさん:02/07/16 04:13
>>444
っていうかそれ、ふつーなのかよ。

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

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

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

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



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


451 :デフォルトの名無しさん:02/07/16 06:54
関数呼び出しの数とか、
C にコンパイルした時の行数とか…
…どれも評価には向かなそうだけど。

452 :デフォルトの名無しさん:02/07/16 10:12
>>449
(define (f x)
(if (pair? x) (begin (display "(") (f (car x)) (display " . ") (f (cdr x)) (display ")"))
(display x)))
こんなの?

453 :デフォルトの名無しさん:02/07/16 12:16
>>452
最後のdisplayはwriteのがいいんじゃないの?
と、くだらないツッコミしかできなくてスマソ。

454 :デフォルトの名無しさん:02/07/16 19:37
DelphiみたいなIDE付きのscheme処理系ない?

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

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

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)