CommonLisp Scheme Pa ..
487:474
04/05/08 21:36
みなさん回答ありがとうございました.
局所関数定義(internal define)とletrecが等価だということは,
パフォーマンスが要求される部分では局所関数定義を避けた方がいいということですよね.
(define (f x)
(define (g x) (* x x))
(g (* x x)))
↑は↓こうした方が速い
(define (f x)
(f-g (* x x)))
(define (f-g) (* x x))
488:デフォルトの名無しさん
04/05/08 22:40
>>487
そんなのは処理系依存
多少賢い処理系ならどっちもパフォーマンス的には同じかと
さらに賢く最適化をする処理系なら前者の方が良くなるはず
489:デフォルトの名無しさん
04/05/09 04:08
>>487
Internal defineが毎回コンパイルされると思ってるみたいだが、
そんなペナルティはない。evalじゃないんだから。安心して使え。
490:474
04/05/09 08:03
>>488-489
純粋に言語仕様だけを見れば,gのinternal defineの定義はfの実行時に毎回行われますよね.
でもそれなりの処理系を使っている限り,最適化してくれるので意識する必要はないということかな.
最適化というのは>>487のような変換を処理系が自動でやってくれるということでしょうか.
491:デフォルトの名無しさん
04/05/09 15:05
>>490
> 純粋に言語仕様だけを見れば
どこにそんな仕様が?
> 最適化というのは>>487のような変換を処理系が自動でやってくれるということでしょうか.
違う
後者の場合、f のコンパイル時には f-g は再定義される可能性があるため特定できないが、
前者の場合、f のコンパイル時には g が再定義される可能性は無いため (g (* x x) をインライン展開できる。
492:デフォルトの名無しさん
04/05/09 15:51
>>490
> 純粋に言語仕様だけを見れば,gのinternal defineの定義はfの実行時に毎回行われますよね.
確かに、インタープリタの場合、あなたの言う通りに遅くなる処理系が
存在する可能性もあるけど、そのレベルの事を心配して、コーディングを変える必要は
ないことが多いのでは。
493:474
04/05/09 22:41
>>491-492
ありがとうございます.
なるほど,インライン展開ですか.考えていませんでした…
中身をある程度知っていないと効率的にしようと思った対策が
逆効果ってことはよくありますよねぇ.
494:デフォルトの名無しさん
04/05/10 01:43
効率なんてのはSchemeをもっと理解してから考えろよ。
外したレスなんでアドバイスに困る。
495:デフォルトの名無しさん
04/05/11 07:43
インライン展開は抜きにしても、
「gのinternal defineの定義はfの実行時に毎回行われますよね」
と書いている時点でclosureというものを激しく誤解している予感。
最も単純な(最適化しない)実装でも、closure g作成のコストは
f実行一回あたりcons一個分。
496:デフォルトの名無しさん
04/05/11 08:28
>>495
closure g作成のイメージは、
(define g (list 'closure '(lambda (x) (* x x)) current-lexical-environment))
みたいな感じでいいのかな。
497:デフォルトの名無しさん
04/05/12 01:30
変数xというのを残してもいいけど、それだと毎回
環境からxを探すコストがかかってしまう。
レキシカルスコープでは毎回同じxが発見される
ことになるんだから、ローカルにバインドされた
識別子はコンパイル時に参照に置き換えられるのが普通。
実行時には、レキシカル変数はもはやシンボルや
identifierではなく、名前のわからない、ただの参照になってる。
498:デフォルトの名無しさん
04/05/13 12:33
guileを検索したら↓がpageRankの上位にあったのだが、、
URLリンク(www.guile.jp)
499:デフォルトの名無しさん
04/05/13 20:53
ガイルがいる
500:デフォルトの名無しさん
04/05/13 20:57
【誰でもできる47氏支援運動!】
【以下の文章を、各種掲示板にコピペして47氏を救おう!】
すみません、貴サイトには直接は関係のない話題ですが、
広くネットに携わるものとして、いや、日本国民として、真剣に考えるべき事案であると考え、あえて宣伝させていただきます。
管理者様、もし、不適切とお感じならば、どうぞ削除なさってください。
先日、著作権違反の幇助との名目で、ファイル交換ソフトwinnyの製作者で、東京大学助手の金子勇氏(通称47氏)が逮捕されました。
しかし、winnyそれ自体は、違法なファイルの流通だけでなく、合法なファイルの流通も可能なものであり、著作権を違反するか否かは、ソフトの作成者ではなく、ソフトの使用者に、その責任がゆだねられるべき問題であります。
さきに、winnyを使用して、著作権違反で逮捕された二人のユーザーは、47氏と何らつながりのない人間であり、「幇助」の理由を付して逮捕するには、あまりにも無理があります。
以上の観点から、私たちは、Winny開発者、47氏に対する不当逮捕に強く抗議します!!
京都府警は、逮捕の理由として、「『著作権法への挑発的態度』が逮捕理由」に挙げたと、報道されています。この報道が真実であるとすれば、これは思想信条の自由の侵害であり、「思想犯」として不当逮捕したものと断ぜざるを得ません!!
これはもはや著作権の問題ではなく人権問題です!!皆様のご協力をお願いいたします。
詳しくは、下記ページをご覧下さい!
Winny開発者 47氏を救う為に
URLリンク(77483.org)
ネットワークの自由防衛同盟
URLリンク(www.netfreedom.tk)
プログラマ仲間の新井氏が設置したblog(47氏支援運動など)
URLリンク(www.moodindigo.org)
また、本運動に賛同される方、お知り合いの掲示板などに、本文章を掲示していただけると幸いです。
501:デフォルトの名無しさん
04/05/14 19:04
Scheme美しすぎ
502:デフォルトの名無しさん
04/05/14 20:34
Scheme かわいいよ Scheme
503:デフォルトの名無しさん
04/05/16 16:33
"on lisp"の翻訳は最近すすんでるの?
504:デフォルトの名無しさん
04/05/19 02:44
ごめんなさい、すすめますた
505:デフォルトの名無しさん
04/05/19 07:41
いや、催促じゃなくて、応援しているよってことね。
506:デフォルトの名無しさん
04/05/19 07:57
普通に読めば催促だわな
507:デフォルトの名無しさん
04/05/19 08:08
そりゃ、考えすぎ。普通に読めば、現状を聞いているだけ。
508:デフォルトの名無しさん
04/05/19 08:12
字面だけをみれば聞いてるだけ
だが、普通に読めば催促にしか読めないだろう。
509:デフォルトの名無しさん
04/05/19 08:22
おっ、雑談か。「普通」ね。
まず、尋ねている人が翻訳版「On Lisp」の読者かどうかさえ、分からないでしょう?
それに、翻訳者に向けて書いたのかさえ分からないし。自分でチェックするのが
面倒だから、誰かに聞いたとか。
あんまり自分の「普通」を信用しすぎないほうがいいよ。
510:デフォルトの名無しさん
04/05/19 08:35
みんなが「普通」に「普通」と言う言葉を使っているから俺も「普通」と言ってみただけだよ
509を発言したのが507だったら笑い話にしかならないけど。
511:デフォルトの名無しさん
04/05/19 08:42
509=507が、
「みんなが「普通」に「普通」と言う言葉を使っているから俺も"揶揄をこめて"「普通」と言ってみただけだよ」
と言ったら?
512:デフォルトの名無しさん
04/05/19 09:11
それならわざわざ「普通」議論を持ち出す意味が無いな。
513:デフォルトの名無しさん
04/05/19 09:19
その程度か、君はもっと出来る人のはずだ。
507のような意見を「普通」と考える人もいる。
また、507は出来るだけ「字面」のみで判断しようとしている点で、
できるだけ広い「普通」をカバーしようとしている。
「ことほどさように"普通"には同じ日本語を使う者の中でも差異がある」と
509は"普通"議論をもちだしたのではないの?
506が「"俺"には催促に聞こえるな」と言っていれば"普通"の意見だろうけどな。
514:デフォルトの名無しさん
04/05/19 09:24
雑談うぜえ。
515:デフォルトの名無しさん
04/05/19 09:27
いくら広い「普通」をカバーしようとしたところで
裏づけが無ければその「普通」は507の中での「普通」でしかないわけで
507自身が509の発言をするのは結局のところ自分の中の「普通」を
棚に上げた都合のいい「普通」感の押し付けでしかないということだ。
516:デフォルトの名無しさん
04/05/19 11:28
lisp> (eq '俺:普通 'みんな:普通)
nil
lisp> (in-package :俺)
#<The 俺 package>
lisp> (use-package :みんな)
Error: Using package `みんな' results in name conflicts for these symbols: 普通
[condition type: package-error]
517:デフォルトの名無しさん
04/05/19 13:14
普通の奴らの上を行けよ、おまいら。
518:デフォルトの名無しさん
04/05/19 13:32
これからは、「CommonLisp」を「普通のLisp」と呼ぶことを推奨します。
519:デフォルトの名無しさん
04/05/19 17:47
URLリンク(jp.franz.com)
520:デフォルトの名無しさん
04/05/19 18:09
>>519
けっこう、おもしろそうだ。つーか、まとまった資料を読みたく思う。
521:デフォルトの名無しさん
04/05/19 19:17
行きたかったけど、平日か・・・
誰か実況たのむ
522:189=312
04/05/19 20:19
ようやく和田研フォントキットの Common Lisp への移植ができました。
URLリンク(cvs.sourceforge.jp)
>>191 さんに助けていただかなければ絶対あきらめていました。ありがとう
ございます。
>>519 のセミナーに行かれる方がいらっしゃいましたら、>>189 が感謝して
いたと和田先生にお伝えいただければ望外の喜びです。
523:デフォルトの名無しさん
04/05/20 07:42
>>519
>ACL7.0の新しい正規表現ライブラリ 講演者: 川合史朗
Shiroさんはgaucheの開発をしながら、こんなライブラリを書いているのか。すごいね。
Edi WeitzさんのCL-PPCREとの比較レビューを読みたいな。
ACL Trial Editionはまだ6.2か。
524:デフォルトの名無しさん
04/05/20 21:29
>>523
あと Kahua もやってるでしょ
525:デフォルトの名無しさん
04/05/21 09:31
Common Lisp から RDB を利用した∈ですが,何か良い
フリーのライブラリってありますか?
ACLだとあるみたいですが,フリーはなかなか見つからない・・・
526:デフォルトの名無しさん
04/05/21 11:04
CLSQL, Uncommon SQLとかかな。
527:525
04/05/21 12:35
>>526
ふたつもあるんですね.
とりあえず Uncommon SQL のほうから試してみようと思います
ありがとうございました
528:デフォルトの名無しさん
04/05/21 13:55
shiroは有名だか、折れ的には新山を応援したい所だ。なんつーかアホの新山の
ページ見ていると同じ人種だなっていうか、哲学とか高度な話題をさりげなく
振ってしまう高学歴lisperの中でもヒトキワ庶民派って言うか、アホな記事を
読んでいたりすると、(例えばメリケンは飯の味はわからねぇと文句タレる新山)
Oh,Pretty!なんて感じたり。ヒヒヒッ。
同じ穴のムジナっていうかにほいがするんだよね。っーつわけで新山センセもがんばって
メリケンのように弾けまくっってください。
529:デフォルトの名無しさん
04/05/21 15:28
シソヤマは自意識つよすぎで恐いよ。
530:デフォルトの名無しさん
04/05/21 17:54
lisperじゃなくてpythonerだと思うけどな。
最新のアホ GtkYes URLリンク(www.unixuser.org) の
無意味さにはワラタ (ダイアログ全てにビシバシ [Yes] を押してくれる
ランチャーのような単なる実用プログラムを彼が作るはずがない)。
531:デフォルトの名無しさん
04/05/22 15:15
ブサイクフィルターとか美人フィルターというネタもあるが、アレは新山じゃ
なかったか。
新山ネタをフりつつ真面目な話をして恐縮なのでありますが、Symbolicsのマシン
を知って思ったのです。lispでレンダリング(行列計算や座標計算)までやって
いるのだろうか?と。例えばcのmallocのようなヒープの確保をするような場面
ってあるじゃないですか。ピットマップを操作する場合などですが、その場合
lispではどのように処理しているのだろう?と疑問に思ったのです。
GIMPのスクリプトもscheme系らしいですが、Cやfortranならば配列とかmalloc
である程度のメモリーを確保してそのメモリーへの各種操作という形になります
よね。lispだとリスト処理や記号処理のイメージが強くてどうしてもSymbolicsの
ようなCGのビットマップ操作や座標変換、行列の計算のイメージが全く頭に浮かばない
のですが、詳しい人この辺りの話しりませんか?
532:デフォルトの名無しさん
04/05/22 15:59
組み込みでそういう操作を入れればいい。
533:デフォルトの名無しさん
04/05/22 16:07
Symbolicsは知らないけど、Common Lispには配列型やベクタ型が用意されていて、
bit-vector型なんてのもあるから、ビットマップ操作は普通にできる気がします。
行列型はないけど、多次元配列は使えるので、行列の操作関数群もだれかがすでに
書いて公開している気がします。
534:デフォルトの名無しさん
04/05/22 18:48
Symbolicsは使ったことないけど。
optimizeでspeed最高、safety最低にしてちゃんと型宣言すれば、
simple-vectorやbit-vectorのアクセスはCで配列使った場合と
変わらないよ。そのかわり配列の境界チェックや型のチェックは
プログラマの責任になるけどね。
535:デフォルトの名無しさん
04/05/23 10:52
現在でも、Lisperに渡したら、ハマるような代物かなSymbolicsは?
そのくらい、プログラム開発システムとして完成度が高い?
それともWindowsとVisual Studioなんかと比べたら見劣りする?
経験者の人、いねーかな。
536:デフォルトの名無しさん
04/05/23 14:39
ILC2003に居合わせた人達が言うには商業的に失敗しただけで現存するどの処理系も
あのレベルに到達できていないらしい。本当かどうかは知らんけど。
アレをオープンソース(システム?)として公開しようとかいう動きもどっかにあったような。
537:デフォルトの名無しさん
04/05/23 19:37
配列でつか。いやてっきりコンスセルを2Mbyteほど確保してハイリツとしたりするかと
思ってしまいました。何らかのツリー型データベースも一旦ファイルからリストへロードして
などするのかと。
もう一つ聞きたい事があるのですが、Lisperの人たちは手続き型プログラミング
で言うところのフローチャートのような図は書いたりしないのですか?
オブジェクト指向となるとUMLなどありますし、Lispだとどんな図を日常的に
書いているんでしょう?リストか?、再帰のツリーかな?
Symbolicsの画面キャプチャにはそれっぽい図も見かけたりしますが。(class継承の
ずのようなもの)
>ILC2003に居合わせた人達が言うには商業的に失敗しただけで現存するどの処理系も
>あのレベルに到達できていないらしい。本当かどうかは知らんけど。
という事は、現物を触った人はここには誰も以内と?
昔の第五世代コンピュータプロジェクト辺りでLispマシンを研究していたと
言うような話を聞いた事があるんですが、サイ(psy)のあれは推論マシンだしたか?
538:デフォルトの名無しさん
04/05/23 20:19
よくわからんが
URLリンク(www.pfu.co.jp)
このキーボードは使いやすそう
539:デフォルトの名無しさん
04/05/23 20:26
>>538
使った人によればAの隣のRUBOUTは一度慣れると病みつき
だそうです。
オレの代の頃にはハードがいかれてたんでほとんど置物と
化していて残念だった記憶が。いじり倒してみたかった...
540:デフォルトの名無しさん
04/05/23 20:39
UNIXの仕事だけではないのでファンクションとWindowsキーはないと困る
541:デフォルトの名無しさん
04/05/24 05:49
>>537
もしかして、Lisperはリストしか使わないとか思ってた?
自分でコード書くときに図を書くことってほとんどないな。
コードが大きくなりそうな時に全体の構成をコメント中にメモったりはするけど。
他人のコードを読む時には、Allegro Composerだと関数の呼び出し関係や
クラス階層をグラフ表示してくれるんでたまに使うかな。
542:デフォルトの名無しさん
04/05/24 21:41
>>531 それは hirax.net の人かと。
URLリンク(shibuya.pm.org)
で最近講演してますね。
543:デフォルトの名無しさん
04/05/24 22:57
cygwin-1.5.5 に scm-5d9 インストールしたのですが、
バックスペースでプロンプト文字 "<" を超えて
行頭までカーソル移動してしまいます。
動作は問題ないのですが何かと不便で困っています。
何かお気づきの点がありましたらお願いします。
544:デフォルトの名無しさん
04/05/25 01:26
>>543
stty の設定か何かで、改行コードが CR+LF (Carriage Return + Line Feed) に
なってるからでは?
勘違いだったらスマソ。
545:537
04/05/25 18:15
チンボリクスの神がコノスレに降臨しますやうに(・∀・)ニヤニヤ
546:デフォルトの名無しさん
04/05/25 22:33
Interlisp-Dがフリーでダウソできるみたい。
URLリンク(www.sra.co.jp)
547:デフォルトの名無しさん
04/05/25 23:14
URLリンク(user.ecc.u-tokyo.ac.jp)
flatline氏の日本語訳『on Lisp』、第20章「継続」の説明がすばらしい。
いろいろ読んだけど、これほどすっきりと理解できたことは無かった。
ありがとうございます。
ところで、pdf版の図109(P148)、TeX のタグが残ってしまっているようです。
ご報告まで。
548:543
04/05/25 23:15
>544 氏
今色々キータイプしてみたら Ctrl + BS で
バックスペースが出来て,プロンプト文字 "<" でブロックされました。
何か分かりますでしょうか?
549:デフォルトの名無しさん
04/06/06 10:08
新山氏のサイトに、かなりショッキングな文章が登場。
URLリンク(tabesugi.net)
> 新山は、汎用プログラミング言語としての Lisp (Scheme) はもう信用していない。
> だって、現在のたいていのアプリケーションで大変なのはデータ構造の設計と
> 入出力の扱いで、そういう部分はふつう圧倒的に手続きだらけなんだもん。
…(略)…
> いまでは自然言語処理っつうと、ほとんどが「どーやって大量のデータを収集・
> 変換・学習・適用するか」につきているので、これはおそろしく手続き的な操作で、
> Scheme なんか使ったらほとんど begin と let* だらけになる。
新山氏が以前言っていた
URLリンク(tabesugi.net)
> だいたい新山はもともとストイックな Scheme が好きだったのだが、あまりに
> 実用的でないから Python に「逃げてきた」のである。
って、そういうことだったのね。ライブラリの少なさの問題ではないのね。
ちなみに、COBOL の代わりにこそ Java ではなく LISP を、という主張もされていて、
(最初の引用元を参照)、こちらも非常に興味深い。
550:デフォルトの名無しさん
04/06/06 16:31
beginとlet*使えばいいじゃん。
551:デフォルトの名無しさん
04/06/06 16:37
ってか新山って誰?
552:デフォルトの名無しさん
04/06/06 18:00
>「どーやって大量のデータを収集・変換・学習・適用するか」につきているので
と
> Scheme なんか使ったらほとんど begin と let* だらけになる
に論理の飛躍を感じるのは漏れだけですか?
ブブカもびっくりですよ。
『Schemeはプログラマを映す鏡』だなあと思う今日この頃、おまえら、いかがお過ごしですか。
553:デフォルトの名無しさん
04/06/07 10:14
日記なんだから論理は飛躍しても仕方ないと思うけど...
>> 552
ところで「begin, let*を使うコードだらけになるじゃん」と言う主張は
新山さんが明らかに何か分かってないという証拠になるのかな?
もしそうならどうしてそうなのか教えて欲しいなぁ。
554:デフォルトの名無しさん
04/06/07 13:23
Interlisp-D試した人いないの?
555:デフォルトの名無しさん
04/06/07 19:34
>>554
普通に動いたよ。ドキュメント読む暇が無いんで後回しになってるけど。
556:デフォルトの名無しさん
04/06/07 22:06
>>554
URLリンク(squab.no-ip.com:8080)
557:デフォルトの名無しさん
04/06/07 22:34
>>555-556
レスサンクス。試してみる。
古参Interlisperの話を聞いてみたいな…
558:デフォルトの名無しさん
04/06/07 23:58
>>553
つまるところ、ストイックな Scheme で全てをやろうとすると、
begin や let* の嵐になるということではないか。言いかえれば、gosh などの
現実的(または妥協的)な Scheme 処理系を使ったことがないのかもしれない。
日記は良く読んでないので外してるかもしれんけど、新山氏は普段 Python を
使ってるらしいからね。
# ほら、Python ってライブラリが充実してるじゃん
559:デフォルトの名無しさん
04/06/08 02:40
>>557
おれも聞いてみたい。どうしてもSymbolicsとかの統合環境への夢が捨てがたい。
いま良くあるような保護指向のOSのモデルと、統合環境指向のシステムを
うまく統合させる方法ってないのかねぇ。
560:デフォルトの名無しさん
04/06/08 21:04
>>558
たぶん、「ストイック」の意味が違うと思う。
変数をできるだけ使わず、関数のネストだけで
コーディングするのがストイックなScheme流なんだと
思う。
561:デフォルトの名無しさん
04/06/08 22:25
>>560
それは Scheme 限定というより、Lisp 族の一般的な慣習のような。
ああでも、elisp やってる人達はちょいと違う気もするけど。
まあどうでもいいか。
562:デフォルトの名無しさん
04/06/08 23:56
なぜ人間の脳はオーバーロードしないのか。
563:553
04/06/09 00:21
>>560
に賛成。でも個人的には、関数型プログラミングの作法と手続き型の作法をまぜこぜに使えるのがLISPの強みの1つだとおもうので、新山さんの意見には賛同できないんだけど。
564:デフォルトの名無しさん
04/06/09 00:26
ecl で thread 使えている方いらっしゃいますか?
CVS の CHANGELOG には Linux で pthread サポートしている様に書いてありますけど。
565:デフォルトの名無しさん
04/06/09 14:50
fibonacci 数列について質問です。
これを関数型の記述のまま、計算量を減らすことはできないでしょうか?
まず、定義どおりに関数型で記述してみました。
(define (fib x)
(if (< x 2)
1
(+ (fib (- x 1)) (fib (- x 2)))))
これだと、定義がそのままコードになっていて、とてもわかりやすいのですが、
x の小さな項を何度も計算しなおすので、x が大きくなると計算量が膨れ
上がってしまいます。
Chez Scheme では x=35 ぐらいが限界でした。
手続き型で、小さい項をまず求めて、それをもとに大きな項を求めるように書くと、
計算量がはるかに少なくて済むのですが、わかりづらくなります。
定義がそのままコードになっている、関数型の記述とはだいぶ違います。
(define (fib2 n)
(if (< n 2)
1
(do ((x1 1 (+ x1 x0))
(x0 1 x1)
(m 2 (+ m 1)))
((<= n m) (+ x1 x0)))))
566:デフォルトの名無しさん
04/06/09 14:51
末尾再帰であらわしたコードも見かけましたが、わかりにくさでは似たようなものです。と言うか、これは手続き型のロジックを末尾再帰に無理に書き換えただけだと思います。
(define (fibo num)
(let loop ((num num)
(p2 1)
(p1 1))
(cond ((= num 0) 1)
((= num 1) 1)
((= num 2) (+ p2 p1))
(else (loop (- num 1) (+ p2 p1) p2)))))
もしかして、(よく知らない)遅延評価を使えばよいのかと思い、頭の悪いコードを
書いてみましたが、かえって遅くなるだけでした。
(define (fib3 x)
(if (< x 2)
1
(+ (force (delay (fib3 (- x 1)))) (force (delay (fib3 (- x 2)))))))
遅延評価に関して、Shiro さんのところも見てみたのですが、
URLリンク(www.shiro.dreamhost.com)
これも結局、手続き型と同じ、小さい項をまず計算して、徐々に大きい項を求めていく
やり方でした。定義がそのままコードになるような書き方ではないと思います。
ということで、質問をもう一度まとめますと、
定義がそのままコードになるような書き方で、fibonacci 数列の一般項を求める関数の
計算量を減らすことはできないでしょうか?
以上です。どうかよろしくお願いいたします。
567:デフォルトの名無しさん
04/06/09 15:07
memo関数使ったら?
一度計算した値をとっておくだけで、再帰的な「素直な」定義はそのまま。
568:デフォルトの名無しさん
04/06/09 15:30
>>567
ありがとうございます。memo関数とは、これのことでしょうか?勉強してみます。
URLリンク(www.sampou.org)
それにしても、delay/force は、一度計算したものはキャッシュされるということでしたが、
それは、同一の約束オブジェクトに関する話なのですね。
(define (fib3 x)
(if (< x 2)
1
(+ (force (delay (fib3 (- x 1)))) (force (delay (fib3 (- x 2)))))))
において、
(fib3 1) が何回現れても、それは毎回、別の約束オブジェクトとみなされるから、
再計算するしかないのですね。まだまだ勉強が足りないなあ。
569:(define (´∀`) 'マターリ)
04/06/09 19:52
(define (fib x)
(define fib (let loop ((y 1) (lst '(1 1)))
(if (>= y x) (lambda (x) (list-ref (reverse lst) x))
(loop (+ y 1) (cons (+ (car lst) (cadr lst)) lst)))))
(if (< x 2) 1
(+ (fib (- x 1)) (fib (- x 2)))))
570:デフォルトの名無しさん
04/06/09 20:22
>>566
> 末尾再帰に無理に書き換えた
そうか?俺には自然に見える。
末尾再帰 = ループ という概念に慣れていないだけでは?
571:デフォルトの名無しさん
04/06/09 22:58
URLリンク(www.iijlab.net)
の最後に載ってるfibがO(log n)でなかったかな
572:デフォルトの名無しさん
04/06/10 03:09
>>569
面白いコードをありがとうございます。ただ、fibonacci 数列の定義をこのコードから
読み取るのは難しいと思います。
また、最後の2行は実質的に不要で、コードのわかりやすさに寄与していないのではないでしょうか?
(define (fib x)
(define fib (let loop ((y 1) (lst '(1 1)))
(if (>= y x) (lambda (x) (list-ref (reverse lst) x))
(loop (+ y 1) (cons (+ (car lst) (cadr lst)) lst)))))
(fib x))
と書いても結果は同じです。
>>570
すみません、私の言葉が正確でありませんでした。
手続き型の記述をループに書き換える方法としては、私も自然だと思います。
(実は、>>566 の関数 fibo は、既存のそのままのコードではなく、自分がわかりやすい
ように書き直したものです。)
ただ私は、もとの定義どおりの>>565 の関数 fib の方を末尾再帰にしたかったのです。
手続き型のロジックを元にしたため、定義から大きく違った形になっている、という意味で
「無理に」という言葉を使いました。
>>571
恥ずかしながら、このコードは私には難しいです。
慣れた人になら、このコードも関数型らしい「定義を書くだけでそれがそのままコードになる」
記述に読めるのでしょうか?
573:デフォルトの名無しさん
04/06/10 03:11
訂正。
×自分がわかりやすいように書き直した、
○自分にわかりやすいように、自分なりに書き直した
574:デフォルトの名無しさん
04/06/10 03:37
自分で末尾再帰にする言語を作れ。
575:デフォルトの名無しさん
04/06/10 03:57
>>572
"関数型らしい「定義を書くだけでそれがそのままコードになる」"
ってだれに聞いたのか知らないけど、幻想入り過ぎなのでは。
576:デフォルトの名無しさん
04/06/10 04:21
>>565
計算機プログラムの構造と解釈
問題3.27 メモ化
問題1.19 対数的
577:デフォルトの名無しさん
04/06/10 08:50
>>565
その書き方のまま、高度なキャッシングをするよう最適化するような処理系があったらうれしいな。
仕様としては、R*RSには入らないだろうけどSRFIになら入りそう。
でもこれは夢のような技術っぽい。
578:デフォルトの名無しさん
04/06/10 11:08
Schemeは、どれをDLすればいいんだ?
579:デフォルトの名無しさん
04/06/10 12:07
>>576 ありがとうございます。
URLリンク(mitpress.mit.edu) と
URLリンク(www.geocities.co.jp)
を参考にして、以下のコードを書いてみました。
(define (memoize proc)
(let ((cache '()))
(lambda args
(let ((hit (assoc args cache)))
(if hit (cdr hit)
(let ((result (apply proc args)))
(set! cache (cons (cons args result) cache))
result))))))
(define memo-fib
(memoize (lambda (n)
(if (< n 2)
1
(+ (memo-fib (- n 1))
(memo-fib (- n 2)))))))
大変うまくいきました。コードはほぼ定義どおりで、しかも (memo-fib 10000)でも
即時に演算が終わるようになりました。memoize って素晴らしいです。
数年前、Java で数値計算をしていて、再帰で書いたら同じ問題に遭遇して、仕方なく
ループで書き直したことがあります。あのときに memoize を知っていたらなあ。
URLリンク(mitpress.mit.edu)
は私には難しいので、時間をかけて考えてみます。
ということで皆さま、いろいろありがとうございました。
580:デフォルトの名無しさん
04/06/10 18:05
>>578
URLリンク(www.sci.toyama-u.ac.jp)
ここに処理系のリンク先あり
Windowsなら
DrScheme
あるいは
Petite Chez Scheme + ChezEdit
が簡単
581:デフォルトの名無しさん
04/06/10 20:34
>>580 ありがとう
DrSchemeを入れてみました。
40Mってのには驚きましたよ。
582:デフォルトの名無しさん
04/06/10 23:26
今日のセミナーに参加した人いる?
午前中は完全に雑談だった。せっかく早起きしたのにちょっと鬱。
明日に期待しよう。
583:デフォルトの名無しさん
04/06/11 00:22
>>582
まあそう言うな、生CEO や生和田先生や生Shiroさんが見れただけでもオレは満足だ
もっとちゃんと時間をとって役に立つ話をやって欲しいとは思ったけど
584:デフォルトの名無しさん
04/06/11 07:17
>>582, 583
漏れ行きたくても行けない地方在住者。
レポートキボンヌ!キボンヌ!
585:デフォルトの名無しさん
04/06/11 09:17
URLリンク(www.shiro.dreamhost.com)
586:デフォルトの名無しさん
04/06/11 23:12
CL-USER(2): (require :regexp2)
; Fast loading /opt/franz/acl70b/code/regexp2.fasl
;;; Installing regexp2 patch, version 0
; yacc constructing #<GRAMMAR-CLASS REGEXP> ...
; Finished
T
CL-USER(3):
regexp2キター
587:デフォルトの名無しさん
04/06/12 01:07
これからはJavaよりもLispだと確信しました。
しかしACLの値段は高いのお…
588:デフォルトの名無しさん
04/06/12 01:07
現在プログラム板にはHSP関連スレに凶悪な荒らしどもが住みついています。
・HSPに関係の無い話題でスレッドを上げまくる
・HSPオフィシャルサイトの住人を名指しで誹謗中傷する
・重複スレを乱立させる
などの荒らし行為を行っています。
みんなで団結してム板のゴミどもを追い出しませんか?
【HSP関連スレ】
【皆のレイプ魔】HSP初質P25【WWEヲタ=ハゲ】
スレリンク(tech板)
HSP>>>>>>>>>>>>>C=糞w
スレリンク(tech板)
今日もどこかでHSP初心者が質問ですP19
スレリンク(tech板)
HSPについて
スレリンク(tech板)
589:デフォルトの名無しさん
04/06/12 08:47
scmutilsについて教えてくだされ。
Structure and Interpretation of Classical Mechanics
を読み進むのにScmutilsを使いたいのだが、MITScheme
は苦手だ。他の処理系に移植されていないだろうか?
Chez Scheme にあるとうれしいのだが。
590:デフォルトの名無しさん
04/06/12 09:45
>>589
私もぜんぜん知らないのだけど、Google で検索すると、
ChezEdit-NT の作者である 笹川さんが出てくる。
URLリンク(www.sampou.org)
その結果は
URLリンク(chabo.kingdom.biglobe.ne.jp)
> SICMのためのScmutilsを動かしたいんだけど、MIT-Schemeはどうも苦手だなぁ。
> かといって移植するのは大変な労力だ。どうしたもんだろう。
どうも移植はされていないっぽい。
Gauche 方面では、
Scheme:ライブラリ -> scmutils
URLリンク(www.shiro.dreamhost.com)
> MIT Scheme べったり。Gauche に移植しようとして途中で挫折。-- skimu
こちらもだめっぽい。
あきらめて Debian GNU/Linux と MIT-Scheme に行くしかなさそう。
591:589
04/06/12 10:40
>>590
ありがとう。
MIT-Schemeでなんとかやってみるよ。
592:デフォルトの名無しさん
04/06/12 15:20
CPS(継続渡し)が今までどうしても理解できなかったのだけど、
このページの例を見て、目がさめるようによく分かりました。
URLリンク(www.namikilab.tuat.ac.jp)
なあんだ、まず最初に巨大にネストした無名関数をこしらえて、
それを一気に実行するだけじゃないか。
それだったら、普通にスタックが積まれる再帰とコストが等しくて当然。
しかし、Petite Chez Scheme は CPS の方が二倍ほど速いのですね。
自分の手元で試してみても同様でした。不思議ですね。
593:デフォルトの名無しさん
04/06/12 16:09
すまねぇ、誰か助けてくれ。
こないだAllegroCommonLispのウワサを聞きつけトライヤル版を試してみたくて
ダウンロードしたんだが、さっきFranz.comのSalesManagerのクレイグから
いきなしメール来て、ACLを何処で知ったか、とかいって幾つか質問が
書かれたハードオファーなメールが来たんだよ。英語だし意味ワカンネエし、
毎日にチャンネルしかやってない俺にとって非常に恥ずかしいっていうか、
何で俺のようなアホにメールよこすんだよ!っていうか、「読んでくれて
ありがとう。私はあなたからすぐに便りをもらうことを期待します」とか
クレイグ書いてるし、そういう訳で困っています。
普段アホの新山とかblog読んでアヒャヒャと喜んでいるアホなのですが、天才新山名誉
教授でもなんでも良いのでだれか知恵を貸して下さい。
知名みにlispは初心者で、本当はAllegroCommonLispよりもGaucheを使って
半日ほどハアハアしてたりDを使っていました。
594:デフォルトの名無しさん
04/06/12 22:35
>>593
相手は単に商売なんだから、ほっといたらいいんではないかー?
595:デフォルトの名無しさん
04/06/13 08:51
どれシニョリーナ
「ウミネコ」の魔術をといてやるよ
596:デフォルトの名無しさん
04/06/13 17:13
>>593
トライアル版落とすとそのメール来るよね。
前に落としたときは日本の法人から営業担当者のメールが来ますたよ。
そんな高いもん個人で買えないからご遠慮メール出しちゃったら、担当が変わりましたメールが忘れた頃に(w
そこまで売りたいなら値段下げれ!とか思た(藁
597:デフォルトの名無しさん
04/06/13 18:16
とりあえずexe作る権限だけでも売れると思うんだけどなあ。
598:595
04/06/13 18:21
すみません595 は誤爆…良スレを汚してごめんなさい
599:デフォルトの名無しさん
04/06/13 21:26
確かに個人で買えるような値段ではないよね。学生なら研究室の予算で買ってもらえるかも
知れないから指導教員に頼んでみるのもいいと思うけど。
600:デフォルトの名無しさん
04/06/14 00:13
かえなければほかのつかったらいいじゃん、ってきもするんだけど。
使ったことがある人のAllegro CLの「これはべんりだ」ってあたりを
聞かせてもらえるとうれしいかも。
あと、個人的にはAlleglo Storeがすごそうなんだけど、そのへんも。
601:デフォルトの名無しさん
04/06/14 00:49
Trial版しか使ったことないけど、日本語の文字がちゃんと扱えてWindows上でちゃんとした
処理系があるのはACLだけかな。Trial版でもちょっとしたプログラム開発には十分使えますよ。
602:デフォルトの名無しさん
04/06/15 00:10
VBやObjectPascalのイベントハンドラがLispで書かれていて萌えた(w
603:デフォルトの名無しさん
04/06/15 23:31
>>13
で紹介されているSECDR-Schemeですが、配布元のサイトが
無くなっているみたいです。
私が利用しているDNSが悪いのでしょうか?
誰か親切な人うぷしていただけませんか?
604:603
04/06/15 23:39
今、鯖落ちてる?
605:デフォルトの名無しさん
04/06/16 00:27
>>601
LispWorksは?
>>603
覚えてたら暇なとき発掘してみるよ。flatlineさん(だっけ?)が上げてたサイト使わせて
もらってねら〜Lisper用ポータルでも作ろうか。
先週のセミナーでも思ったんだけど、Lisp興味あるけどどこから手を付けたらいいのか
わからないって人も結構居るみたいだし。
606:デフォルトの名無しさん
04/06/16 01:08
>Lisp興味あるけどどこから手を付けたらいいのか
わからないって人も結構居るみたいだし
禿げしく力強くうなづきつつ、同意。
607:デフォルトの名無しさん
04/06/16 01:54
そういえば初心者スレ無くなっちゃったね。
とりあえず c.l.l と Blog と wiki と *-dev 系の ML はチェックしてる。
608:デフォルトの名無しさん
04/06/16 01:59
>>606
そうだよなぁ。
Schemeに関して言えば、そういう情報を集積する場所としてWiLiKiがあると
思うのでがしがし「こんな情報はないのか?」って書き込んでみるといいかも。
609:デフォルトの名無しさん
04/06/16 03:07
>>607
次スレは
【common lisp】(S式のみで語らう漢のスレ)【scheme】
でお願いしm
610:デフォルトの名無しさん
04/06/16 07:14
>>609
(だが気をつけ給え。
((その論理)の行きつく先は)
(激しく読み難い(スレ)だ))
611:デフォルトの名無しさん
04/06/16 07:59
>>610
(and (気をつけ給え。 インデント)
(equal (修正すると >>610)
(気をつけ給え。
(equal (行きつく先 (その論理))
(激しく読み難い スレ)))))
612:デフォルトの名無しさん
04/06/16 18:47
このスレを見て思い出した・・・
去年、プログラミング言語2(Scheme)の単位落としたんだよな・・・
今年の後期プログラミング言語2(Lisp)取らないと・・・
613:デフォルトの名無しさん
04/06/16 18:56
おまいさんの大学は Scheme -> Lisp に変わったのか
おれんとこは2年前から逆になったわけだが
614:デフォルトの名無しさん
04/06/16 22:19
(age)
615:605
04/06/16 22:32
>>603
Secdr.tar.bz2っての拾ってきたけど多分コレだろ。
ドコに置けばいいか教えれ。288KBくらい。
616:デフォルトの名無しさん
04/06/16 23:06
皆さんは、LISP を習得することで、他の言語でのプログラミングにどういう
メリットを感じましたか?
私は Scheme をある程度おぼえて、簡単なプログラムなら書けるようになったの
だけど、この知識が例えば Java でのプログラミングに生かせるかというと、
今のところ、よく分からない。
関数プログラミング、ファーストクラスクロージャ、継続、マクロなどはとても
面白いと思ったけれど、Java では使えないし。
今のところ、JavaScript で何かできるかな?と思うぐらいです。JavaScript には
ファーストクラスクロージャがあるから。
エリック・レイモンドが
URLリンク(cruel.org)
「LISP は、それをモノにしたときのすばらしい悟り体験のために勉強しましょう。
この体験は、その後の人生でよりよいプログラマーとなる手助けとなるはずです。
たとえ、実際には LISP そのものをあまり使わなくても。」
と言っていたのはどういう意味なんだろう?
617:デフォルトの名無しさん
04/06/17 03:00
>>616
> たとえ、実際には LISP そのものをあまり使わなくても。」
LISP を直接扱う仕事が少ない、LISP の技法が C に直接マッピングし辛い(クロージャとか)って
事ですよね。Java でも無名クラスとか CPS とか使う機会はそれほど無いのではないでしょうか。
618:デフォルトの名無しさん
04/06/17 03:18
>>615
Secdr.tar.gz が 313KB なんでそれくらいでしょうね。ライセンスは GPL みたいなんで
うぷろださえあれば私もうぷ出来ます。
ところで、SECD マシンじゃなくて SGCD マシン(G-Machine)というのがあるみたい
ですが、これってどういう物なのでしょうか?
ググって見たらグラフ理論と関係あるみたいですが、グラフ理論って最適化とかでよく
聞く物の、中身が良く分かりません。。。
619:デフォルトの名無しさん
04/06/17 14:21
>>617
ちょっとメール欄が気になりますが、まあ、まさにその通りです。それだけでは
Java のプログラミングスタイルが大きく変わる、という気がしないんです。
Lisp の良さは、どのようにも書けることだと思うんです。手続き型風にも、オブジェクト
指向風にも、関数型風にも書ける、何でもそろう百貨店のようです。
ところが他の言語は専門店なんです。例えば Java はクラスベースの型制限のきつい
オブジェクト指向言語として書く以外に、あんまりできることがない。そうすると、
結局デザインパターンに従って書くより他にないのかな、ということになってしまう。
Java 捨てろ、と言われても、Lisp でやらせてもらえる仕事なんてないし。
皆さんはどのように考えていらっしゃいますか?
>>618
私もグラフ理論はぜんぜん知らないんですが、n次空間での点と線の組み合わせの性質を
研究する学問だと聞いたことがあります。応用としては、回路図を基盤に起こすとき、
どのように回路を取り回せばよいかを検討するのに役立つそうです。
レゲエ数学者の秋山仁先生が、日本における第一人者だそうです。
『秋山仁の 落ちこぼれは天才だ 』
URLリンク(www.amazon.co.jp)
620:デフォルトの名無しさん
04/06/17 14:31
>>619
んー。逆方向で。
Lisp が百貨店だとしたら、他の言語で初めて触れるような機能に出くわしたとき、
「ああ、これは Lisp で言ったら○○だな」
て風に(Lisp にマッピングして)理解してみる、ということがやり易い、
ていう具合に考えてみるのはどうでしょう。
621:デフォルトの名無しさん
04/06/17 15:35
>>618
G-Machineは、lazyな言語向きの仮想機械で
実行にグラフ書換えを利用してるものだったような。
うろ覚えだけど。
グラフ書換えについては、
『コンピュータ基礎理論ハンドブック』のたぶん2巻に解説があった気がする。
622:デフォルトの名無しさん
04/06/17 16:13
>>620
確かにそれはできるかも知れません。実は Lisp を源流としている技術はこの業界には
すごく多いみたいですから。
Java には、フレームワークだとか、EJB とかさまざまな新技術が次々導入されて
いますが、「あ、これは Lisp のアレに相当するな」と分かれば習得は早いでしょうね。
しかし、もともと Lisp のエキスパートだった人はそれで良いでしょうが、今から
Lisp を学ぼうという人はどうでしょう?遠回りをせず、Java の新技術を学んだ
方が早いのではないかという気がします。
何しろサーバサイド・プログラミングは Java の一人勝ちで、Java だけ覚えれば
それで済んでしまうような状況ですから。代わりに Lisp が普及していてくれたらなあ。
623:デフォルトの名無しさん
04/06/17 18:07
それにしても、Scheme の世界観は本当に美しいと思います。
以前、「継続というのは、靴下を裏返すようにして、ひっくり返した ラムダ」
という話を聞いて感動したのですが、
この下のほうの Shiro さんの説明
URLリンク(www.shiro.dreamhost.com)
「値を返す ≡ 値を継続手続きに渡す」
これを聞いて、さらに感動しました。
結局 Scheme の制御構造は ラムダしかない。関数もブロックも環境も、全部
ラムダ。なんか世界の見え方が変わってしまいますよね。
しかし、これを Java でのプログラミングに、どのように生かせばいいのだろう…。
624:デフォルトの名無しさん
04/06/17 19:25
例えば,今まで C しか知らず,そのままでいると:
1. 再帰を恐れる.再帰で考えられない.再帰のコーディングの仕方に慣れていない.
2. 配列ばっかり.
3. スコープについてしっかり理解できていない.
4. なぜか速度ばかり気にして,少ないステップ数を重視した見辛いコードを書く.
といった感じになると思います.
でも,これは「言語はいくつか学べ」の理由でしか無いかも.
625:デフォルトの名無しさん
04/06/17 20:47
>>624
お前、C使いに物凄い偏見を持っていないか?
または、たまたま >>624 の周りでCを使う奴は皆
その程度にしか使えないだけなのか?
626:デフォルトの名無しさん
04/06/17 20:52
scheme 使う人に質問です。
何故 scheme は list の末尾が nil ではないのですか?
末尾は nil にしておいた方が美しい設計だと思うのですが・・・
627:デフォルトの名無しさん
04/06/17 21:00
nil が存在しないからです。
628:デフォルトの名無しさん
04/06/17 21:45
scheme を知ってからは C でも alist もどきを多用するようになった。
629:デフォルトの名無しさん
04/06/17 23:11
>>626
リストの末尾は他と区別できる単一の要素(空リスト)があればいいだけなので、特にnilだと
美しいという根拠がわかりません。それよりも真偽値と区別のないLispよりはSchemeの方が
すっきりしているのではないでしょうか。そもそも真偽値とリストは型が違うわけですから。
630:デフォルトの名無しさん
04/06/17 23:39
>>626
名前が欲しいだけなら(define nil '())で。
631:デフォルトの名無しさん
04/06/17 23:42
>>630
'(a . nil) が (a) にならない罠
632:630
04/06/17 23:50
あうち。リーダーマクロでなんとかとか...
ごめん、忘れてください。
633:603
04/06/18 01:39
>>618
有難う御座います。↓とかにうpして貰えれば嬉しいです。
URLリンク(www.uploda.net)
>>605 = 615
ご親切に有難う御座います。
bz2でうpできる場所は、見つかれませんでした。
拡張子を誤魔化してうpするという方法が、可能かどうかまで調べていません。
気が向いたら、うpしてください。
634:デフォルトの名無しさん
04/06/18 01:58
うう…結局、Lisp を学んで、Java のプログラミングスタイルが変わった人は
いらっしゃらないのでしょうか。この言語はとても魅力的だけど、仕事にほとんど
生かせないのなら、なんとも悲しいものがあります。
Namazu の高林さんが
「Scheme を学んでからは、他の言語でプログラムを書くときの切れ味もずいぶん変わった
気がする。」
URLリンク(namazu.org)
と言っていたから、すごく期待していたんだけどなあ。
そう言えば高林さんは、Java が嫌いだとも言っていたか…。
URLリンク(www.ogis-ri.co.jp)
635:デフォルトの名無しさん
04/06/18 02:05
所詮その程度の人間だったということだ
636:デフォルトの名無しさん
04/06/18 02:24
>>633
上げといた。こういうの使うの初めてなんだけど、これで良いのかな。
637:デフォルトの名無しさん
04/06/18 02:59
>>634
今どきLispをやろうなんて物好きは、趣味で楽しんでやってるだけなんだから
仕事に生かそうなんて期待するな。
638:603=633
04/06/18 03:51
無事↓できました。有難う御座いました。
勝手に想像していたものより良い意味で裏切られました。
まだ、ちょろっと読んだだけですが、付属のLibも一通り揃っている感じですし
SECDRのRを何故Sから分離したのか、勉強してみたいと思います。
そういえば、どこかでSECDH machineというのが有ると聞いたときがありますが
ここでのHの意味って、何なんでしょうね?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5389日前に更新/290 KB
担当:undef