>260 英語ヘタレな漏れにも読めたんで、quick start としてはいいんでないかい?
とか言ってみるテスト。
アラビア語は国連の公用語だし,よく研究され学習環境
も整った「金になる」言語ですよ。
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になってほしい…
こうして標準は「RnRS」から「RnRS+SRFI」へと変わってゆくのでした……。
269 :
デフォルトの名無しさん:02/06/27 13:54
詳細調べないまま書き込んでスマソなんだけど,
SRFIって手続きやマクロで実現できるものなの?
それとも処理系に手を加えないとダメなものもある?
foldとかはただの手続き群,単一型ベクタは処理系に手を加えなければならない,
といった感じがするのだけど.
>>269 srfiによる。マクロ一つで出来るものもあれば、処理系をいじる必要の
あるものもあり。各srfiのreference implementationの項に注が書いてある。
そのへんの区別も含めて、あんまり厳密なこと言いっこ無しよ、みたいな
ノリなんじゃないかなあ。srfiは。
いつの間にか(?) gauche が deb化されてる。
でもバージョンが古い。0.4.6 って。。。
272 :
デフォルトの名無しさん:02/06/27 19:05
schemeの機能を満たしてて括弧のネストがなければ最高なんだが。
>>272 括弧に注目してはいけない。Lisp プログラムは字下げで読むのです。
括弧が無いという点では、Python もなかなか良い言語だと思います。
というか、しっかり関数分割された Lisp プログラムは括弧はそれほど
ネストしませんよ。
>271 うん。漏れ最新版を deb にしてるんだけど、
ドキュメントとかちゃんとまだ書いてなくって未公開。
メンテナさんには 「upstream バージョンあがってまふよ〜 」 って言ってあるんだけど…
275 :
デフォルトの名無しさん:02/06/27 22:28
>というか、しっかり関数分割された Lisp プログラムは括弧はそれほど
>ネストしませんよ。
カッコの合計数が増えるという罠
>>275 バレたか。でもまー f(x) がネストするよりは読みやすいと思うけどね。
lispの括弧が多いってさ、普通の言語と比べて
一番外側の括弧が余分なだけじゃないの?
>>277 それは non-nil かも。他の言語でも、多かれ少なかれ、頭の中で入れ子構造を
展開してるんでしょう。Lisp の場合はそれが形となって表われているだけ
だと思う。
279 :
デフォルトの名無しさん:02/06/28 01:24
>>277 一番外側じゃなくて一番外側(プログラム自体)と二番目(一文一文)だと思う。
この二番目が曲者。これが大量にあるおかげで括弧が大幅に増えてる。
>>279 Dylanは処理系が糞すぎるのが欠点。コンパイル時間がかかりすぎ。
しかもHelloWorldが数メガって・・・
>>281 Dylanってたした、FunctionalObjectだったかな、
商用のベンダーが存在して、そのエディターはコンパイルしたあとに
どれだけ最適化が行われたか色分けしてくれるらしいよ。
Webのどっかに紹介記事があったと思ったけど。
最近、たびたび夜にこの2ちゃんねるに、ばかな書き込みをしておりました、
峯島雄治と申します。どうももしわけありませんでした。
何か言いたいということがあれば、0468 35 8420 までお電話ください。
33歳ヒッキーです。
なんでこのスレに書き込むんだよう
>>283 もし251, 257さんであれば早目に病院に行かれた方がよいかと思います…。
lisp では後置再帰をしばしば使いますが、
C コンパイラでも後置再帰を使うことは有効なのでしょうか?
つまり後置再帰であることを認識してスタックを無駄に消費しないコードをはいてくれる
C コンパイラというのもあるのでしょうか?
>287 ごめん、tail recursion って末尾再帰っていうんだね…
勝手に訳語作ってた YO 。逝ってきます。
単純な末尾再帰に限っていえば、最近のC/C++コンパイラは最適化でスタックを積まなくなる。
が最適化オプション次第で挙動が大きく変わるようなコードは推奨されんだろうな。
とりあえず知ってる限りでgccとかVC++あたりは。
VC++は.NET/6.0ともに末尾再帰の最適化無し
やぱーり、 Scheme マンセーですか。
Common Lisp の関数を調べるより、Scheme で自分で書いた方が
早くて綺麗だったりする。個人での使用なら速度も十分だし。
>>292 漏れはまだ本に載ってるような勉強用のコードしか書いたことないんですが、
例えばどんなものを書くときに scheme は便利ですか?
>>293 C で書くと超面倒、でも Perl で書くと先々不安なもの。
あとはメタ言語を作ろうとする時。
>>292 >Scheme で自分で書いた方が早くて綺麗
実はそれって、言語のポピュラリティという面では
不利なんじゃないかと思う次第。
熟練者は簡単に欲しい関数が書ける
→誰も共通ライブラリみたいなのを作ろうとしない、
あるいはマイライブラリで満足
→初心者はライブラリの少なさにガクゼン。
自分でいちいち書かなくちゃならないのがめんどくさくて挫折。
まあ、srfiなのかな。進むべき方向としては。
>>295 うわ、sageの使いかた間違えたよ。はづかちい。
Schemeが成熟したらダメだろ。
これ以上複雑化していったら、気軽に作れる物じゃなくなって
実装者が減ってしまう。
298 :
デフォルトの名無しさん:02/06/29 12:33
>>294 1行目をもう少し具体的にお願いしまつ。
>>298 扱うデータ構造がネストしているような場合、例えば non-destructive に
再帰的に reverse したいような場合、C だとメモリ確保/解放が面倒です。
Perl でも出来るんですが、ランタイムエラーにならずに処理を進めて
くれちゃったりするので困る事があります。
あとは REPL (read-eval-print loop) の存在が大きいかな。素早く定義
して、素早く動作確認できるのが魅力的。コンパイルする必要もないし。
C, Perl, Scheme を日常的に使いわけているので、「これは Scheme しか
できない!!」ってのを挙げられなくて申しわけないけど。
>>299 REAL を一瞬パールと読んでしまった。。
>C, Perl, Scheme を日常的に使いわけているので
括弧いいですね。私はまだどれも初心者用の本に載っているようなプログラム
しか書けませんが。どの言語も好きですけどね。もっと修行してきます。
301 :
デフォルトの名無しさん:02/06/29 23:10
REPLて略初めて聞いたよ。
302 :
デフォルトの名無しさん:02/06/29 23:23
>例えば non-destructive に
>再帰的に reverse したいような場合、
これってどういう意味?
破壊しないで、再起的に、・・・reverseってどういう意味?
>>302 つーかおれはこの意味もわからんのだが。
>Perl でも出来るんですが、ランタイムエラーにならずに処理を進めて
>くれちゃったりするので困る
>>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 を使うのは
先々不安って言ったんですよ。
>>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))
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;
}
}
俺版。どっちの方が良いんだろう?
(define (rev tree)
(reverse
(map (lambda (s)
(if (list? s) (rev s) s))
tree)))
>>299 その「扱うデータ構造」ってのは大抵ファイルとかから取りこむんだよな?
そーするとパーサ書くのが大変な気がするんだが、どうなん?
最初からリストで書かれていればともかく、普通そんなこと無いだろうし、、
>>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))
>>308 パーサというか、トークン化できればどうにでもなると思うよ。
>>309 map-* ってのは結構使えるかも。map-append とか。
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);
}
だよね?
非破壊って書いてあるだろ
(define (rev s)
(if (list? s)
(reverse (map rev s))
s))
(define (rev s)
(if (list? s)
(map! rev (reverse s))
s))
reverse! はどう書くの?
どんどん洗練されていく
map! なんてなかった。
(define (map! f s)
(do ((t s (cdr t)))
((null? t) s)
(set-car! t (f (car t)))))
で置き換えて。
>>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))
>>57 >実装上じつは、ループで済んでしまうのでしたぁ!!!!!
Loopとrecueseは、末尾呼びだしのgoto(?)への置き換えという「簡単な」最適化をするだけで
理屈だけじゃなく実装上も等価になるからこそ、Lisperは堂々とrecurseしまくれる。
難しい最適化でもなんでもなく、単純な置換で済む。コストは極めて低い。
詳しいことは、Shiroさんとこの、「なんでも再帰」と「Schemeの実装におけるスタックフレーム」を。
あと、C(の標準的な姿)では末尾再帰の最適化はしにくいかもね。
ただ、一方で、
>>55 >recursion ならスッキリ書けるものをわざわざ汚いループ構文や制御変数を使って
という意見も片手落ち。
rubyみたいに内部ireraterが有れば、十分綺麗だし、
関数に、その関数が終ったら次に続けるべき「なにか」を
渡さなくてもいいので、かえってすっきり。
>>320 > 関数に、その関数が終ったら次に続けるべき「なにか」を
> 渡さなくてもいいので、かえってすっきり。
これどういう事?
322 :
デフォルトの名無しさん:02/06/30 13:40
323 :
デフォルトの名無しさん:02/06/30 14:23
>非破壊って書いてあるだろ
そんなのは
list.add(entry[i].clone())
とするだけだろうが。
324 :
デフォルトの名無しさん:02/06/30 20:56
LISPの、定義された関数がたくさんのっているサイト
ってありますか?教えてください。
Common Lisp より先に Scheme をやった方が、綺麗な関数が書けるように
なるかも。後者が綺麗なので前者を学習する気がなくなるという副作用付き。
327 :
デフォルトの名無しさん:02/07/01 00:01
common lispが汚いって
どの辺が汚いのかな?
当方schemeオンリー
>>320 > あと、C(の標準的な姿)では末尾再帰の最適化はしにくいかもね。
意味がわからん。
容易に、最適化がやりにくいスタイルで書ける、と言うくらいの意味?
みなさんの好きな scheme 処理系は?
Dr.
332 :
デフォルトの名無しさん:02/07/01 11:41
>326 漏れ Emacs Lisp しかつかったことないよ〜 \(`д´)/うわぁぁぁん
334 :
デフォルトの名無しさん:02/07/01 16:56
guile かな。mit-scheme にしようとしたけど、Unix システムコールが
見当たらなかったのでやめた。
>>333 御安心ください。私も Emacs Lisp, Scheme, Common Lisp の順番で
学習しましたカラ。Common Lisp は現在進行形。
SICP 読んでる途中なんだけど
>>114さんの紹介に魅かれて Onlisp も読み始め
た。無謀かなぁ? SICP は 4章の後半まで読んで stream って何だっけ?って
なってまた始めから読んでます(汗
(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)
(define (come! scheme)
(display scheme) (newline)
(for-each (lambda (x) (display x) (display "━━"))
'(キタ (゚∀゚) (∀゚ ) (゚ ) ( ) ( ゚) ( ゚∀) (゚∀゚)))
(display "!!!!!") (newline))
↑プログラミングを楽しむ事が重要である事を示す良い例
>>324 gaucheでは動いたよ。シンボルに8-bit charを通す処理系なら
動くんじゃない?
>>343 あ、そういうことじゃなくて、顔が右向きのから左向きのに変わっていく、み
たいなのがあったら面白いかなぁと。
で、自分でやってみようかと思ったけど一回書いた文字を消すのって無理かも
しれないですね。
>>344 (define (come! scheme)
(for-each (lambda (x) (cls) (display scheme) (newline)
(display "キタ━━") (display x) (display "━━!!!!!") (newline) (wait 10))
'((゚λ゚) (λ゚ ) (゚ ) ( ) ( ゚) ( ゚λ) (゚λ゚))))
こんな感じか?
clsとwaitは誰か定義して。
>>344 あ、そういうことか。
ポータブルに書くのは難しいけど、gaucheならこんな感じでどう?
sys-selectはタイミング調整ね。
(define (come!)
(for-each (lambda (x) (display x) (display "\r") (flush) (sys-select #f #f #f 200000))
'((゚∀゚_) (∀゚ ) (゚ ) ( _ ) ( ゚) ( ゚∀) (_゚∀゚)))
(come!)
>>346 おーすごい!
でも krxvt だと俺のフォント設定(東雲)が悪いせいで目が表示されない(汗
gnome-terminal でちゃんと見れました。
;; 3行目の最後に閉じ括弧 1つ足りないですよね?
えーと。dynamic-windって、どういう使い方するものなんでしょうか?いまいち謎。
>>348 open/close を自動化させたい時に便利。call-with-* シリーズを書く場合
なんかにどうぞ。でも、よーく R5RS を読んでみると call-with-* には
向かないのかも知れないけど。
351 :
デフォルトの名無しさん:02/07/02 22:33
>>349 これって thunk のとこの
>(call-with-current-continuation escape)
って scheme 的にはありなの? gauche では
>(escape)
にしないとエラーになったけど。
>>352 escapeは0個以上の可変長引数を取る手続きのはずだから、
call-with-current-continuationに渡しても問題ないはず。
gaucheのバグじゃない?
>>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日あれば十分なような・・・
文法だけなら10分デス
>>356 それはない。セルとリストの概念だけで数十分はかかる。
他の言語をやってれば10分で分かるだろ
どこにでも出きますね。○○言語なんて10分とか言いだすやつ。
どうせ文法知ってるだけのくせに。
>>357 セルとリストの概念は、文法じゃないんじゃない?
こういう話題は荒れるだけのような気がしま
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
>どうせ文法知ってるだけのくせに。
それ以外に何が・・・・痛い
文法知ってるだけでプログラムが書けるんですか。凄い才能ですね。
Cで会話できるよ。
(´∀`)マターリ
>>130 Danke.
ついでに。
Debianで「ledit」というパッケージになっているツールを使えば、
対応していないソフトでも括弧の対応を取ってくれるようになります。
ただし、行を超えては駄目。
10分とか言ってる奴も実は数日ぐらいはかけて本読んだりプログラム作ったり
人から教えてもらったりして理解した罠。
調べながら書くにしても、基本的な道具立ては分かっていないと辛いよね。
結局、自然言語を覚えるのと同じ過程を踏むんじゃないのかな。
漏れ的には弁証法的スパイラルを昇っていく過程だと思う。
372 :
デフォルトの名無しさん:02/07/05 23:25
どなたかCommonLispのdirectory関数の使いかたがのってるURL知りませんか?
373 :
デフォルトの名無しさん:02/07/06 00:01
言語は理論じゃない.実践を経て覚えるものさ.…多分.
375 :
デフォルトの名無しさん:02/07/06 04:19
文法が簡単つっても、
関数の場合は
(演算子 被演算子...)
で説明は済むが、
構文はlambdaやletとか特殊な括弧の使い方するやつが多い。
((lambda args ...) values)
とか。関数シンボルの代わりに関数定義をそのまま書けたりするってのは、
非常に直感的だとは思うけどね。
>>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))
>>377 Paul Graham 氏の On Lisp や、SICP が参考になると思います。
前者は Common Lisp ですけど。
380 :
デフォルトの名無しさん:02/07/06 08:01
>>377 そのflatはエレガントだねえ。
ちょっと感動した。
>>377 Winston の Lisp 本かな、漏れが 見たのは。
>>380 たしかに。雑音が全く無い。すばらしい。
(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 はちょっと邪道かな。でも便利だし
(素の)schemeではファイルを消すことができないと読んだのですが、例えば
「無」を書きこむことでファイルを消す、みたいなことはできるのでしょうか?
それともR5RSの範囲ではどうやっても無理なんですか?R5RS+SRFIならできる
とか?
すでに存在するファイルに書き込むときの挙動は未規定だった気がします(上書きするかもしれないし追記するかもしれない?)
values とかいう手続きが返す多値って、リストやベクタとは違うの?別物?何の必要によって?
389 :
デフォルトの名無しさん:02/07/06 14:59
>>387 assocなんて、多値だったら嬉しくねぇ?
(成功or不成功, 見つかった値)
Cのfopen(3)なんかだと、pointerの0が「不成功」の役割を担ってるよねぇ。
無理やり二つの型を圧縮してるから、0の意味が分かりにくくなっているわけだ。
ただ、assocを多値にするとsetfはいやーんなままだねぇ。
>>389 やっぱり、 list でも大して変わらない気がする…
>>388 の、関数の戻り値を直接他の関数に渡す、って云う使い方は魅力だけど…
普通の list でそう云う事をしたい気がするな…
Lisp だし。
MIT Scheme で複数の式を
いっぺんに評価するにはどうすればよいでしょうか?
(define (set-xy)
(begin
(define x 1)
(define x 2)) )
(set-xy)
を評価しても
x ; Unbound variable : x
y ; Unboune variable : y
となってしまいます.
どこがいけないんでしょうか
>393
(define (set-xy)
(begin
(define x 1)
(define y 2)) )
の間違えでした
>>393 set-xyの中で define した x と y は set-xy の中だけだから。
>>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))
R5RS の letrec の定義をトレースしてみると面白いね
scheme (gauche) で less もどきを作っているんですが、space キーが押され
た瞬間に次のページを表示させるためにはどうしたらいいですか?
read-char は enter が入力されるまで待っているので少し希望と違うんです
が。
>>400 C じゃないと無理ですかね?勉強用にはとりあえず Unix コマンドもどきを作
るのが定番かなと思ったので。「もどき」なのである程度のもので我慢するこ
とにします。
>>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))
>>399 enterを待っているのはread-charではなく、システムの端末ドライバでしょう。
gauche.termiosモジュールに端末コントロールの関数がひととおり揃って
いるので、lessの間だけ入力をraw modeに切替えてみては。
エラー時に端末のモードを戻すのを忘れずに。
ちなみにtermiosへのインターフェースを持っているSchemeはけっこう
多いますよ。
>>400 言語の問題じゃなくてライブラリの問題ですな。わかります?
>>403 言語とライブラリは一心同体。gauche に充実した termios インタフェースが
あるなら話は別ですけど。
>>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))
>>404 君、言語とライブラリーの仕様の区別ついてないだけじゃなくて、
さらに実装も混同してるんだね…Jesus!
408 :
デフォルトの名無しさん:02/07/07 21:51
windowsなら、kernel32.dllから適当な関数持ってきて叩けばいいと思うけど、
unixだとどうなるのかな。
ってもう解決した感じだね。
>>408 Unix(Linux) の場合は端末ドライバのモードを変えてやればいいようです。C
FAQ の 19章にそのまんま載っていて、gauche でもほぼ同じ方法を使えました。
試していないけど cygwin 使えばそのままできそうですね。
でも標準入力を less もどきに渡すとエラーになるんですよね。読み込むデー
タも標準入力、キーボードからの入力も標準入力なのでだめなんでしょうね。
難しいなぁ。
>>409 stdinを使わずに/dev/ttyを開いてみれば?
>>410 おー、素晴しい。ビンゴです。
キーボードからの入力を /dev/tty から受け取るようにしたらうまくいきました。
どう?
なにが?
412 : ◆SChEMeHI :02/07/09 10:23
415 :
デフォルトの名無しさん:02/07/09 11:31
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の例書き直しちゃったよ。
Lisp について調べてると、なにかと Paul 氏が出てきますね。
やっぱ成功したせい?
419 :
デフォルトの名無しさん:02/07/11 10:00
420 :
デフォルトの名無しさん:02/07/11 18:04
ほとんど関係ないんだけど、安西先生いま塾長なのね。ちょっとびっくり。
あの本は高校の図書室にあった。読まなかったけど。
何でこのサイトには改行がないんだ。
俺の Mozilla が悪いのか?
読みづらいったらありゃしない。
IEも同じ。
425 :
デフォルトの名無しさん:02/07/12 10:17
原稿料いくらもらったのかなー
塾長ってどっかの塾?
427 :
デフォルトの名無しさん:02/07/12 18:15
慶応義塾
ワシが男塾塾長(略
429 :
デフォルトの名無しさん:02/07/14 02:49
LISPで作られたWebブラウザって無いの?
Common Lisp で文字列と数の相互変換をしたいんですけど、適当な関数が
みあたりません。Scheme でいう string->number, number->string のような
関数があればと思うんですけど、他になんか定石があるんでしょうか?
read-from-string で出来ました。お騒がせしました。
R4RSに書いてある低水準マクロ。syntax-rulesじゃない方のやつ。
あんな説明じゃ解らない。
syntaxって何。quote の構文的な相当物って意味わからんし
identifierってシンボルと違うの??
誰か教えて・・・
434 :
デフォルトの名無しさん:02/07/15 02:48
>>433 >syntax-rulesじゃない方
ってなに?
define-macro?
syntax-case?
おれはdefine-macroしか知らん。
>>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。
Lisper の皆様は、自分の作ったプログラムが「ステップ数」だけで
評価されたらどうしますか? まぁ、そんな企業にいないだろうけど。
438 :
デフォルトの名無しさん:02/07/16 03:06
439 :
デフォルトの名無しさん:02/07/16 03:13
>>438 S式中の括弧を増やすテクを教えてください。
>>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 inline-expand & macro-expandでの公開は、結構普通みたいです。
LISPの利点の1つかも。
447 :
デフォルトの名無しさん:02/07/16 06:21
>>447 2段オチだとしても、
つまんないし、わかりにくいよ
449 :
デフォルトの名無しさん:02/07/16 06:32
>
>>441 >'(a b c d e)
>==> '(a . (b . (c . (d . (e . ())))))
こういうpretty-print作ってくれ
>>439 微妙です。それも是非議論したいです。
プログラム全体をパースして、それで得られる Lisp オブジェクトの総数
とか。駄目?
関数呼び出しの数とか、
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処理系ない?
>>435 さんくす!R4RS眺めつつ、実際に試しつつ、だんだん理解出来てきた気がする!
でもまだちょっと
(bound-identifier=? (generate-identifier 'x) (generate-identifier 'x)) => #f
これよくわからん。 'x を指定する意味は何。
・・・ところでsyntax-caseって?
>>456 ダメじゃダメじゃ。
あんな不細工なの使ってるのあっちの学生ぐらいだよ!
センスなさすぎ。
ちうか、日本人が作ってくれんかのう?英語チンプンカンプンなので。エヘ。
それとemacs勢のやつらは、emacs使いすぎ!
独立しろよー、この大馬鹿モン供があ!
IPAはイパーイ金出すぞー
ちうわけで、今細々と作ってます。
ああめんどっちい
IDE って必要ですか? 具体的にどんな機能を期待するわけ?
461 :
デフォルトの名無しさん:02/07/17 00:14
>>460 そうきたか。
>IDE って必要ですか?
馬鹿か、おめえは!
そんぐらい自分で判断しろや。ギギ
とりあえずフォームにテキストボックスやらボタンとか貼っつけて、
括弧書きながらあーだこーだ悩みたいですなあ!
ちうか、日本語対応してる独立したリソースエディタって何で無いの?
へんなクズばっか。もういや。
> とりあえずフォームにテキストボックスやらボタンとか貼っつけて、
> 括弧書きながらあーだこーだ悩みたいですなあ!
そんなの、メタ言語を作れば良いんじゃないの?
>へんなクズばっか。もういや。
禿げしく同意。
464 :
デフォルトの名無しさん:02/07/17 00:23
>>462 ええと?
自分は!画面見て!あーだこーだ悩みたいのであります!
なんでそこで、メタだの、言語だの出てくるのさ。
察してくだせ。くだせ。
465 :
デフォルトの名無しさん:02/07/17 00:34
ぷぷぷ、レス無いんで、フォームにボタン張っつけまで、
作ってからまた考えるよ。こんちくしょう。
そんでクズの仲間入りかよ、おい。
466 :
デフォルトの名無しさん:02/07/17 01:06
リスプ使ってる人はエリートですか?
467 :
デフォルトの名無しさん:02/07/17 01:44
以下の関数は末尾再帰とみなしてよいでしょうか?
(define (for-each-pair f g pair r)
(cond ((null? pair) r)
((not (pair? pair)) (g (f pair) r))
(else
(for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r)))))
終端式内に for-each-pair の呼び出しが入っていても
大丈夫でしょうか?
468 :
デフォルトの名無しさん:02/07/17 01:44
ダメ人間かも。
>>467 だめ、
(for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r)))))
の内側にある方が末尾再帰じゃない。
471 :
デフォルトの名無しさん:02/07/17 02:07
>469
では、以下のようにしたらそれぞれの関数は末尾再帰ですか?
(define (for-each-pair-1 f g pair r)
(cond ((null? pair) r)
((not (pair? pair)) (g (f pair) r))
(else
(for-each-pair-1 f g (cdr pair) (for-each-pair-2 f g (car pair) r)))))
(define (for-each-pair-2 f g pair r)
(cond ((null? pair) r)
((not (pair? pair)) (g (f pair) r))
(else
(for-each-pair-2 f g (cdr pair) (for-each-pair-1 f g (car pair) r)))))
なんだか無駄な気がしますが。
>>471 ちがーーう。
そんなんでOKなら、なんでも末尾再帰に出来ちゃうでしょ。
末尾再帰は本質的にはループと一緒なの。
ループで書けないものは末尾再帰で書けない。
まあ、スタック使えば不可能ではないけどエレガントさ 20pt ダウンくらい。
car側再帰、cdr側末尾再帰になってるから、listを処理するなら
>>467で充分
なんじゃないかな。
car側が深すぎて再帰だとマズーな場合は
>>472が言ってるように泥臭く書く事
になるだろうけど。
(define (for-each-pair f g pair r)
(define (recur pair)
(cond ((pair? pair) (recur (car pair)) (recur (cdr pair)))
((null? pair) r)
(else (g (f pair) r))))
(recur pair))
末尾再帰とループでかいてみたが・・・
(define (for-each-pair f g pair r)
(define (recur pair)
(cond ((pair? pair) (for-each-pair f g pair r))
((null? pair) r)
(else (g (f pair) r))))
(do ((pair pair (cdr pair)))
((not (pair? pair)) (recur pair))
(recur (car pair))))
>>472 すみません、もうちっとねばらしてください。
>>467 を
ループで書くとこんな感じに書けると思うのですが、
だめですか?
(define (for-each-pair f g pair r)
(do ((pair pair (cdr pair))
(r r (for-each-pair f g (car pair) r)))
((not (pair? pair)) (if (null? pair) r (g (f pair) r)))))
要は、処理系が末尾再帰と認識して、ループに変換して
くれるかどうかが知りたいのですが。
単純なループにはできそうにないのでは
(define (dotted-for-each f x)
(if (list? x) (for-each f x)
(do ((x x (cdr x))
((not (pair? x)) (f x))
(f (car x)))))
(define (for-each-pair f g pair r)
(cond ((pair? pair) (dotted-for-each (lambda (pair) (for-each-pair f g pair r))
pair))
((null? pair) r)
(else (g (f pair) r))))
>>474,
>>476 は r を変えてないからダメでしょう。
>>475のように処理されると思いますよ。
car部の処理があるから、そこのところで末尾再帰じゃなくなるだけで。
>>475 >>474 とか
>>476 とかちゃんと読まないでレスするから
的外れかも知れないけど、SICPのコンパイラ作るところとか見た?
それを見れば分かるけど、
>>467 の場合、内側は普通の再帰のまま
外側はループになるよ。
で、
>>467をいくら書き直して(例えばスタック使って強制的に)末尾再帰しても
実行効率とかメモリー効率が良くならないよ。
>>475 俺が
>>472 で「ループ」と言ったのは正確には
「再帰を使わないループ」という意味。不正確な言い方してゴメン。
で、そういうことだから
>>475 はダメ。
それから、
>>479 は良く見たら
>>477が同じこと言ってたね。
で分かりやすく書いてみる。
よく「末尾再帰はループになる」って言い方するけど、
コンパイラ:「末尾再帰ハケーン!!ループにしますた。」
じゃなくて、実際には。
コンパイラ:「末尾呼び出しハケーン!!ジャンプ命令にしますた。」
って事なの。
だから *結果的に* 末尾再帰はループになるし、
相互再帰とかも素直に処理される。
(もちろん単なるジャンプじゃなくて引数の受け渡しとかの問題が有るけど
それは置いといて)
だから、「for-each-pair は末尾再帰関数か?」という問いには
NO と答えるしか無いけど、
「for-each-pair の2回の再帰呼び出しが普通に呼び出されるか?」
という問いもやはり NO になる。
外側の方の再帰呼び出しはジャンプ命令になる。
すると、結局for-each-pairは、
「ループがあってその中で自分自身を1回だけ呼び出している。」
そんな関数にコンパイルされる。
だから
>>477の言ったようになる。
フラットなリストでしてみても速度とメモリの効率はよくないだろうなあ。
(define (flat x)
(cond ((list? x) (apply append (map flat x)))
((pair? x) (apply append (map flat (list (car x) (cdr x)))))
(else (list x))))
(define (for-each-pair f g pair r)
(do ((pair (flat pair) (cdr pair))
(r r (g (f (car pair)) r)))
((null? pair) r)))
flatはこうか?
(define (flat x)
(cond ((list? x) (apply append (map flat x)))
((pair? x) (flat (list (car x) (cdr x))))
(else (list x))))
>>457 syntax-case については、
Kent Dybvig の本「プログラミング言語 Scheme」に説明があります。
(けど、あの本のなかで一番わかりにくい部分の気がする)。
あとひまなら、
"Syntactic Abstraction in Scheme"
"Writing Hygenic Macros in Scheme with Syntax-Case"
あたりも。
484 :
デフォルトの名無しさん:02/07/18 01:58
syntax-caseの定義ってなんであんなデカイの?
解析しようとして挫折しました。
>>480 わかりやすい説明ありがとうございます。
>>467 の関数を処理系はループ(ジャンプ命令)に変換するが、
末尾再帰関数とは呼ばないということですね。勉強になりました。
>>479 SICP 読んでみます。
>>486 そんなことないと思うです。
ループに変換される方は末尾再帰と呼びます。
for-each-pair の呼び出しって2箇所あるじゃないですか?
外側のこれ↓
> (for-each-pair f g (cdr pair) (for-each-pair f g (car pair) r))
は終端式だから、末尾再帰になるけど、その内側のこの部分↓
> (for-each-pair f g (car pair) r)
は終端式じゃないから、こっちの呼び出しは末尾再帰にならないってことだと思うです。
488 :
デフォルトの名無しさん:02/07/18 10:03
(define (f x)
(apply + (map (lambda (x) (if (list? x) (apply * (map eval x)) (eval x))) x)))
(define x 6)
(f '(x x x (x x)))
54
ってなるんだけど、関数引数のxをevalしないようになってるの?
>>485 正解。 483 があげてるのは、その訳本(村上雅章訳)。
最近 CD-R を「くだー」と読むようになりました。
↑チョトワラタ
>>487 >>467 の関数は「末尾呼び出し(つまり、ループに変換される)」が、
「末尾再帰関数」ではない。ということが言いたかったのです。
(CDR 焼済)
494 :
デフォルトの名無しさん:02/07/19 10:40
C の
while(1){
処理A;
if(終了条件)
break;
処理B;
}
これを、scheme ですきっり書く方法を教えて下さい。
どうして、scheme の do などには return がないんだ。
>>494 (処理A)
(do () ((終了条件))
(処理B) (処理A))
これかなあ。処理Aが二回でてるのはよくないけど。
とりあえず、call/cc を使えばできるんです。
(call/cc (lambda (return)
(let loop ()
(proc-A)
(if (end? )
(return ))
(proc-B)
(loop))))
でも、長いんです。
(do ((a (処理A 初期値) (処理A (処理B a))))
((終了条件 a)))
になるように処理A、処理B、終了条件を書くとか。
(do ((a 初期値 (処理B a)))
((終了条件 (処理A a))))
こうなれば一番いいけど。
ちなみに Common Lisp なら
(loop
(proc-A)
(if (end? )
(return val))
(proc-B))
んー、実にシンプル。
さらに return は便利で。
(defun foo ()
...
(if a
(return val))
... )
のように関数から途中で抜けれる。
こんな便利な return を無くしたのも
それなりの理由があると思うのです。
なにしろ、 SRFI にもないですから(確か)。
(define (super-a) (処理A) #t)
(do ()
((and (super-a) (終了条件)))
(処理B))
>>494 漏れはよくこう書くな
(let loop ()
処理A
(if 終了条件
結果
(begin 処理B (loop))))
>>499 returnが言語仕様に入ってないのは、ユーザライブラリとして実装
すべしというポリシーなんじゃないの?
503 :
デフォルトの名無しさん:02/07/19 12:04
>>496 >でも、長いんです。
マクロにでもしやがれ
497で言いたかったのは
もともとのproc-A proc-B っていうやり方を変えようってこと。
proc-A proc-Bは単に処理の流れで区切っているだけでしょう。
処理の中で変化していく状態なり変数なりを見てほしい。
それに名前をつけて、初期値と変化の仕方を探す。
(a a0 (... a))
aは名前、a0は初期値、...は次にどう変わるか。
(do ((a a0 (... a))
(b b0 (... b))
.
.
.
(z z0 (... z)))
((end? a b ... z)))
でこうなる。
proc-A は初期値と次の変化のところに
proc-B は次の変化のところに
バラバラにして入れることになる。
この形のループはダイクストラさん曰く 1と1/2回ループと言って、
0回以上のループと1回以上のループを含意する重要なループです。
SRFIにすらないので、関数型言語らしい書き方があるかも思っていたけど、
ないみたいですね。
>>500 関数にするのならもう少しシンプルになりますよ。
>>502,503
なんてたって、schemeには継続とマクロと末尾呼び出しがありますね。
>>504 副作用ありだと問題がありますよ。
あれこれしなくても処理Aと終了条件を一つの関数にまとめればよかった。
while (処理A+!終了条件)
処理b;
(define (end?) (処理A) (終了条件))
(do ()
((end?))
(処理B))
>>503 マクロ
(define-syntax block
(syntax-rules ()
((block tag body1 body2 ...)
(call-with-current-continuation
(lambda (tag)
body1 body2 ...)))))
(define-syntax while
(syntax-rules ()
((while test break continue body1 body2 ...)
(block break
(let loop ()
(cond (test
(block continue
body1 body2 ...)
(loop))))))))
ここにあった。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/#continuation
509 :
デフォルトの名無しさん:02/07/20 03:17
Gauche 0.6 age
512 :
デフォルトの名無しさん:02/07/20 10:49
Gauche のロードマップはあと残す所 0.7 のみ。
まじスゲーよ。
ロードマップて何?
全国ロードマップ
515 :
デフォルトの名無しさん:02/07/20 16:27
そろそろ、gauche を deb にして、sourceforge に
おいてやろうって親切な方はいないだろうか。
>>2-7 のようなリンクもいいが、scheme なアンテナもほしー
とか、言ってみるテスト
>>515 とりあえず checkinstall なんてどう? deb 作ってくれるよ。
with-input-from-file とかってやつは、継続を使って脱出/復帰しても
ファイルが閉じられはしないようなことが R5RS に書いてありましたが、
閉じられはしないだけで current-input-port は切り替わるんでしょうか?
それとも、そのまま?
519 :
名無しのゴーシュ使い:02/07/23 01:35
>>512 ロードマップのページもちょっとずつ変化してるね。
前は version 0.7.0 は GTk サポートのみだったような。
GTk へのインターフェイスが出来れば Guile が不用になるので、
とっても嬉しいです。>> 作者樣
(´-`).。oO(practical scheme へのリンクが切れてますよぉ > 作者様)
Gauche の deb は漏れも up-to-date なパッケージを作ってるんだけど…
もちろん漏れと漏れの友人だけのために。
Debian での正式メンテナは 0.5x くらいからとまったままみたい…どうよ?
Debian の場合 Gauche はどの文字コードでコンパイルするんだ?
全部コンパイルして、gosh-euc, gosh-utf, gosh-sjis てな感じにして、
インストールするときのダイアログで gosh からどれにシンボリックリンク張るか尋ねるのか?
gauche-dev って何が入ってるの?
セロ弾きのゴーシュ万歳!!
LispってEmacsだけのものじゃなかったのですね。
なんだかLispにますます興味が沸きました。
525 :
デフォルトの名無しさん:02/07/25 12:09
Guileの make-shared-substring みたいなのって、gaucheにない?
(string=? key (substring pool s e))
みたいな処理が含まれたループかなんかだと、
使い捨ての文字列をいちいち生成するのはかなり馬鹿らしいと思うんだけど。
>>525 それらしいのは見当たらなかったけど、SRFI-13 からそれらしいの探してくるっ
ていうんじゃだめですか?
string-compare s1 s2 proc< proc= proc> [start1 end1 start2 end2] -> values
string-compare-ci s1 s2 proc< proc= proc> [start1 end1 start2 end2] ->values
string= s1 s2 [start1 end1 start2 end2] -> boolean
string<> s1 s2 [start1 end1 start2 end2] -> boolean
string< s1 s2 [start1 end1 start2 end2] -> boolean
string> s1 s2 [start1 end1 start2 end2] -> boolean
string<= s1 s2 [start1 end1 start2 end2] -> boolean
string>= s1 s2 [start1 end1 start2 end2] -> boolean
527 :
デフォルトの名無しさん:02/07/25 21:15
DrSchemeの専用スレ立てていいですか?
ここだと、どこからどこまでがLispでどこからSchemeの話しなのか
わかりずらいのですが・・・
必要ないだろ。
ここはLispとSchemeと兼用だし。
それだけ話題が少ない。
529 :
デフォルトの名無しさん:02/07/25 22:27
>>525 Gaucheの部分文字列はcopy-on-writeで管理されているので、
変更を加えない限り自動的に共有されるってどこかに書いてあったような
Lispマシンを使っていた世代の人に質問なのですが、
それは、どうして廃れてしまったのでしょうか?
速度でしょうか?それとも「シェルスクリプトの方が
Lispより圧倒的に簡単だったから」という理由からでしょうか?
当時を知る人に昔話でもしてもらえたらなーなんて思います。
>>531 Classical Mathematicsだとばっかり...
「おもこ」してました。
534 :
デフォルトの名無しさん:02/07/27 12:47
>>532 他言語、他システムとの親和性が低かったから。
閉じたプロジェクトでは大きな力を発揮したが。
535 :
デフォルトの名無しさん:02/07/27 13:02
536 :
デフォルトの名無しさん:02/07/27 14:21
>>532 ソフトウェアエミュレーションでも十分速くなったからでは?
538 :
デフォルトの名無しさん:02/07/28 10:12
>>538 (call-with-input-file "./books.db" read) でどうでしょー?
540 :
デフォルトの名無しさん:02/07/28 10:37
>>538 (define data (call-with-input-file "./books.db" read))みたいに
して、carやcdrでデータを取りだせそうです。ありがとう!
関数型でも、この後は変数に代入しまくってもいいんですよ
ね!?
541 :
デフォルトの名無しさん:02/07/28 11:22
>>540 schemeだろうけど、LISPは純粋な関数型じゃないですよ。
なので、あまり気にする必要は無いと思います。
I/Oとか必須でしょうし。
けど、安易に接尾辞に!がつく関数は使わないで、
letとかうまく使えば非破壊でも色々できると思います。
542 :
デフォルトの名無しさん:02/07/28 11:27
非破壊にするメリットは、バックトラック系処理とかで
状態を気にする必要が無いとか、色々。
詳しくは関数型言語スレを参照。
I/Oも、見た目非破壊にすることができたと思います。
すぐに例は思いつきませんが。
Lisper でもデスマーチに巻き込まれるんですか?
544 :
デフォルトの名無しさん:02/07/29 07:59
(let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let))
誰かこれ分かる人解説してください。
545 :
デフォルトの名無しさん:02/07/29 08:33
let に 1を入れて
2を評価する。
どういう意味があるかは不明。
1:'`(let ((let ',let)) ,let)
最初に'があるので
let には `(let ((let ',let)) ,let)が評価されずに入る。
let -> (quasiquote (let ((let (quote (unquote let)))) (unquote let)))
2:`(let ((let ',let)) ,let))
,(=unquote)がないと`(=quasiquote)は評価しない。
`(let ((let 'let)) let) を評価すると
(let ((let (quote let))) let) になる。
`(let ((let 'let)) ,let) を評価すると
let => (quasiquote (let ((let (quote (unquote let)))) (unquote let))) だから
(let ((let (quote let))) (quasiquote (let ((let (quote (unquote let)))) (unquote let)))) になる。
`(let ((let ',let)) ,let) を評価すると
quasiquote 内で (quote (unquote let)) は評価されて (quote let-eval) になる。
let => (quasiquote (let ((let (quote (unquote let)))) (unquote let))) だから
(let ((let (quote (quasiquote (let ((let (quote (unquote let)))) (unquote let)))))) (quasiquote (let ((let (quote (unquote let)))) (unquote let)))) になる。
(let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let))
は評価しても同じになるのね。
1:'`(let ((let ',let)) ,let)
最初に'があるので
let には `(let ((let ',let)) ,let)が評価されずに入る。
let -> `(let ((let ',let)) ,let)
2:`(let ((let ',let)) ,let))
,(=unquote)がないと`(=quasiquote)は評価しない。
`(let ((let 'let)) let) を評価すると
(let ((let 'let)) let) になる。
`(let ((let 'let)) ,let) を評価すると
let => `(let ((let ',let)) ,let) だから
(let ((let (quote let))) `(let ((let ',let)) ,let)) になる。
`(let ((let ',let)) ,let) を評価すると
quasiquote 内で ',let は 'let-eval になる。
let => `(let ((let ',let)) ,let) だから
(let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let)) になる。
comp.lang.scheme に投稿してる人の signature 見ると面白いのがありますね。
(reverse (concatenate 'string "pj.oc.oof@" "egoh"))
=>
[email protected] ;; 無限ループ
((lambda (x) (x x)) (lambda (x) (x x)))
;; あと 2ch の過去ログにあったやつ
((call/cc call/cc) (call/cc call/cc))
というわけで何か面白いネタ募集。
自作の scheme 処理系が r4rstest.scm をパスしません・・・
なぜか SECTION 6 5 6 で引っかかるの。
ソースを追っても何をテストしてるのか解読できません。
へるぷみ〜。
>>544 > (let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let))
見るだけで鬱だ・・・
r4rstest.scm は R4RS のテストですよ。
R4RS の 6.5.6 章を見てください。
数値を文字にして、その文字を数値にしたのが、元の数値と同じであるとか。
550 :
デフォルトの名無しさん:02/07/30 01:20
>>549 あの辺の「数」の実装、まともにやろうとすると頭禿げそうな。
そういえば、bignumの16進数の出力とかってどうやるの?
いちいち16で割り算してったら日が暮れそうな気がするけど。
普通に8bit右シフトじゃん?
gaucheは説明によると、substringがポインタ&レングスコストな
代わりにstring-set!が遅いと書いてあるね。
って、string-set!した時点で新しいオブジェクト作るってことは、
それ参照してる変数全部書き換えすんの?
非現実的な気がするんだけど。
受けオブジェクトがあるのかな。
[複数の参照先]→[受けオブジェクト]→[文字列の実体またはポインタ]
553 :
デフォルトの名無しさん:02/07/30 01:33
>>551 普通って、bignumで8bit右シフトなんて簡単にできるの?
555 :
デフォルトの名無しさん:02/07/30 01:36
>>554 どういうアルゴリズムですか?
例えばshort(0〜9999)とかで分かれてた場合は?
556 :
デフォルトの名無しさん:02/07/30 01:41
>>554 うーん、おれ頭悪いんで、例として
12345678901234567890(これは10進表現)
というbignum値(short配列で(0〜9999の範囲)で格納されている)があった場合、
それをどうやって16進出力するかって例をお願いします。
>short配列で(0〜9999の範囲)
コレがすんげー意味不明
558 :
デフォルトの名無しさん:02/07/30 01:46
>>557 short bn[];
の各要素に入る値が0から9999ってことじゃないの?
これのメリットは10進ならそのまま出力できるって事。
普通のbignumってshortの範囲全部使い切るじゃん
BCDじゃ演算速度がた落ちだろ。
>>559 なにが普通なのかよくわからないです。
いまのところ、
>>558さんの言う通り、
>>556の12345678901234567890という値なら
short bn[] = {1234,5678,9012,3456, 7890};
というのを考えてました。
>>559 じゃあ、0〜65535の範囲を使うとして、
それを10進で出力する方法を教えてください。
内部表現は普通↓のようにすると思うが。
LSB <-・-> MSB
0AD2 EB1F A98C AB54
>>562 いや、方向はとりあえずどうでもいいんですけど。
>>562のshort bn[] = {1234,5678,9012,3456, 7890};
も実際は逆になるでしょうし。
>>563 それって遅いんじゃないですか?
もっと良い方法があるかと思ったんですが。
>>564 方向はどうでも良いが、値が違うと突っ込みが入らないように書いただけ。
>>561 ありがちなのは、10000で割りながら余りを4桁ずつ出していく方法。
同様に、10000進数を16進にするなら、4096で割りながら余りを
3桁ずつ出していけばいい。
>>567 高々除算の数千回から数万回、I/Oに比べたらずっと速い
やはり割り算しかないみたいですね。
結局一度に割る数を多めに取るということでしょうか。
半端な値の処理とか考えると禿げそうですね。
ありがとうございました。
そろそろスレ違いっぽいのでこれで終わりにします。
571 :
デフォルトの名無しさん:02/07/30 02:10
そういうのは自分で作っても実りがあまり無いから、
既存のライブラリ使った方がいいよ、多分。
ハゲるよ(w
572 :
心配だなー:02/07/30 02:14
処理系自作してる間に禿げた人いる?
573 :
デフォルトの名無しさん:02/07/30 02:22
CINTの作者は禿げてるよ!
すとらうすとらっぷもはげてるよ
俺もはげてるよ
内部表現は16進で、10で割りながら表示してます。重いです。
そーか、10000ずつ割るとかやれば少し速くなるんだ・・・気付カナカッタ。
ありがとう
>>568 さん。
577 :
デフォルトの名無しさん:02/07/30 09:24
sawfishでお馴染みの librep は bignum に gnu の数学ライブラリ使ってる。
カリー化な Lisp って何がありますか?
578 :
デフォルトの名無しさん:02/07/30 14:59
579 :
デフォルトの名無しさん:02/07/30 16:10
>>578のgaucheのリンクにある、
(map (pa$ * 2) '(1 2 3)) => (2 4 6)
という例はどういう風に展開されるのでしょうか?
(map (lambda (t1) (* 2 t1)) '(1 2 3))
こんな感じ?
だけど、↓みたいなことしたい場合はどうするの?
(map (lambda (t1) (- t1 2)) '(1 2 3)) => (-1 0 1)
(map (pa$ - 2) '(1 2 3))
じゃ、
=> (1 0 -1)
となって駄目ですよね?
580 :
デフォルトの名無しさん:02/07/30 16:13
(map (lambda (t1) (- t1 2)) '(1 2 3))
ではいかんのか?
581 :
デフォルトの名無しさん:02/07/30 16:16
一方、SRFI-26では、
(map (cut - <> 2) '(1 2 3))
で被演算子の順序を変えられるみたいなんだけど。
この差がpa$の制限ですか?
582 :
デフォルトの名無しさん:02/07/30 16:20
>>580 それをpa$で書くことはできますか?
ってことを聞きたかったんです。
>>579 Haskellとかだと、flipという、引数の順序を入れ換えるオペレータが
あるな。
map (flip (-) 2) [1,2,3] ==> [-1,0,1]
同じようなことをするflip$みたいのを導入すればいいんじゃないか。
どう書くかは読者の演習課題としておく。
584 :
デフォルトの名無しさん:02/07/30 18:13
(define (flip f a)
(lambda (x) (f x a)))
これ?
(define (flip f)
(lambda (x y . z) (apply f y x z)))
scheme処理系の(C/C++での)作り方を解説してるページとかってあります?
588 :
デフォルトの名無しさん:02/07/31 10:49
>>582 gosh にも cut なるんだし、なぜ pa$ にこだわるの?
589 :
デフォルトの名無しさん:02/07/31 22:42
>>589 「Scheme の勉強」って文法ですか?
それとも背景にある Lisp の慣習や定石も含まれていますか?
591 :
デフォルトの名無しさん:02/07/31 23:29
>>590 「Schemeの勉強」は文法だけです。具体的には湯浅太一さん
の「Scheme入門」を読みました。しかし、これだけではオブ
ジェクト指向、Webフレームワークには勝てないんです。(^^;
定石は是非とも知りたいところです。
592 :
デフォルトの名無しさん:02/07/31 23:35
>>591 とりあえず
>>4 にもある SICP を読んでみましょう。
現実的な問題解決は、それからでも十分だと思いますよ。
594 :
デフォルトの名無しさん:02/08/01 00:56
>>593 ありがとう。SICP持ってますが、あれは気長に学習モードです。
なんとか、「現実的な」(?)サンプルを! (^o^)
SICPってやっぱ、簡単なサンプルを越えるすごさがあるんです
かー(感嘆&クエスチョンマーク)
595 :
デフォルトの名無しさん:02/08/01 02:33
>>592 n-queenサンプルのページ
>ただしメモリ消費量が凄いです.8-queenを解くのに90Mも食ってくれます(汗)
すげぇ富豪的だ(w
596 :
デフォルトの名無しさん:02/08/01 07:27
597 :
デフォルトの名無しさん:02/08/01 08:40
質問なんですが、
(let ((a (lambda(a b.d) (cons d a)))) (a 1 2 3 4))
の答えが
((3 4) . 1)
になるんですが、どうしてそうなるかわかりません。
aにlambda(a b.d)(cons d a))))がバインドされるのはわかるのですが、
どういう手続きでそうなるか教えてください。
598 :
デフォルトの名無しさん:02/08/01 09:33
(define (a x y . z) (cons z x))
(a 1 2 3 4)
と同じ
x -> 1, y -> 2, z -> (3 4)
599 :
デフォルトの名無しさん:02/08/01 09:40
600 :
デフォルトの名無しさん:02/08/01 12:29
600記念カコキ
601 :
デフォルトの名無しさん:02/08/01 13:33
ありがとうございます。なんとなくわかりました。598
>consセルは32bit環境で素直に作ると、car(4)/cdr(4)/識別子(1〜4)で、
>少なくとも9〜12byteは必要でしょう。
>Lispのconsセルはポインタ2つきっかりになるのが普通だ
>よ。Javaとかと違って型の種類が固定だから、ポインタの
>下3ビットとかに型情報をエンコードする。特にconsセル
>と小さい整数あたりは最も効率よい表現を割り当てる。
古いネタ(Part2からの)で恐縮ですが。。Scheme処理系を作ってみたくて勉強
しています。過去スレを漁っていると上のようなやりとりを見つけました。
minischeme は前者の方法、gauche では後者の方法をとっていると思うのです
が、ここら辺について詳しい人、解説してもらえませんか? (もちろん Part2
のこの後のやりとりも読んでいるんですが)
後者の方法を使うとポインタの指す先を見なくても型が分るということなので
すが、ポインタの下3ビットに別の情報を埋めこんでしまって、そのポインタ
の指すデータはちゃんととってこれるんでしょうか。
うーん、書きながら何だかまだまだ勉強不足な気がしてきました。。
603 :
デフォルトの名無しさん:02/08/02 14:01
>>602 > ポインタの下3ビットに別の情報を埋めこんでしまって、そのポインタ
> の指すデータはちゃんととってこれるんでしょうか。
consは、下3bitを000にすればいい。
intなんかはmaskしてから使いなよ。(Cのcodeの中では)
> minischeme は前者の方法
miniだけにword境界を跨いでwordアクセス、
あるいはpointerとtagの分離によるworking setの増大による
速度低減は気にしないんだろ。
自身がなければminiの方法で手習いするのもいい。
604 :
デフォルトの名無しさん:02/08/02 14:28
>>604 (progn
(message "Parallel GCとかじゃなければ、計算中は0でいいでしょ?")
(if paranoia
(yes-or-no-p "って返事で、的を射てるんでしょうかね?)))
>>603 >consは、下3bitを000にすればいい。
ポインタの場合は何も埋めこまないってことかな、と一瞬わかったような気に
なったのですが、テストコードを書いてみてまた混乱してしまいました。
gaucheは(下2ビットですが)確かにポインタのときは 00 になっているようで
すね。
図々しいようですが、Cのコードでちょっとしたサンプルを見せてもらえない
でしょうか。それでも分からなかったら minischeme の方法でやってみること
にします。
607 :
デフォルトの名無しさん:02/08/02 16:29
>>604 マークフラグは別テーブルでできると思う。
>>606 603じゃないけど
typedef struct _cell {
struct _cell *car;
struct _cell *cdr;
} cell;
#define atomp(p) (1&(p))
#define cellp(p) !atomp(p) // pairp
#define car(p) (p)->car
#define cdr(p) (p)->cdr
数値を即値(30bit)にするとかの場合はもう1bit使って、
#define fixnump(p) (3&(long)(p)==3)
#define fixnum_value(p) ((long)(p)
>>2)
#define make_fixnum_value(p) (cell *)(((p)<<2)|3)
とか。
(24ビットタグアーキテクチャの資産は生きてるのね…)
609 :
デフォルトの名無しさん:02/08/02 17:24
λ計算のいい本あります?
>>607 やっとわかってきました。ありがとうございます。
あとは自分で考えてみることにします。
#define fixnump(p) (3&(long)(p)==3)
は
#define fixnump(p) ((long)(p)&3==3)
にしないと正しい結果が出なかったんですが、理由はよくわかりません(汗
Cでは、x & y == z は x & (y == z) になるという、イヤな優先順位が。念為。
>>610 んん。
#define fixnump(p) ((((long)p)&3)==3)
じゃないとマズくない?
>>611-612 あ、そうですか。
今手元に本がないんで後でちゃんと調べるつもりだったんですが、適当なこと
を書いたかもしれません。すみません。
#define fixnump(p) (3&(long)(p)==3)
がダメなはずはないでしょうか?自分のプログラムが間違っていただけかもし
れません。
それと何度も質問ばっかりで申し訳ないんですが、、
#define atomp(p) (1&(p))
#define cellp(p) !atomp(p) // pairp
ポインタのアドレスの一番下のビットがたまたま1になっていてこの判定が逆
になってしまう可能性があるように思うのですが、そういうことはないんでしょ
うか?
>>613 > ポインタのアドレスの一番下のビットがたまたま1になっていて
ヒープデータをポインタのサイズ、もしくはセルのサイズに
必ずアラインするようにしておく。
そうすれば、ポインタ4バイトのアーキテクチャなら、
有効なポインタの下2ビットは常に0。
必ず0
>>614-615 なるほど。みんなそれを前提にしてたんですか。思わず溜息ものです。
過去ログの話もいまいち飲み込めなかったのが全部すっきりしました。
これが常識なんでしょうか。すごいなぁ。
>>615さんの紹介してくれたページにもその辺のことが書いてありますね。
これから続きを読んできます。
みなさんいろいろありがとうございました。
617 :
デフォルトの名無しさん:02/08/02 22:22
>>616 つーか、ワード境界を跨いでワードを配置しないのは、
システムプログラマの常識。アセンブラの勉強しなされ。
RISCだとそもそも一発でread/write出来ないのが多いし、CISCでもペナルティがある。
そもそもmalloc(3)はワード境界から割り当てる実装が多い。(つーかしないのある?)
>>609 とりあえず、Barendregtの本はどうでしょう?
板違いかな。
619 :
デフォルトの名無しさん:02/08/03 19:25
僕はアメリカのフロリダで学生してるものなんですが、
今8週間のクラスをとっています。最初の2週間prolog,
次の2週間にscheme,次の2週間にMLで、最後の2週間に
コンパイラの概念を教えるクラスをとっているんですが、
shcemeははじめて、というか関数型言語ははじめて勉強するので
よくわかりません。使ってる言語はインディアナ大学の
プログラミングラングエッジスキームという本なんですけど。
(((if (eq? 'a 'b) car cdr) (cons cdr car))'(3 (2 1)))
return 3,
(define x (lambda (y) (lambda (z) (cons z y))))
((x '(2 1)) '(4 3))
return ((4 3 ) 2 1),
(define x (lambda ( y z)(cond ((null? z) y)((eq? (car z)y)(cons y z))
(else (x y (cdr z))))))
(x 'd '(a c b))
return d,
(x 'b '(a c c a))
return b,
(map (lambda (f) (f '(a b c d))) (list cddr cadr caddr list))
return ((c d) b c ((a b c d)))
など初歩の問題らしく、2週間ことにテストがあり、これはshceme
のパートの一部なんですが、はっきりいってぜんぜんわかりません。
アメリカ人も難しいクラスとなやんでいるのですが、どんなvalue が
リターンされるか答える問題ですが、教授は簡単だといっています。
やはりshcemeを勉強しだしこのくらいはできないとだめなんでしょうか?
僕は日本の理工系の学生は尊敬してるのですが、このくらいは
日本の学生は簡単にやってしまうのでしょうか?Cならわかるのですが、
なにかこのクラスをとって自信が情報工学勉強してる自信がなくなって
きました。
ならやめろとかいわないでね。
>>619 インタプリタを使える環境にあるんでしょ?
括弧の一番内側から1ステップづつ実行してみるのがよろし。
この課題について言えば、Cと違って関数もオブジェクトに
なることが理解できたらすぐわかると思う。あと括弧に慣れること。
この課題がどういうレベルかというと、英語でいうならアルファベットを
読めるかどうかを確認するレベルかなあ。
>>620 Cでも関数ポインタあるんですが。
違いは、それをインラインで書ける、動的に生成できるってことで。
>>619 620 氏の言う通り、単純に慣れの問題だと思われ。
一度慣れてしまえば、スラスラ解けますよ。僕は理工系の学生ではないですけど。
>>621 > Cでも関数ポインタあるんですが。
そういやそうだな。
そしたら最初のやつはlambdaも出て来ないから
わかりそうなもんだが…もしかしてquoteで引っかかる?
>>623 もしかしたらCをわかってるつもりなだけで
(((intern("a") == intern("b") ? car : cdr)(cons(cdr, car))))(list(3, list(2, 1)))
なんてのを見ても動作が理解できないとかだったりするかも。
(キャストは省略してます。)
実はCもわかってるといっても1年しかたってないので、
schemeに比べるとわかるという程度で・・・
いまschemeを習いだして1週間目がすぎて、2週目なんですが、
本よんでいるにもかかわらず、この最初の問題もわかりません。
(((if (eq? 'a 'b) car cdr) (cons cdr car))'(3 (2 1)))
(eq? 'a 'b)car cdr)(cons cdr car))
ここの意味だけでぜんぜんわかりません。'aと'bがeqalなら
carで#fならcdr? まったくわかりません。誰かどうやって動いてるか
解説おねがいします。テストではoutputを書けってでてくるので。
Cについてはなじらないでください。
>>624さんがいってる動作も
ぜんぜんわかりません・・・・
>>625 これは理解できる?
(eq? 'a 'b) => #f
(if #f car cdr) => cdr
(cdr (cons cdr car)) => car
(car '(3 (2 1))) => 3
>>625 わかりやすく解説ありがとうございます。
なぜ(cdr (cons cdr car)) ->car
になるのでしょうか?リストの中でcarは最初、cdrは
残りというのはわかるのですが、このリストの中身、
(cons cdr car)のcar->cons, cdr->cdr carとは違うのですか?
調子にのってると思われるかもしれませんが、できれば
こちらの解説もおねがいできないでしょうか?
(define x (lambda (y) (lambda (z) (cons z y))))
((x '(2 1)) '(4 3))
return ((4 3 ) 2 1),
define xに (lambda (y) (lambda (z)(cons z y))))
がバインドされるのですよね? (lambda (z)に(cons z y)が
バインドされるのでしょうか?そしてそれをlambda (y)にバインド
ということでしょうか?return されるのをみると、与えられてる
ものが逆になってるということだけわかるんですが・・・
>>626 > (if #f car cdr) => cdr
> (cdr (cons cdr car)) => car
これ違うんじゃ。。。quoteついてないからcdrやcarの中身だと思われ。
>なぜ(cdr (cons cdr car)) ->car になるのでしょうか?
gosh> (cons cdr car)
(#<subr cdr> . #<subr car>)
gosh> (cdr (cons cdr car))
#<subr car>
あのさ、自分で試すことはできないの?
>>629 だいたいの雰囲気はこういう感じ。
(define x (lambda (y) (lambda (z) (cons z y))))
x => (lambda (y) (lambda (z) (cons z y)))
(x '(2 1)) = ((lambda (y) (lambda (z) (cons z y))) '(2 1))
=> (lambda (z) (cons z '(2 1)))
((x '(2 1)) '(4 3)) = ((lambda (z) (cons z '(2 1))) '(4 3))
= (cons '(4 3) '(2 1))
=> ((4 3) 2 1)
厳密に書くとこう。
(define x (lambda (y) (lambda (z) (cons z y)))) => #<unspecified>
x => #<CLOSURE (y) (lambda (z) (cons z y))>
(x '(2 1)) = (#<CLOSURE (y) (lambda (z) (cons z y))> '(2 1))
=> #<CLOSURE (z) (cons z y)> [y = (2 1)]
((x '(2 1)) '(4 3)) = (#<CLOSURE (z) (cons z y)> '(4 3))
= (cons '(4 3) '(2 1))
=> ((4 3) 2 1)
>>631, 632
ありがとうございます。動作がわかりました。
自分はDr Schemeをウィンドウズ上で走らせてるんですが、
自分でインプットしてるんですが、どういうふうに動作してるのか
わからなくて・・・ありがとうございました。
string->number, number->string がどーしても上手く実装出来ん。
気が狂いそうだ。うきーっ!
635 :
メロンパン:02/08/04 16:49
>634
いったい何が問題なんだ?
また619なんですが、また質問なんですが・・・
1.(let ((x 2)) (let ((y (lambda (z)(cdr z))))(y '(+ * x x))))
return value, (* x x)
list (+ * x x)のcdrが(* x x)だと理解できるのですが、(y '(+ * x x)のyは何を
あらわしているのでしょうか?
2.(define x (lambda (y z) (cond ((null? z)y)((eq? (car z)y)(cons y z))
(else (x y (cdr z))))))
given: (x 'd '(a c b))
return value, d
(cond ((null? z)y)で、zがnullならyを返して、(eq? (car z)y)はcar zがイコールなら
yをかえすということでしょうか?このあたりが混乱してどう動作しているのかわかりません。
3.(define (map f L)(cond ((null? L) () )(#t(cons (f (car L))(map f(cdr L))))))
return value, (((1) 1) (((2 3)) (2 3)))
これも(null? L) ()),Lがヌルなら、()を返すということでしょうか?
(#t(cons (f (car L))(map f(cdr L))))))は何をあらわしてるかもわかりません・・・
#tとはなにがtrueだったらなのでしょうか?
質問ばかりで、むかつくとは思いますが、あと1週間後にテストなんです・・・
テストの形式は上にあげたような例題を少し変えてテストがでてくるので、
どういうふうに動作してるか理解してないととけないんです・・・
わがままですが、解説おねがいできないでしょうか・・・
>>636 1. y は (lambda (z)(cdr z)) です。2番目の let でバインドされています。
2. こう書くとわかりやすい?
(define x
(lambda (y z)
(cond
((null? z) y)
((eq? (car z)y)(cons y z))
(else (x y (cdr z)))
)
)
)
まず (null? z) をテストして、真なら y を評価して返す。
(null? z) が偽なら、次に (eq? (car z) y) をテストして、真なら (cons y z) を評価して返す。
(eq? (car z) y) も偽ならば、(x y (cdr z)) を評価して返す。
さっぱり意味がわからなければ cond について調べてください。
3.
(define (map f L)
(cond
((null? L) () )
(#t (cons (f (car L))(map f(cdr L))))
)
)
まず (null? L) をテストして、真なら () を評価して返す・・・というか、これはエラーでは?quote してない () は、評価出来ないハズだ。まぁそれはともかく。
(null? L) が偽なら、次に #t をテストして、真であれば (cons (f (car L))(map f(cdr L))) を評価して返す(真であればっていうか、#t は常に真だけど)。
OK?
>>619 かなり基礎的なところで罠にはまってると思われる。
式がどのように計算(評価)されるかを思いっきり簡略化して説明しよう。
簡単にするために、相当厳密さを欠いているから、
このレベルが理解できたら後日改めて厳密な定義を学んでおくように。
1. ' の直後はそれ以上計算されない。そこに書いてあるままの値になる。
2. 数字はそのまま数になる。(その他にもあるけど、今は無視しておけ。)
3. 手続きの名前は手続きそのものになる。
4. 上述のいずれの形式でも無ければ、(X ...) という形式になっているはず。
4.1 ここで、X が特殊なもの、たとえば define とか let とか cond
とか if とか quote とかなどなら、それに応じて ... のところが
それぞれ特別な方法で解釈される。
この特殊なものはは R5RS で syntax として説明されている。
どう解釈されるかも含めて、これは覚えるしか無い。
... の部分は全部計算されたり、されなかったり、
一部だけ計算されたりと、とにかく、特別なやりかたであつかわれる。
3.2 そうでなければ、まず、X の部分と ... の部分(トップレベル)が
いま説明しつつある方法で全部計算される。
この場合、 X は手続き(procecure)になるべきであり、
... の計算結果を引数にして手続き X を呼び出す。
X が car とか cdr とか cons とか、define したモノとか、
それは実は (lambda ...) とおなじものだとか、
さらには(Y ...) という形式でも、これを計算した結果
(Y ...) が手続きになるのなら、このケースにあたる。
1. の霊: '(if a b c) => (if a b c)
2. の霊: 5 => 5
3. の霊: car => #<primitive-procedure car>
4.1 の霊: (if #t 1 2) => 1
4.2 の霊: (car '(a b)) => a
DrScheme v2.0.1 available
SECTION 6 5 6 の件は未だ解決せず。
浮動小数点数を string->number で正しく戻せないケースがあるらしいです。むぅぅ。
ところで、暗黙の force を組み込んだら r4rstest が新たなエラーを出しました。
write でプロミスを表示しようとした時に暗黙の force で値が確定してしまったようだけれど、こういう挙動は不正なんでしょうか?
簡単に言うと例えば次のような場合・・・
(define x 0)
(define y (delay x))
(write x)
(set! x 1)
(write (force x))
・・・最初の write のときに暗黙の force で値が 0 に確定するというもの。
ここは暗黙の force を発動させずに #<promise> と表示させるべきなんでしょうか?どうなんでしょ?
間違えた。こうです。
(define x 0)
(define y (delay x))
(write y)
(set! x 1)
(write (force y))
Dr Schemeって重いんだよね。winのやつなんて他のアプリ立ち上げてると
かたまるときがあるし。それは俺のxpが問題なだけかもしれないけどw
>>642 Cygwin 入れて Gauche にしる!!
DrScheme が重いのは同意。
gaucheねー、グラフィックに慣れてる俺としてはなかなか
むずかしいんだよね。なんせwinマンセーだからw
でもDr Schemeつかっててブラウザ立ち上げると少しの間かたまるんだよね。
メモリ512Mもあるのに。ヽ(`Д´)ノウワーン(´・ω・`)ショボーン
linuxかfree bsdにスキームってはいってないの?最初から。
646 :
デフォルトの名無しさん:02/08/05 05:23
いまどきのLinuxならguileってschemeが入ってるよ。たいがい。
>>645 FreeBSDなら最初から入ってはいないけどportsにあるよ。
cd /usr/ports; make search key=scheme
してみれ。
よさげなのがあったら、Pathで示されたディレクトリにcdして
make install clean
すればよろし。
648 :
デフォルトの名無しさん:02/08/05 07:48
schemeで書いてあるwebのBBSのCGIスクリプトでフリーなものないですか?
649 :
デフォルトの名無しさん:02/08/05 12:22
そのくらい自分でつくれYO!!
>>650 エッセイ2時間かけて読み終えたハァハァ。
色々紹介されてた本買ってみようかな。
string->number と number->stringをちゃんと実装するのって
そうとう大変じゃないかなあ
William D. Clinger
"How to Read Floating Point Numbers Accurately"
Robert G. Burger, Kent Dybvig
"Printing Floating-Point Numbers Quickly and Accuraely"
みたいな論文って、
Scheme以外の世界では書かれてないのか?
>>649 人のコードみて勉強しようと思ったんですが、甘いっすか?
甘ちゃんっすか? 俺ってダメなやつっすか?
...がんばってスクラッチからやってみます。しょぼーん。
どうもありがとうございます。これはGaucheの人の作品ですか。
チャレンジしてみます。
656 :
デフォルトの名無しさん:02/08/07 14:12
SICP第二版(日本語)読んでるんですけど、
3.1.1 の make-account の定義に dispatch が
存在するのは間抜けだと思う人居ませんか?
グローバルシンボルの withdraw を
局所手続き withdraw に変換するため
というのは分かるのですが、
これでオブジェクト指向だと言われても
これではメソッドを追加するたびに
メソッド本体とdispatchを書き換える必要があり、
いまいち美しくないと思うのです。
657 :
デフォルトの名無しさん:02/08/07 14:40
で?
つまり、もうちょい綺麗な書き方無いのかね、ということです。
予想される解答としては
1、すでにOOP向けの改良を組み込んだSchemeが出回ってる。
2、OOPはマクロや定義をいくつか書くことでもっと綺麗に書ける。
(パッケージ化されている)
3、OOPは優れた思想なので、プログラム入門書であるSICPでも
取り上げざるおえなかったが、Schemeは本来OOPに向かない。
とここまで書いて自分で google に scheme oop と突っ込んで
調べ始めたり。
659 :
デフォルトの名無しさん:02/08/07 17:48
>>656 > これではメソッドを追加するたびに
> メソッド本体とdispatchを書き換える必要があり、
Scheme限定の制約じゃなくて、
動的な定義がある言語のインタープリタにおける制約だし…
テーブル登録ルックアップ型よりは素直でしょ。
>>658 > 1、すでにOOP向けの改良を組み込んだSchemeが出回ってる。
実装を見せられなければいいというものでもないし…
Debug時にうっとうしいということは確かだから、
LaTeXのマクロ、C++のtemplateと同様、
解決方法が求められている課題はあるね。
Passed all tests! やたっ!おめでとう自分。
前書いた暗黙のフォース云々は勘違いでした。ごめんなさひ。
>>660 おめでたうございます。
いいなぁ。どんな処理系のソースとか参考にしました?
>>640さんだけじゃなくて処理系作ったことある人に聞きたいです。
(特に最初に作った時に参考にしたもの)
>>661 規模が小さい上にツボをしっかり押さえてる処理系
・mini-scheme
・AM-scheme
・SECDR-scheme
かなり昔の処理系で、作者は全部日本人ですね。
これらはgcも手書き。ただ、ちょっと遅いかも。
最初に参考にするならmini-schemeかと。
>>661 基本的にはあまり参考にしてませんです。
gaucheのソースなんか眺めてみたりしましたけれど、
他人のソースって読みにくい。あまり参考にならなかったり。
それより日本語で書かれたドキュメント類の方が何かと参考になります。
664 :
デフォルトの名無しさん:02/08/09 18:02
>>663 やっぱcellは8バイトですか?
その場合gcのマークフラグはどうするんですか?
>>664 今の自分の実装では、コンスセルを1個作ると・・・えーと・・・32バイト。ヒープを食います。
も少しこのあたり改善しないとだめかなぁ?
666 :
デフォルトの名無しさん:02/08/10 11:45
shemeでソートを勉強したいんだけどどこかいいHPしってる?
バブルソート、クイックソート、などなど。ソースみて、時間かければ
なっとくできると思うんだけど、自分じゃ作れないから。
668 :
デフォルトの名無しさん:02/08/11 00:36
SICP第二版(日本語)読んでみたいと思っているのですが、
ざっと見ただけなのですが、今の自分の知識では無理だと思ったので
これを読みこなすために前提となる知識、または知っておいた
方が良い知識があれば教えて頂けないのでしょうか。
「知識」なら、読み始める前に特に必要は無い。
処理系は用意しといてね。
そいから、一緒にトライしてくれるひとが、身近にいるといいかも。
670 :
デフォルトの名無しさん:02/08/11 01:01
それと陰で支えてくれる女子がいてくれたらうれしいのう
>>669 処理系は用意しといてね
今じぶんが持っているのは、Petite Chez Schemeと、
ChezEditというエディタなのですがこれで良いでしょうか。
>>670 残念ながらいません。おまけにプログラムに興味を持っている
男さえも周りにいません。
俺たちは身近な人ではないが、いつでも質問・雑談・答え合わせに来るがよい。
と勝手にこのスレを代表してみる。
673 :
デフォルトの名無しさん:02/08/11 04:42
\ │ /
/ ̄\ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
─( ゚ ∀ ゚ )< Dr Scheme〜〜〜!
\_/ \_________
/ │ \
∩ ∧∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\∩ ∧ ∧ \ ( ゚∀゚)< Dr Scheme Dr Scheme!
Dr Scheme〜〜! >( ゚∀゚ )/ | / \__________
________/ | 〈 | |
/ /\_」 / /\」
 ̄ / /
典型的な手続き言語厨なので、
どうも思考がついて行かれん。
どしたらLisp頭になれんの?
>>674 例えばどのあたり?
Lispも手続き型言語だと思い込んでみたら?
俺は手続き型が体に染み付いているので、
Lisp(Scheme)を勉強しても、Lispが書きやすいと
思えるようにはならなかったが、C++やJavaのコードが
少し綺麗になった。
もう少し勉強したらLispの方が書きやすくなるのか?
>>675 >>674氏は上記のような状況を望んでいるのだと
思われ。したがってそれでは無意味かと……。
hoge(hage(boge(), bage()), hego(), bego());
>>678 それは…日々 list や lambda と戯れるしか無いんじゃないかな…
Emacs とかで遊んだり、 Scheme の source 読んだり…
680 :
デフォルトの名無しさん:02/08/12 10:59
この間shcemeの問題を教えてもらった、学生です。無事schemeのテストが終わりました。
でも2週間でスキーム教えるのには無理があると思いました。テストでは簡単な
教えてもらったような問題から、バイナリーサーチツリーを書け、括弧がいくつあるか
調べるファンクションを書け、infixをpostfixに直すファンクションを書けなど、
まだたくさんいろんなファンクション書けっていう問題がありましたが、スキームやってた
人には簡単でも手続き言語しかしらない自分みたいな腐れ学生はみごとに・・・
100点中40点・・・平均も40点くらいだったんですが。スキーム恐怖症に少し
かかってしまいましたw
681 :
コギャルとHな出会い:02/08/12 11:03
http://kado7.ug.to/net/ 朝までから騒ぎ!!
小中高生
コギャル〜熟女まで
メル友
i/j/PC/対応
女性の子もたくさん来てね
小中高生大歓迎です
全国デ−トスポット情報も有ります。
全国エステ&ネイル情報あります。
激安携帯情報あります。
682 :
デフォルトの名無しさん:02/08/12 11:48
手続き型厨っていうより、複雑なデータ構造を理解できてるか、
っつーことではないか?
Cとか BASIC (つーても Pureなのしかしらん) とかのいわゆる手続き型
言語だとデータ構造を意識しなくても変数をバリバリつかってなんとなく
toy programなら書けてしまう。
Lisp系言語でもそういうのはできるが、やりにくい (つーかやる習慣がない)。
ので、初期の段階からデータ構造を意識する必要がある。
でかいプログラムを書くときにはどうしてもデータ構造を意識する必要
があるので、Cとかでもそういうのに慣れるのは必要だけどね。
683 :
デフォルトの名無しさん:02/08/12 12:23
そうですね、データ構造のことをすごく意識しろといわれました。
自分実はプログラムはじめて1年目なもので。プログラムは
奥が深いです。
> バイナリーサーチツリーを書け、括弧がいくつあるか
> 調べるファンクションを書け、infixをpostfixに直すファンクションを書けなど、
2週間でこれはきついですね。こういうのでscheme嫌いになる人が出たら残念。
685 :
デフォルトの名無しさん:02/08/12 16:13
質問
GUIと日本語が使えるSchemeって、ありますか?
(Stklosのwinバイナリは、日本語が通らないです)
質問
UnixとWindowsで使えて
GUIと日本語(出来ればUTF8がいいな)が使えて
GPLじゃないバイナリがつくれて
フリーなSchemeって、ありますか?
687 :
デフォルトの名無しさん:02/08/12 19:10
Lisp Patrick Henry Winston とBertbold Klaus Paul Hornっていう本を
人工知能の分野で有名な北野さんがすすめてましたがいい本なんですか?
>>685,686
とりあえず、過去ログ読んでみたら。
689 :
デフォルトの名無しさん:02/08/12 20:53
lispの問題ではないのかもしれませんが、
;; elisp
(* 1.4 1.4)
1.9599999999999997
;; gauche
gosh> (* 1.4 1.4)
1.9599999999999997
という結果になるのは何でですか?
guileだと
% guile -c "(display (* 1.4 1.4)) (newline)"
1.96
なんですが。
>>690 浮動小数点数の演算で演算誤差が発生して、1.4 と微妙に値が異なってしまうためです。
(= 1.96 (* 1.4 1.4))
ってやってみてください。これが #f なら、(* 1.4 1.4) は 1.96 ではないので、1.96 と表示されるのは誤りです。
訂正
誤:演算誤差が発生して、1.4 と微妙に値が
正:演算誤差が発生して、1.96 と微妙に値が
>>691-692 elisp と gauche はもともと 1.9599... なのでもちろん nil, #f でしたが
guile でも
% guile -c "(display (= 1.96 (* 1.4 1.4)))(newline)"
#f
となりました。ちょっと不思議。
誤差ですか。emacs を電卓代わりにしてたんですが小数の計算には向いていな
いですね。
694 :
デフォルトの名無しさん:02/08/12 23:40
つーか、浮動小数点をイコールで比較すんのは間違ってる気が。
>>693 いわゆる浮動小数点数で誤差が発生するのはある意味常識・・・ご存知ない?
そもそも 1.4 は浮動小数点数で正確に表現出来ないんです。
なんでguileだと中途半端にうまくいくんだろう?
表示精度と内部保持精度が違っていて、四捨五入してごまかしてるとか?
(だったら 1.960000... とでもしてほしいが)
内部精度全桁表示させる方法はありますかね?
>>694 検証実験で = を使ってるだけでは。
698 :
デフォルトの名無しさん:02/08/13 21:39
なんで数値だけ特別扱いなんだよ。
他の言語では小数点付きと整数は別扱いになってるだろーが。
DrSchemeについてくるゲームとかってどうやって遊ぶの?
普通にopenしてexecuteボタン押しても何も起こらないし。
↑ここで聞かずに作者に聞けよ。
702 :
デフォルトの名無しさん:02/08/13 23:18
>>701 気付かないアホがいるとは思わんかった(藁
>>700 作者に聞く前にマニュアル読めよ。
まあ、英語なのが問題なんだろうけど。つーわけで
>>699 うちでは、拡張子が ss なファイルをopenしてexecuteすれば、
blackjackやmineは行けますが?(OS:Win2000)
PLT\collects\game\games.ss はランチャですね。
705 :
デフォルトの名無しさん:02/08/14 23:21
おまえら、相変わらずLISP自作してんのか。
結構なこった。
おれにも、作り方教えテクだ才!
706 :
デフォルトの名無しさん:02/08/15 03:02
gcにmark&sweep(新規メモリが必要になったときcopygc)を使うという前提で、
・1つのセルに(carとcdrで)8バイト使う処理系
割り当てるメモリ領域は1つで、
gc用マークフラグは別領域にビットマップを作る。
と、
・フラグ&マーク用にもう数バイト(=アラインメント制限で12バイト)を使う処理系
割り当てるメモリ領域は複数ブロック(セグメント単位)
では、
速度にどれぐらいの差が出そうですか?
今mini-schemeとここの過去ログを参考に、後者で作ってるんですが、
前者の方が速いのかなー、とか色々悩んでおります。
後者(mini-scheme)はおそらく、16bitのDOS環境でメモリ確保できる様に、
セグメント単位に分けたと考えられるんですが、わたしが動かす環境は
主にwindowsなので、あんまり意味ないかなと思いました。
ただ、新規セグメントの確保は、後者がオブジェクトの移動が無いので
速そうだなと、この辺りで速度差が出ないか気になっております。
mark-and-sweepよりstop-and-copyの方が良くない?
というか、セルとポインタには後者で、大きめのメモリには前者で使い分けるのが
手軽でよさそう。
>>707 お早い回答ありがとうございます。
この辺はなんだか複雑なので、どちらかで一元化出来ないものかと考えて
おりました。
vectorやstringなどを別領域に取るのは良いアイデアですね。
前者のみを使うとなると作りはシンプルになりそうですが、
毎回copygcを呼ぶのは速度的に不利な感じなので、セル単位など、
連続領域が必要にならない間はmark&sweepを使う事を考えております。
(それでも足らなかったら大きめの領域を確保してcopygcを使う。
この辺が2度手間で逆に遅そうですが。)
709 :
デフォルトの名無しさん:02/08/15 03:26
Generational Copy GCを使えばそんなに遅くならないって
Appelちゃんがいってたよ。
あと、再帰的な参照をされたvectorオブジェクトについても悩んでおります。
これはmini-schemeでは解決されていませんでした。
(そもそもmini-schemeにはvectorが存在しない。)
#(#(#(#(#(#(#(....)..)..)..)..)..)..)
この様な非常にネストの深いvectorオブジェクトの各要素のマーク
を考えると、mini-schemeで使われている、クヌースの非再帰マーク
アルゴリズムそのままでは対処できないとわかりました。
(素直にvectorのmarkを再帰関数で組んでしまうとスタックオーバーフローしてしまう。)
今のところ、vectorオブジェクトにgc専用のvectorのチェーンポインタを付けて、
vectorの要素全部を後でいっぺんにマークする(意味伝わるかな・・)方法を考えて
いますが、他に良い方法はあるでしょうか。
>>709 世代別コピーgcは難易度が高すぎて、自分はいまだ理解できずにいます。
理屈を考えると速そうなのは解るんですが・・・。
頭痛くなってきたのでもう寝ます。
gauche(0.6.1)@cygwin が、windows版バイナリでとってきた emacs-21.2 の
M-x run-scheme でうまく動かないんだけどうちだけ?
cygwin でコンパイルした guile-1.4.1 だとちゃんと動くんだけど。
結局両方作って比較することにしました。
時間があればですが。
715 :
scheme 小僧:02/08/16 17:45
>R5RS的にもエラーが正しい。
って書いてありますね。
gauche の場合は「手抜き」のせいでエラーにならないんでしょう。stk は知
らないけど。
そもそも変数を定義するのに define は普通使わないと思いますが、、
>通らないと結構面倒くさいのですが、let* を使えってことでしょうか。
というのは何で?
>>716 > >R5RS的にもエラーが正しい。
> って書いてありますね。
やっぱし、そうですか。ありがとうございました。
> そもそも変数を定義するのに define は普通使わないと思いますが、、
> >通らないと結構面倒くさいのですが、let* を使えってことでしょうか。
> というのは何で?
どうも、C などになれちゃっているせいか、先頭で define して
名前を与える方が見易く思ってしまうんですよね。
let だと一段括弧が深くなるというのもありますが、もしかしたら
emacs 使っているので色がつくからかも知れません。
let でも束縛する識別子に色をつけてくれないかなぁ。
>>717 私も全部 define で済んだ方が嬉しいな…
今は letrec* とか書いて使ってるけど…
719 :
デフォルトの名無しさん:02/08/17 00:39
>>718 letrec*ってどういう挙動?
普通にlet*で関数書いておけばいいんじゃないの?
internal definitionは letrecと等価だからね。 初期値を求めるのにそこで bindする変数の値を使ってはいけない罠。 おれもめんどうだなあ、と思ったことあるけど。 それにしても letrec* は初耳。
721 :
デフォルトの名無しさん:02/08/17 01:20
話が逸れるが、letの原型がlambdaだから、
let*の関数版(引数を左から右へ評価する)lambda*ってのも、
あって良いんじゃないかと思う。
>>721 どうやって展開すんの?
((lambda*(a b c) ...) x y z)
↑みたいにインラインで書かれたらマクロ無理だよね?
723 :
デフォルトの名無しさん:02/08/17 01:32
↑そうだった。
最低名前でアクセスする必要がありそうだな。
無名マクロが記述できれば便利なんだが。
725 :
デフォルトの名無しさん:02/08/17 01:39
726 :
デフォルトの名無しさん:02/08/17 01:48
>>725 書いた本人ですが、
ちょっと前のここの過去ログにhtml->sexpr, sexpr->htmlがあります。
一応可逆変換可能です。(コンテンツによっては不完全。)
まあ参考程度にはなるかも。
もうちょっと本格的にやりたいならDSSSLを勉強するとか。
728 :
デフォルトの名無しさん:02/08/17 02:20
Part4はなんか荒れてるな
>>719-720 let* だと再帰する関数が書けないから、それにだけ対応させてみた自作 macro。
複数関数の相互再帰には対応できてないけど、少しは便利。
>>724 > ここの set! の説明に letrec* が登場するけど、ミス?
文脈的に、ミスだと思う。
730 :
デフォルトの名無しさん:02/08/17 11:24
Jakartaが混乱するjava世界のゆるやかなベクトルになってるよう。
Schemeでも、こんなのをつくるってどうよ。もちろん、一つに収斂
させるんじゃなくってね。
賛同してよん。
やだ
732 :
デフォルトの名無しさん:02/08/17 18:15
>>730 インドネシアの首都ジャカルタ
が、どうしたって?
サムイネタでageんなよ…
734 :
デフォルトの名無しさん:02/08/17 18:25
ジャカルタはカルタの進化した形
735 :
デフォルトの名無しさん:02/08/18 04:16
evalんじゃねえ!
736 :
デフォルトの名無しさん:02/08/18 04:54
eqんじゃねえ!
>>713 こちらは Meadow だけど、 .emacs で
(setq scheme-program-name "C:/cygwin/bin/gosh.exe -i")
みたいに -i をつけるとうまく動くよ。
一つお伺いしたいことがございます。
このスレで何回か話題に上っている
SECDR-scheme
というものを拝見したいのですが、検索しても
発見できません。
よろしかったらお教え願えませんでしょうか。
お願いします。
739 :
デフォルトの名無しさん:02/08/20 17:35
>>738 以前、niftyのFPLにありました。
たしかインターネットからでもダウンロード可能だと思います。
>>739 さん
お教えいただきありがとうございます。
>以前、niftyのFPLにありました。
>たしかインターネットからでもダウンロード可能だと思います。
もしかして、niftyの会員にならないとダウンロードは不可能
ということはございませんか。
ttp://www.nifty.ne.jp/forum/fpl/ には以前伺ったことがございましたが、どうしても発見できませんでした。
折角お教え頂きましたのに、ご好意を無為にするようなことを
書き込んでしまい、すみません。
(define (kar pair)
(apply (lambda (x . y) x) pair))
(define (kdr pair)
(apply (lambda (x . y) y) pair))
> (kar '(1 2))
1
> (kdr '(1 2))
(2)
>>741 (define (kons x y)
`(,x . ,y))
>>741 ほう! car, cdr はプリミティブ手続きではなくライブラリ手続きだったのか。
consもか・・・なるほどなるほど。そんなこと思い付きもしなかったな。凄い凄い。
746 :
デフォルトの名無しさん:02/08/21 02:39
龠 λλλλλ....サザエサーンハ ユカイダナー
748 :
デフォルトの名無しさん:02/08/21 20:25
749 :
デフォルトの名無しさん:02/08/23 07:45
lisp使って自動プログラミングさせたりとかやってる人いません?
要件入れると適当なコードが出てくる様なやつ。
そこまですごいことはできないのかな。
自動プログラミングって何?
つーか自動プログラミングなら要件なんか入れないで自分で考えるだろ。
guile-emacsってどうやってmakeするのさ…
753 :
デフォルトの名無しさん:02/08/24 13:09
guile-emacsの、作者に聞け
754 :
デフォルトの名無しさん:02/08/24 14:55
Schemeなんて時代遅れ。これからはRubyだね。
755 :
デフォルトの名無しさん:02/08/24 15:47
lispとschemeってどこが違うの?schemeはlispの方言っていわれてるけど。
たぶん、そんな話題既出だと思うけど。
で、schemeだとdr schemeやGaucheなどの処理系あるけど、lispの場合、
どんな処理系があるの?windowsでcommon lispの処理系ってあるの?
clisp
Alleglo Common Lispもなかったっけ
758 :
デフォルトの名無しさん:02/08/24 16:44
じゃあunixのlisp処理系はナニがある?
アレグロ馬鹿高いので、だめぽ
760 :
デフォルトの名無しさん:02/08/24 16:53
フリーが(・∀・)イイ!!
762 :
デフォルトの名無しさん:02/08/25 00:20
cmuclマンセー
764 :
デフォルトの名無しさん:02/08/25 01:28
Franz Lisp
765 :
デフォルトの名無しさん:02/08/25 01:30
gcl
clisp
>>766 「日本人覚醒計画」もいいですね。
( ゚д゚) < 日本人が嫌いだ。
768 :
デフォルトの名無しさん:02/08/25 13:16
common lispっつーのは何?結局処理系なの?
769 :
デフォルトの名無しさん:02/08/25 13:26
sbclは?
http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/#continuation (define-syntax while
(syntax-rules ()
((while test break continue body1 body2 ...)
(block break
(let loop ()
(cond (test
(block continue
body1 body2 ...)
(loop))))))))
上のページにあった break continue 付きの while マクロを改造して break
と continue を引数で渡さなくてもいいようなマクロを define-syntax で書
くにはどうするんですか? define-macro だったら
(define-macro (while2 test . body)
`(block break
(let _loop ()
(cond (,test
,@body
(_loop))))))
でいいと思うんですが。(gensym してないので手抜き)
;; block は上のページに載っているマクロです。
あ、すみません。何も考えずにコードのっけちゃいました。
上のやつは例の URL にあるやつそのままなので、そのサイトのやつを見てく
ださい。
あ、while2 とかなってるし…。それと下のマクロですが break のことしか考
えてなかったの忘れてました。break しかできません。
773 :
デフォルトの名無しさん:02/08/25 16:05
continue/break付きwhileは過去ログにあるよ
>>773 すみません、過去ログ調べてませんでした。
Part1 にある define-macro で書いてあるやつですよね。
define-syntax と syntax-rules では break のようなキーワードを使うマク
ロをどう書くんだろうと思って、cond のマクロ定義などを参考に考えていた
んですが分からなかったので質問したんですが。syntax-rules は難しいです
ね。define-syntax 使う人はあまりいなんでしょうか?
>>771 R4RSの低水準マクロの例に載ってる loop-until-exit を改造すればいーんじゃない?
>>774 syntax-rulesでは無理です。シンボルは呼び出し側から入力しないと、衝突を回避するために改名されちまいます。
>>776 そうなんですか。cond の else みたいに syntax-rules の引数に渡せばでき
るのかと思ってました。
できないんであればおとなしく define-macro を使うことにします。
>>777 else は束縛されてないから・・・
let の変数リストや lambda の引数リストでレキシカルに束縛すると、それを参照する識別子とトップレベルを参照する自由な識別子は別物になってしまうのです。
・・・・gensymって何?
780 :
デフォルトの名無しさん:02/08/26 05:40
ユニークなシンボルを生成するんだよ、ぼけ。
781 :
デフォルトの名無しさん:02/08/26 13:00
syntax-rule/case使いこなしてる人いる?
なんかどう見てもdefine-macroのが簡単なんだが・・・
rule/caseのアドバンテージって、インテリジェントな
シンボル衝突回避ぐらいでしょ?
define-macro を調べてて疑問に思いました。
とりあえず実用価値のない簡単な例ですが・・・
(define foo (lambda () 1))
(define-macro bar (lambda (x) (foo)))
これで (bar) とか書けば 1 に置換されるんですよね?
つーことは define-macro のマクロ展開って、実行時に毎回やるんでしょうか?コンパイル時に1度だけではなくて。
えーと、つまり、コンパイル時に展開しようとすると、foo はまだ代入されてなくて、評価出来ないということになりません? foo は定数だと見破って定数伝搬最適化かければいいんでしょうけど、だったらこういう例は・・・
(define x (read))
(define foo (if x (lambda () 1) (lambda () 2)))
read が行われるのは当然実行時だから、それまで foo は定まらない → コンパイル時には展開できない → 実行時に展開ということになるのですけれど、理解あってます?
>>782 ;; 間違ってるかもしれないのであまり信用しないでちょ…
実際に実行してみましたか?この場合 bar は引数を 1個要求するのでは?
で、compile のできる処理系では多分 compile 時に macro 展開しますが、
(bar #f) ;; とか書いてあるところを
(foo) ;; という形に書き替えるだけなので、
その時点で foo が定義されていようといまいと問答無用に展開するのではな
いでしょうか?
> 実際に実行してみましたか?この場合 bar は引数を 1個要求するのでは?
あー、うー、ええと、ご指摘通り、実際には実行してみてません。間違ってるかも。
手元に define-macro の使える処理系がちょっと無くて・・・gaucheなら使える?入れてみよかな・・・
あのコードはその場の思いつきで書いたので適当です。言いたいことが伝われば。
自作の処理系に実装するのに、どういう形にするのがいいかなと考えてるです(まぁコンパイルといってもバイトコードです)。
・・・今思い付いた。Lisp の defmacro も調べてみよ。
>>782 実はそれがdefine-macroの暗黒面なのです。
コンパイルパスと実行パスが分離している場合、macro transformer内からは
実行時の束縛を参照してはいけないのです。
しかし、トップレベルフォームを逐次実行してゆく実装のインタプリタなら、
コンパイラがそのマクロを展開する時点で既に定義されている実行時束縛が
参照できてしまうので、782のような例は通ります (展開は、マクロ呼び出し
barを含むフォームがコンパイルされるときに一回だけ行われます)。
R5RSのsyntax-rulesはそういうこと(コンパイル時評価と実行時評価の混合)
ができないようになってるんで、そういう意味では「正しい」のですが、
その制限がきつすぎると感じる時もあります。
インタプリタでの動作とコンパイル時の動作を合わせることに心血を注いだ
CommonLispでは、eval-whenフォームを使ってどのフェーズでフォームが
実行されるか明示するのが普通ですかね。
Scheme界ではこの問題はもう20年くらい議論してて決着がついていない
んじゃないでしょうか。(だから標準のモジュールシステムが決まらない…)
今度のICFPでもそのへんを扱った論文が出ます。
http://www.cs.utah.edu/plt/publications/macromod.pdf
786 :
お願いします:02/08/27 08:57
すみません。Schemeで
微分のプログラムを考えているのですが、全然分かりません。
<内容>
3x^2+2x+1を '(1 2 3)と入力して、
答えの 6x+2を (2 6)
と出力したいのです。
Schemeを勉強し始めたのは良いのですが、
微分について考えろといわれ、わけがわからなくなってしまいました。
フィボナッチとか、ハノイの塔は理解できたのですが・・・。
くだらない質問ですみません。参考にしたいのでソースを下さい・・・。
SICP のどっかにあったよ。
>>787 探しているんですが、全然見つかりません。
微分って「Differentiation」で良いですよね?
>>786 SICP2.3.2か?日本語版だと簡単に索引から見つかったが。
SICPと違う入力形式を望んでいるようだが、その入力形式だと
carの 1 を見てもそれが係数が 1 であることしか分からず、
本当に知りたい ^2 の部分の情報はリストの終端まで見て長さを知るまで
分からないのでややこしいのでは?
入力仕様を変えるか、入力はそのままで内部で '((1 2) (2 1) (3 0)) などに
変換しておくかした方がいいのでは。
790 :
デフォルトの名無しさん:02/08/27 10:36
微分は分かるのか?
'(1 3 5 7 11)→'(3 10 21 44)睨めばすぐわかるだろ?
>>786 Common Lispでよければ。
(defun differential (x)
(nreverse (maplist #'(lambda (x) (* (car x) (length x))) (reverse (cdr x)))))
後半誤解でした。すみませぬ。
皆さん、ありがとうございます。
先ほどから考えてはいるのですが、中々解決しません。
ですが、SICPなどで調べながら、何とかやってみます。
>>790 微分の問題などは苦手ですが、
一応、概念は分かっているので何とかなると思います。
>>789 入力形式も変えてやってみたいと思います。確かに不便そうなので・・・。
>>791 ありがとうございます。参考にさせていただきます。
たびたびすみません。
「SICP2.3.2」の例題をを実行したいのですが、
(deriv exp var)にどのように入力すれば実行できるのでしょうか?
>>794 宿題スレじゃね─ぞ! (゚Д゚)ゴルァ
2.3.2を全部読むと載ってますよ。
(deriv '(* x y) 'x)
とか。
# 英語版辛そう。がんがってください
>>795 >>792
>>797 いや、それが書いてある通りに(deriv '(* x y) 'x)
とか入力しても、動かないんです。
reference to undefined identifier: variable?
と言われます。
DrSchemeを使ってるんですが・・・。
宿題スレじゃないけど、lisp独習者の助けや自分の勉強にもなるだろうと
思って答えてるが、このレベルの質問はこれで最後ね。
典型的な 教えて君 的質問をされたので。
だから、2.3.2を全部読んでから来てくれ。SICPってそういう本なの。
いわゆるトップダウン方式の開発だから、下位の手続きが実装されるまで
実行できません。
> reference to undefined identifier: variable?
これも読めないのに英語版読むとは。日本語版買ったら?
defineされてない識別子 variable? への参照がある、って意味ね。
>>800 すみません。出直してきます。
ありがとうございました。
こんなのでしょ。
だれか末尾再帰になおして。
(define (deriv f)
(define (loop f n)
(cond ((null? f) '())
((= n 0) (loop (cdr f) 1))
(else (cons (* (car f) n) (loop (cdr f) (+ n 1))))))
(loop f 0))
> (deriv '(1 2 3))
(2 6)
803 :
デフォルトの名無しさん:02/08/27 23:01
>>802 ホレ
(define (deriv f)
(define (loop f n r)
(cond ((null? f) (reverse r))
((= n 0) (loop (cdr f) 1 r))
(else (loop (cdr f) (+ n 1) (cons (* (car f) n) r)))))
(loop f 0 '()))
これぐらい自分でできる様になれよ
ちなみにおれは5秒で変換できた。
804 :
デフォルトの名無しさん:02/08/27 23:06
ちなみに動作確認含めて30秒
まあ、自慢にはならないか。(/・ω・\)ショボーン
805 :
デフォルトの名無しさん:02/08/27 23:11
現役schemerならコンマ秒で変換できるだろうな。
宇宙刑事の蒸着並。
変数名を考えるのに 5 分以上かかった。
できなくてスマン。
808 :
デフォルトの名無しさん:02/08/27 23:41
>>807 そう落ちこむな。
末尾再帰変換はある程度パターンがあるから
そのうち一条寺烈にもなれるよ。
809 :
デフォルトの名無しさん:02/08/28 01:51
car とcdrってどう読むの?カーとシーディーアールでいい?
802 -> 803 のような変換は簡単だけど
意図が分かりにくくなるように感じて
自動的にやってくれないかなあと思うことがあります。
そんなことないですか?
申し訳ないので他のやり方で作ってみました。
(define (deriv f)
(let loop ((f (cdr f)) (r '()))
(cond ((null? f) (reverse r))
(else (loop (map (lambda (x) (+ x x)) (cdr f))
(cons (car f) r))))))
>812
微分になってないよ。
(define (deriv f)
(do ((f (cdr f) (cdr f))
(g (cdr f) (cdr (map + f g)))
(r '() (cons (car g) r)))
((null? f) (reverse r))))
814 :
デフォルトの名無しさん:02/08/28 16:20
scheme理解するのに微分積分って知ってる必要ありますか?
たぶんありません。
>>814 一般常識としては理解する必要あります。
817 :
デフォルトの名無しさん:02/08/28 16:29
関数言語っていうだけで、f(x)みたいなのはしらないとできないんですよね?
いや、当方shcmeってあんまり何か知らないんですが。そもそも関数型言語って
なにか知らないから。f(x)みたいなことですか?関数型言語って
「f(x)みたいなこと」とは何を指してるのか?
>>818 まあそういうなや。
>>817 は工房とかかもしれんし。
手続き型言語を教える前に関数型言語を教えろって話もあるくらいだし……。
だけど、厨房工房(あるいは文系)向きのscheme入門書ってあるかな?
複素数や関数を例題として使ったりしないヤツ。
そういうのは関数型の魅力が伝わらないから難しいかな。
Schemeにおとといから参戦しました。よろしこ。
現在、おそらく初心者のだれもがつまづく(それとも俺だけ?)
「評価」を勉強中。
リストのボックス表記ってぱずるみたいでおもろいです。
Scheme で「(f x) みたいなこと」を覚えました。
やる気と普通の脳味噌があればできる。
823 :
デフォルトの名無しさん:02/08/28 23:28
リアル厨房です
>>820 入門書としていいのはscheme手習いでしょうね。ってもう絶版?
リスト遊びはどうかな。elispだけど。
827 :
デフォルトの名無しさん:02/08/30 00:22
>>825 つーかさ、そう言うときは図書館利用しろよ。
入門書ならなおさら。絶版でも結構置いてあるよ。
828 :
デフォルトの名無しさん:02/08/30 12:50
がんばって読んでみるよ。
SICPはどこまで読んだかわからなくなったし。
831 :
デフォルトの名無しさん:02/08/31 08:40
>>828 ソレ16ページしかないよぉ。
全部は読めないの?
821にてカキコしたものです。
現在、森北出版の「Schemeによる記号処理入門」にて勉強しておるのですが、
p39のスタックの説明でつまずいております。
ぽっぷの説明で、
(define (pop)
(cond ((null? *stack*) 'empty)
(else ((lambda (x) (set! x (car *stack*))
(set! *stack* (cdr *stack*))
x) '() ))))
これで変数 x がunboundであるというErrorがでます。
(CheSchemeを使用)
確かに、xは未定義ですよね。
みなさんだったらどのようにpopの実現をおこないます?
>>832 やりたい事が良く分かんないけど…こんな感じ?
(define (pop)
(if (null? *stack*) 'empty
(let ((x (car *stack*)))
(set! *stack* (cdr *stack*))
x)))
>>832でもいいように思うけど・・・
局所変数はset!で変えられないの?
(define (pop)
(if (null? *stack*) 'empty
((lambda (x) (set! *stack* (cdr x)) (car x)) *stack*)))
もうひとつ*stack*は消せたか。
(define (pop)
(let ((x *stack*))
(cond ((null? x) 'empty)
(else (set! *stack* (cdr x)) (car x)))))
833さん、834さんどうもありがとうございます。
834さん、これだと思うとおりにうごきました。ありがとうございます。
>832でもいいように思うけど・・・
それがErrorがでるんですよ、SCMでもためしてみたんですが...
833さん、および834さんの835での回答ですが、
Letはまだ学習していない項目ですので、
そこをみてからためさせていただきます。
とりあえず先に礼をいいます。ありがとうございました。
>>836 うちのSCMだと832でうまくいったよ。
なんでだろうねえ。
う、漏れのうちまちがいか??
だとしたら、おお騒がせのおおばかもんか?おれ。
839 :
デフォルトの名無しさん:02/09/02 12:01
'cons'の語源って、もしかしてconcentrationですか?
あ、でも綴りが違う。
>>831 How to design programsを読むなら、
http://www.htdp.org/ から。
>>828 のは、論文か何か。内容は、
SICPは、色々な問題、プログラム、概念について書いてあるけど、
問題に対してどのようにプログラムを作っていけば良いのかについては
書かれていない。
SICPで扱われている問題の多くは数学や工学の特定の領域の知識が必要なので、
初学者はプログラムの事より数学とかの部分に時間を使わなければならない。
で、プログラムの問題と特定領域の知識の話をごっちゃにしてしまう。
みたいな感じかな。
842 :
デフォルトの名無しさん:02/09/02 13:24
>>841 そこがSICPの面白いところだと思うが、それが邪魔なことも確かにあるわな。
"How to design programs"もよく出来てるな〜。
constructでしたか。
ありがとうございました。
844 :
デフォルトの名無しさん:02/09/03 00:35
lispで一行野郎ってないよな
例えばコマンドラインから-eで引数文字列を評価することにして、
lisp.exe -e "((lambda 〜)....)" < hoge.txt
とかさ
できなくはないんだろうけど、括弧とキーワードだけでかなり取られるし
845 :
デフォルトの名無しさん:02/09/03 00:37
Lispで使い捨てのプログラムを作らない。
>>844 one linerが書き易い言語は、規模の大きなプログラミングには
向かない傾向があるんじゃないだろうか。AwkとかPerlとか。
847 :
デフォルトの名無しさん:02/09/03 12:09
Gauche 0.6.2 age
848 :
デフォルトの名無しさん:02/09/03 20:10
schemeってなんでクソ長い名前の関数ばっかりなの?
string-refとか良く使いそうなのまで長いよ。
だれか短い名前考えて
(define strcpy string-copy)
(define strlen string-length)
(define strcat string-append)
こんなんでどう?
(define sr string-ref)
エディタで補完できれば問題なし
>>849 C言語かよ!
でもいいねそれ。
>>850 srじゃわけわかんねえよ
だいいちstring-set!はどすんだよ・・・ss!かよ!
strref
strset!
・・・も、いいやこれで。
>>851 補完つっても、区別できるまでの入力は必要でしょ?
長い名前は生産性を落としてる気がするのよ。
↓他に考えた名前。
with-input-from-file -> wiff
with-output-to-file -> wotf
substring -> substr
lambda -> la
define -> de
define-macro -> dm
わ、切れてるよ・・・
↓他に考えた名前。
with-input-from-file -> wiff
with-output-to-file -> wotf
substring -> substr
lambda -> la
define -> de
define-macro -> dm
続き
begin -> seq
display -> disp
newline -> eol
write-char -> putc
read-char -> getc
(display ...)(newline) -> (puts ...)
(la()...) -> (la0 ...)
続き
char=? -> ch=
char-ci=? -> ci=
integer->char -> i2c
list->string -> l2s
number->string -> n2s
いちいち矢印書くのはめんどい。
ネタ切れ。
>>855 それね、実際やるとバグだかなんなんだか
わかんなくなるよ。(eval改造して実験済み)
最後。
単純に名前置き換えしただけだと、
あとでre-defineされたときに別扱いになってしまうので
そういう可能性のある関数名は次のマクロで別名定義する。
(SLIBのtranscriptなどは入出力系関数の上書きを行う為)
(dm (alias . l)
`(de (,(car l) . args) (apply ,(cadr l) args)))
(alias disp display) ; -> (de disp(la args(apply display args)))と同じ
(alias eol newline)
(alias getc read-char)
(alias putc write-char)
859 :
デフォルトの名無しさん:02/09/03 22:07
>>852-854 ええとね・・・いい加減、暗号じみてるから、やめたほうが・・・・
la とか de とか dm とか意味わからん。
>>858 toplevel で define するんじゃなくて、 local に置き換えた方が便利そう。
名前がどんどん長くなってくのは、文脈とかの概念が使えないからだと思うし…
全体でやられると、本当に暗号になるからね…
名前空間が、もっと色々いじれたらいいんだけど…
>>860 昔懐かしウィルオ・リスプはde,dmだったよ。たしか。
863 :
デフォルトの名無しさん:02/09/03 23:08
つきつめるとTECOになるわな
そんでTECOでLispの処理系とかかいてください
いっそのこと、全部中置記法にして、文字セットも独自にして
記号をいっぱい増やして重ねうちとかできるようにすれば....
866 :
デフォルトの名無しさん:02/09/04 03:26
Alleglo Common Lispってお値段はいくらぐらいなんですか?
使ってる人います?
お値段は7桁中程です
くだらないレスしかつかなくて悲しいよ
870 :
デフォルトの名無しさん:02/09/05 02:16
>お値段は7桁中程です
マジですか!!
会社でも買えないっすよ。
そりゃLISPが広まらないわけだ・・・
(define (広める たくさんの人 Lisp)
(if (>= お値段 7桁中程) '広まらない
(begin (広める 隣の人 Lisp)
(広める (- たくさんの人 隣の人) Lisp))))
www.schemers.org がいつもと違うのは何で?
874 :
デフォルトの名無しさん:02/09/05 14:05
使ったこと無いんでわからないんですが、
括弧の対応関係を表示できるエディタって、'#\('みたいなエスケープされた物
もちゃんと考慮されるんでしょうか?
ものによるんじゃない。
↑そんな解答だれにでもできると思う
877 :
デフォルトの名無しさん:02/09/05 15:33
>>874 xyzzy0.2.2.227のLispモードは考慮してくれますた。
gvim(vim6.1.41)のは不完全ですた。
色はちゃんと付けてくれるものの、
対応する括弧へのカーソル移動の挙動が不審ですた。
いつの間にか gauche-0.6.2-1 の deb がある。(゚д゚)ウマー
879 :
デフォルトの名無しさん:02/09/05 16:17
今一番活発なのはGaucheの作者かな
gaucheの.debってinfoがdirに登録される?
登録されない時ってどうすればいい?
>>881 install-info(1)でどう?
883 :
デフォルトの名無しさん:02/09/05 22:22
SCMのソース解析してるサイト(↑にあった)見てて思ったんだけど、
結構有名な処理系(Guileも)なのに多少無茶なリストを読ませると
ガベコレの段階で落ちるっぽいね。これはソースからの推測だけど、
スタックオーバーフローを起こす可能性が残ってる。
スタックレスなgc作るのって大変かな?
884 :
非似lisper:02/09/07 00:59
>>883 スタックレスにするのはそんなに難しくないよ。
昔、仕事用にスタックレスなgc作った。
ヒープ側のメモリ枯渇以外では止まることは無いと思う・・・多分。
組みこみ用途の全天候型lispなんで、ハード的なスタックはほとんど使わない作り。
gc時にメモリ消費するのは多少ナンセンスなんで、その辺どうするか迷ったね・・・。
885 :
デフォルトの名無しさん:02/09/07 13:05
文字列をリストにする関数って、何でしょうか?下の最後に
「2」を出したいんですが。
-------------------------------------------
(define s "(1 2 3 4 5))
(define l (文字列をリストにする s))
(cadr l) => 2
-------------------------------------------
(string->list)だと、ひと文字づつのリストになるんですね。Gauche
を使ってます。
>>885 文字列は文字の列だから、listにすれば文字のリストになるのが
自然だわな。
入力が常に「数値のリストの文字列表現」であると想定できるなら
(define l (read-from-string "(1 2 3 4 5)"))
(cadr l) => 2
887 :
デフォルトの名無しさん:02/09/07 14:33
>>886 ありがとう!
(read-from-string)、完璧です。
>>886 (de(read-from-string s)(wifs s(read)))
;with-input-from-string --> wifs
(read-from-string s)よりも、(wifs s(read))の方が短い。
わかるか?
あ、感じ悪い書き方。
すまん。
ちなみに
(dm (wifs s . body)
`(with-input-from-string ,s(la0 ,@body)))
gosh> (de(read-from-string s)(wifs s(read)))
*** ERROR: unbound variable: s
Stack Trace:
_______________________________________
0 (read-from-string s)
At line 1 of "(stdin)"
gosh> (dm (wifs s . body) `(with-input-from-string ,s(la0 ,@body)))
*** ERROR: unbound variable: s
Stack Trace:
_______________________________________
0 (wifs s . body)
At line 4 of "(stdin)"
>>888 > (read-from-string s)よりも、(wifs s(read))の方が短い。
(rfs s)の方が短い。
わかるか?
あ、感じ(略
俺言語は自分の世界に引き込もって使え。
あ、感じ悪い書き方。すまん。
896 :
デフォルトの名無しさん:02/09/08 19:45
>(sizeof 'RECT)
=>16
>(sizeof 'RECT 'left)
=>4
>(typeof 'RECT)
=>(RECT (LONG left) (LONG top) (LONG right) (LONG bottom))
>(typeof 'RECT 'left)
=>(LONG 4)
>(offsetof 'RECT 'top)
=>4
こういうのあったら便利だと思うけど、どう?
そもそも 'RECT って何さ。
RECT = 長方形としても
>>896 はとっても意味不明なんですけど。
シンボルの使い方とか間違ってるんだな。とりあえず。
それはいいとしても名前が意味不明。長さを示すのか座標を示すのか分からない。
お望みのコードを書いてやろうとして詰まった(藁
;;↓SICPっぽいかな?
;(rect-S '(2 4 8 7))とかやると(2,4)と(8,7)を頂点とする長方形の面積が出ます
(define rect-x1 car)
(define rect-y1 cadr)
(define rect-x2 caddr)
(define rect-y2 cadddr)
(define (rect-width rect)
(- (rect-x2 rect) (rect-x1 rect)))
(define (rect-height rect)
(- (rect-y2 rect) (rect-y1 rect)))
(define (rect-S rect)
(* (rect-width rect) (rect-height rect)))
>>900 ネタ? どうやったらそんな勘違いができるのか・・・
どう見たって
>>896は構造体の情報を得るものだろ。
903 :
デフォルトの名無しさん:02/09/09 10:11
>>901 趣味:2ch 特技:煽り
ですか? ちょっとCを知ってるからって何をやってるんだか。
>>902 バイナリファイルやAPIとのアクセスがスムーズなものが欲しいんじゃないかな。
自分も欲しいので考えているんだが・・・・・・はて?
scheme で perl のハッシュみたいなのを実現するには
どうしたらいいんでしょうか。
(hash-set! ハッシュ名 キー 値)
(hash-get ハッシュ名 キー)
リストやベクタを使ったオブジェクトは思いつくんですが、
要素数に制限が無く、常に良いオーダでアクセスできるものは
簡単に作れるのでしょうか。
906 :
デフォルトの名無しさん:02/09/09 12:32
>>896ですが、windowsのRECT構造体の事です。
schemeの文字列(というかmemory型)でboxing/unboxingみたいなこと
やってるんで、ああいう型データベースみたいなの作ったら
便利じゃないかなー、と思ったわけです。
なんで、
>>900さんの提示されたのとは目的がちょっと違います。
今アクセサとミューテタも自動で作れないかなーと考えております。
907 :
デフォルトの名無しさん:02/09/09 12:41
>>905 シンボルのhash値を取れる処理系ならhash表は用意されてる筈だし、
vectorとlistを組み合わせればチェイン法のhash表ぐらいは
簡単に作れると思いますけど。
常に良いオーダーでアクセスしたいなら、一定数超えた時点で
表を拡張してrehashするしかないと思いますよ。
>>905 slibにSchemeオンリーの実装がなかったっけ。
909 :
デフォルトの名無しさん:02/09/09 12:59
>>896ですが、補足すると
(define (sizeof . types) ...) ;型のサイズを返す
(define (typeof . types) ...) ;型の構造を返す
(define (offsetof . types) ...) ;型メンバまでのオフセットを返す
みたいな関数を考えています。typesには型名、メンバ名のリストが入ります。
バウンダリなどの計算は関数内で行います。
型を記述したa-listなテーブルをグローバルに置いて、
これを参照/拡張していきます。
(define *types*
'((LONG 4)
(RECT (LONG left)(LONG top)(LONG right)(LONG bottom))))
今のところ配列の良い表記が思いつきません。
(WIN32_FIND_DATAとかLOGFONTなど)
>>904 >バイナリファイルやAPIとのアクセスがスムーズなものが欲しいんじゃないかな。
まさにその事です。
910 :
デフォルトの名無しさん:02/09/09 13:12
905にまず必要なのは一般的なアルゴリズムの知識だと思われ
911 :
デフォルトの名無しさん:02/09/09 17:17
aga
912 :
デフォルトの名無しさん:02/09/09 17:18
mazi de hayai desu ne
>>909 とりあえず、Common Lispの型を調べてみれ
型名とシンボル、型指定子、配列、and/orが良い立脚点になると思われ。
CLtL, Common Lisp the Language, 2nd Edition
4. Type Specifiers
それに、
2.15. Overlap, Inclusion, and Disjointness of Types
19. Structures
8.1.4. Integrating Types and Classes
もね〜。
> 型を記述したa-listなテーブルをグローバルに置いて、
型オブジェクトを作るのがすっきりすると思うがの〜。
916 :
デフォルトの名無しさん:02/09/10 01:46
組み込み Lisp萌え!
>>884 Javaとか載っけるやつもいるんだから Lispのっててもいいじゃねえか!
とうちの会社のやつを洗脳したい気分。
でもどんなかんじの仕事? そんなに時間制約が厳しいのじゃないよね..
LispOSをMachのOSサーバーとして実装しようと
息巻いてたScottさん、あれから元気にされてますか?
保守age
保守
保守
保守
保守
'メンテ
ホシュ
hos
ホモ
hosyu
ほおう
dag
あ
ほ
か
龠 λλλλλ....サザエサーンハ ユカイダナー
LISP サイキョー
保守
うひひ最下層・・
Move 1 from a to c !
Move 2 from a to b !
Move 1 from c to b !
Move 3 from a to c !
Move 1 from b to a !
Move 2 from b to c !
Move 1 from a to c !
Move 4 from a to b !
Move 1 from c to b !
Move 2 from c to a !
Move 1 from b to a !
Move 3 from c to b !
Move 1 from a to c !
Move 2 from a to b !
Move 1 from c to b !
文法知ってるだけでプログラムが書けるんですか。凄い才能ですね。
らむだっちゃ
940 :
デフォルトの名無しさん:02/12/08 02:15
ん、まだdat落ちしてないのか。
942 :
デフォルトの名無しさん:02/12/20 17:23
終了
Pert 6へ
==============================================
↑誤誘導
ybb?
宮崎はスーパーハカーのお友達がいるからこんなことしなくても関係ないだろ。
>匿名性が失われたら
もう2ちゃんねるは疑似匿名掲示板です。
特に問題ないっしょ。会社からとかでも
950 :
デフォルトの名無しさん:03/01/09 14:39
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
pc3にも入れてくれ
言 い た い こ と も 言 え な い
こ ん な イ ン タ ー ネ ッ ト じ ゃ
> ハイエナ共の92%が鳥なので
マジすか。
仕事始めいってきます。
悪いこと書かないから関係ないよ
うぐぁ〜
IP記録しようがしまいがしったこっちゃねえ!
俺は言う!
俺 は 無 職 で 童 貞 だ
えっと、無知で突っ込みを入れられるのを覚悟で。。
IPの記録が抑止にもなるなら、削除系の板のリモホ表示をやめて
みるのはどうでしょう。
依頼者のホストを削除板以外の板に晒されることもないでしょうし。
つーかマジでいい加減に白よ
もう遅いし去るけど
「全然君達」わかってないね。
本当にわかっていないね。公安の中にスパイがいて話を聞いてるとは思えん(おき楽すぎて)
シャレにならない件とかあるから
管理人氏 色々と ログ等協議を願います。
キャッシュ、か。現金(謎
つーかもういいよ
何故か俺自身理解出来てないけど 本当に何故か皆さんが
ぼくを変に気になっている訳だろ。場合によっては天下の大マスコミ様までが。
以前から云ってる通り「早く」カタギしないとまずい。出来たら話だけ聞いて下さい
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50 ────────────────────────────
管理費用が倍に増えちゃったのね
逆にヤケになった馬鹿共が大暴れしたら、それはそれで面白い。
そういう祭りキボンヌ
ぬんちゃく、か、、、
2chが出来た当初なら大問題になっただろうけど
これだけ一般化しちゃうと問題ではなくなるのかもな
アングラな雰囲気は無くなったし、普通に利用する分にはIP記録されても困らん
IPで個人情報が引き出せると思っている厨房を発見しますた
11 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:16 ID:rLfxQ17l
全レスです。
2ちゃんねるも現実ですよ。
びっくらこいた
タイーホか、そうか・・・
今のうちにエロ画像デリートしよう・・・
冷蔵庫のプリン食べよう。
もう、思い残す事は、ない・・・
最高裁への上告は認められなくなったから、これで事実上判決確定だよ。
逆転も何もないって。
勢いで上告なんかしても一発で上告却下(門前払い)だよ。
二審も一審を支持。これに対して上告しようにも、
刑事訴訟と同様、自由に上告できるってもんでもないのです。
民事訴訟法312条 (上告の理由) 1項
「上告は、判決に憲法の解釈の誤りがあること
その他憲法の違反があることを理由とするときに、することができる。」
http://www.m-net.ne.jp/~doba/goto/hon.htm ようするに上告しても今の制度では100%無駄。
これで完全終了ってことか。
何度も訴えられたらたまらんからだろ
>>マジレス(^_^;) ◆1Inrkvo4AY
そろそろ スルーして良いか?
お前ら("まともな2ちゃんのみんな"だっけ?)が
世界を制覇するのを楽しみにしてるよ!がんばってくれ!!
(^^)
↑逆夢だね。。。