神保町の学術総合センターってところでの発表だったんですが、お昼ご飯食べにそこらを彷徨っていたらなぜか武道館とかに出て。んで、さらに歩いたらいつのまにか明倫館書店にいました。噂に聞いていたんだけれど、たしかに凄い品揃えだと思ったんだけど、欲しい本がなかった。たしかに、3つくらいの棚に欲しい本全部あるわけねーよなぁ。
(結局その日は昼飯が食えなかった)
結局、最終日にそこで買った本。
初めて洋書を買った気がする。技術書の。後者は350円だったからという単純な動機で。awk って未だに書けないんで、いい機会なのかなと。
そういえば、最終日にはドーナツ出てなかったな。残念。
最終日のHPの方の英語の発表、全然わけわからんかったー。
難しい話はよくわからないんですが、ソースを公開する理由をその「難しい話がよくわからないから」にしてはいけないのかしらん。私はそうです。
今日もドーナツを2個食べてきました。
夕飯はなんと寿司です。酒もあります。何より無料です! よかったです。
というか、今まで論文とかその辺でしか見たことが無いような偉い人たちのご尊顔を直に拝見できることができて非常に嬉しかったです。
いやー、あこがれの人ばかりですよー。まさか直に話できる機会があるとは思わなかった。
(頂いた研究についての痛烈なコメントはこのさい忘れてしまおう(忘れちゃダメぢゃん・・・))
なんというか、最近幸せです。RHG / SICP reading とかで、雲の上の人だと思ってた人とかと会えてみたり。今回みたいに学会でお会いできてみたり。
このような方々と向き合えるように、精進しないとなぁ、とか思ったりするわけです。
ドキドキドキドキ
発表なのに、相変わらずノートに充電できない。残りの電池だけで、発表、もつかなぁ・・・。もう一台くらいノートPCを買うくらいの甲斐性が欲しいぞ。
絨毯がフカフカで3時のおやつにドーナツが出て、しかも指し棒が届かないような画面でのプレゼンでした。緊張した・・・。
明日もおやつを食べに行こうと思います。授業さぼって。
コーヒーとブラックブラックで相当気持ち悪かったのも、一回寝れば直った。よかったよかった。徹夜はするもんじゃないな。
ひげを剃ったら派手に唇を切ってしまった。なれないことはするもんじゃないな。
外歩いたら絶対おまわりさんに連れ去られてしまうな、この風情は・・・。ティッシュが邪魔で茶が飲めない。ストローで茶は嫌だな・・・。
(define (f1 f) (define (f2) 'f2) (f) ) (f1 (lambda () (f2)))
Scheme では、このコードはエラー。f2 ってのは、f1 の中からしか参照できない。
(defun f1 (f) (defun f2 () 'f2) (funcall f) ) (f1 #'(lambda () (f2)))
emacs-lisp ではこれはOK。まぁ、そうなるわな。
んで、xyzzy でも、OK。うーん、common-lisp 的にオッケーなんだろうか。
って、そうか。結局 S式を渡して eval してるだけなのか、funcall って。うーん、よくわからん。
うーん、やっぱり scheme がイイナァ。
そうか、#'f と f は違うのか。うーん、不思議だ common-lisp。
(defun mk () (defun f (y) y) f)
これが出来ずに悩んだ。
(defun mk () (defun f (y) y) #'f) (funcall (mk) 'test) ;> test
こっちが正解。
明日、見世物になってくるわけですが、なんかネタないかな・・・。
やばい、笑ってしまった。そうか、Amazonに意外なプライバシー漏洩に関する脆弱性が・・・。でも、そもそも X Box あるのかな。
やばい、なんかこの2年間ほど東京都から離れていないことが発覚。ほぼ、学校と家との往復してない。やばい、やばい。研究なんかしてる場合じゃない。
ぉ、日記のトップページが1万ヒット越えてる。というわけで、見事1万番を獲得した 10000 2003-5-27-2-19-57-40 Mozilla/5.0 Gecko rv:1.0.2 Windows NT 5.0 なK社の方、なんか下さい。
まつもとさんのプレゼンテーションを拝見させていただきました。C++ についての言語による曲線が面白かったです。C ってどういう曲線になるのかな。
言語のカッコヨサってなんだろ。やっぱりそれでプログラミングしてると女の人にもてたりする言語なんだろうか。
しかし、やっぱりプレゼンがうまいなぁ。明日の発表でなんか使えないかな(使えません)。
おお、これで中田さんの日常が明らかになっちゃったりするんでしょうか。
python ぜんぜんわかんねー。うわーん。
パイソニックという言葉を初めて知りました。他の言語だと、なんて言うんだろう。
システム設計21円で落札(/.j)。ソフトウェアってやすいんだな・・・。
昨日の続き。ちょっと揃えてみると、
(define (myabs x) ( (if (< x 0) - (else +)) x) ) ; scheme (defun myabs (x) (funcall (if (< x 0) '- (else '+)) x) ) ; xyzzy def myabs (x) x.send (if (x.< 0) then :-@ else :+@ end) end # ruby
いや、だから何だ、とか言われるとアレなんですが。揃え方が卑怯な気がしなくもない。
でも、scheme が funcall っぽいことが必要ないってのが目立つ。だからって、
3.(:abs) => 3.__send__ :abs
と解釈して欲しい、とかは誰も思わないんだろうなぁ。
def myabs (x) x.(if (x.< 0) ? :-@ : :+@ end) end # not ruby X(
こんなん。
そもそも意味的に違うか、:+@
と '+
は同じで +
は別もん。+
にあたるものは、Schemeにしか無い、のかな。
Perl とかってどうなるのかな。Perl は全然わからない。
勘違い発覚。Scheme において、 values
は (call/cc (lambda (c) ...))
と同様だと思っていて。
(display (let ((c1 values)) (display (let ((c2 values)) (display (let ((c3 values)) (c1 3) )))))) (newline) (display (call/cc (lambda (c1) (display (call/cc (lambda (c2) (display (call/cc (lambda (c3) (c1 3) )))))))))
2つのS式は同じモノだと思ったら、結果は(DrSchemeにて)
3#<void>#<void> 3
そうだよなぁ、そうしないと values を特別扱いしないとあかんもんなぁ。values は現在の continuation に対して複数の値を渡すためのもの、かね。
ブラックブラック4袋目。うーむ。
地震コワ。コワ。
先生、そのネタは旬が過ぎています!(ぉ
こんにちは。召喚されてきました。
python で myabs を一行で書く方法を思いつきません。 複数行で書くと全然面白くないですが、こんな感じです。
def myabs(x): if x<0: return -x return x
どうもありがとうございます。やっぱこれ以上無理ですかねぇ。メソッドを if で選択できる、みたいなものがあると面白いと思ったのですが。
def myabs(x):return filter(lambda x:x>0, (x,-x))[0] #思いつきました。けど、こういうのはパイソニックじゃないですね。
うーん、何やってるんだかわからない ^^;
PukiWiki を導入してみる。
理由。
YukiWiki => PukiWiki のデータの移行は結構楽だった。作業自体は、
[[]]
を付加。この仕様変更は腑に落ちん)プラグインとか入れると楽しい、サイドバーが楽しい。動作は意外と速い。BTSプラグインが、どう活用できるかが楽しみ。
学校に来てみるとサーバの不調。外につながらない。調べてみると、ゲートウェイマシンが落ちている。なんで? と思ったらUPSが死んでる。んで、UPSにつながってる機器が全部落ちてる。
なんか、UPSには嫌な思い出ばかりあるな。死ぬなら死ぬで、一人で死んでくれ。
しかし、読書会、RHG も SICP もそうなんですが、やっぱり飲みにまで行かないと面白くないなぁ。全然喋れないし。
Scheme に慣れてしまうと、関数の扱いで emacs とかで混乱。私は xyzzy ですけど。
; for scheme (define (myabs x) ((if (< x 0) - +) x)) (myabs 3) ;> 3 (myabs -3) ;> 3
こういうのは emacs とか common-lisp でどうやってかくのかしらん。勉強しないとなぁ。
(defun myabs (x) (funcall (if (< x 0) '- '+) x))
で、いいのかなぁ。
ruby だとこんな感じ?
class Numeric def myabs 0.send((0 > self ? :- : :+), self) end end p 3.myabs p -3.myabs
顔文字みたい。こう見ると common-lisp とかみたい。
今日は分数なので私でもわかります。多分。
部品化力ってなんかの発表で言ったら怒られるだろうなぁ、きっと。
コンストラクタとセレクタ(ゲッター)があれば、抽象は完了する。うーん。
やヴぁい、また眠くなってきた。
葉の数を数えるSchemeプログラム。CPS版。shiroさんのより。
(define (count-leaf t) (define (count-leaf-rec t cnt cont) (cond ((null? t)(cont cnt)) ((pair? t) (count-leaf-rec (car t) cnt (lambda (cnt) (count-leaf-rec (cdr t) cnt cont)))) (else (cont (+ cnt 1))))) (count-leaf-rec t 0 values)) ; (call/cc (lambda (cont) (count-leaf-rec t 0 cont)))) と同じ
values
と call/cc
で、似たような話ってやつ。うーん、values
ってのはこういうことだったのか。うう、詐欺くせー。実装依存は話な気がするんだがなぁ。
未だに values
がわかってないからなんとも言えんが。
Alyssa P. Hacker、いいなぁ。
うーん、飲みに行きたいなあ。
We are a group of Schemers, the majority of whom are in the Greater London region, but including people spread throughout the UK. Our interests cover just about anything vaguely related to Scheme, covering both practical and theoretical aspects.
うーん、Schemers ってのがかっこういいなぁ。日本にもこういうのってないのかなぁ。んで、ときどき合宿やんの。川合さんのところに(結局ハワイ行ってみたいだけかい!)。
なんか、前にバカが征くで書かれていたような気がするんだけど、日記システムのが結構統一されてきてますよね。日記システムの統一は、まぁどうでもいいんだけど、テーマ(見た目)がまったく同じなのが困る。
何が困るって、私は記憶力がないから見た目とか色とか雰囲気とか、そういうので誰々の日記だー、そういえばあんなこと言ってたよなー、とか思い出します。
要するに私の頭をもっと良くしてくださいって話。そういえば、人の顔を覚えるのも髪型とかで覚えてしまって、その人が髪切ったりするとわからなくなってしまう罠。あと服装とか。
少し整理。
素材更新 from 幻影素材工房。しかし、このサイト、素材へのアクセスが難しすぎる。いや、ENTER という文字を見つけるのが大変だったというだけですけど。
そういえば明日は sicp 読む日か。一ヶ月が早いなぁ。
さて、コメントの編集機能をつけてみました。人のコメントを改竄できます。さて、どうなるかなー。
某R計画終り。なんか、結局よくわからんまま終わった気が。二酸化炭素どうなったんじゃ。
nmake 初心者の話。ruby 1.8 cvs版を mswinでコンパイル、な話。
win32/configure.bat をすると、
### Makefile for ruby mswin32 ### srcdir = . MAJOR = 1 MINOR = 8 TEENY = 0 PROCESSOR_ARCHITECTURE = x86 PROCESSOR_LEVEL = 6 # OS = mswin32 # RT = msvcrt # RUBY_INSTALL_NAME = ruby # RUBY_SO_NAME = $(RT)-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR) # prefix = /usr # CFLAGS = -nologo -MD $(DEBUGFLAGS) $(OPTFLAGS) $(PROCESSOR_FLAG) # CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/missing -DLIBRUBY_SO=<<CONT>>quot;$(LIBRUBY_SO)<<CONT>>quot; # STACK = 0x2000000 # LDFLAGS = $(CFLAGS) -Fm # XLDFLAGS = # RFLAGS = -r # EXTLIBS = !include $(srcdir)/win32/Makefile.sub
というのを作っていただけます。ここで、RUBY_INSTALL_NAME を、1.8であることがわかるように、次のように変えました。
### Makefile for ruby mswin32 ### srcdir = . RUBY_INSTALL_NAME = ruby18d MAJOR = 1 MINOR = 8 TEENY = 0 PROCESSOR_ARCHITECTURE = x86 PROCESSOR_LEVEL = 6 # OS = mswin32 # RT = msvcrt # RUBY_INSTALL_NAME = ruby # RUBY_SO_NAME = $(RT)-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR) # prefix = /usr # CFLAGS = -nologo -MD $(DEBUGFLAGS) $(OPTFLAGS) $(PROCESSOR_FLAG) # CPPFLAGS = -I. -I$(srcdir) -I$(srcdir)/missing -DLIBRUBY_SO=<<CONT>>quot;$(LIBRUBY_SO)<<CONT>>quot; # STACK = 0x2000000 # LDFLAGS = $(CFLAGS) -Fm # XLDFLAGS = # RFLAGS = -r # EXTLIBS = !include $(srcdir)/win32/Makefile.sub
nmake をすると、
... /ruby/ext/dl/extconf.rb:154:in `initialize': wrong number of arguments(2 for 1) (ArgumentError) from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:154:in `initialize' from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:154:in `open' from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:154:in `update' from C:/ko1/tmp/rubycvs/ruby/ext/dl/extconf.rb:163 from ./ext/extmk.rb:85:in `load' from ./ext/extmk.rb:85:in `extmake' from ./ext/extmk.rb:227 from ./ext/extmk.rb:224:in `glob' from ./ext/extmk.rb:224 NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1'
RUBY_INSTALL_NAME = ruby18d
の書く位置を PROCESSOR_LEVEL = 6
の下に置いたら、エラーが出ずに通りました。
世の中には不思議が一杯です。
また、RUBY_INSTALL_NAME
の位置が一番上でも、なかださんに教えていただいた、ruby-dev:20265のパッチをあてる方法でもエラーが出ませんでした。
こういうものは見なかったことにするのが一番、なんでしょうかね。
うーん、朝日が・・・。
あと1時間。
オブジェクトの広場 6月号。今月はあの川合史朗さん。なぜかずっと河合さんだと思ってた。
最近 rucheme 触ってないなぁ・・・。
現実逃避に文字が化ける原因を探してみよう。
原因はわかった(URLな文字列に URI.escape をかけていただけ)が、対処方法がわからん。なんで URI.escape をかけていたかというと、変なリンク貼れないように、ということだったんだけど、% を %25 にしてしまうなぁ。どないしよ。
require 'uri' def validuri uri begin URI::parse uri rescue uri = '#' end uri end
結局こんなふうにしてみる。発見が遅れるかもしれんから、素直に例外を投げてしまったほうがいいのかもしらんなぁ。うーん。
ネットワークにつながらない原因がケーブルがささってなかったってオチ。よくあることですね・・・。
RUBY_INSTALL_NAMEの件は再現できませんでした。謎。
今ノートPCでやってみたんですが、再現しませんでした。見なかったことにしたほうが良さそうですね。
初めてホイホイさんを見て、かっこいー、とか思う夜中。
S/390 って結局どうなったのかな。オークションページにアクセスできないし。
肩とか、体中が重い・・・。なんか変なもん憑いてきたんかなぁ・・・。
p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1}) #=> syntax error
というのは、ruby 1.8 だとエラーになるんですねぇ。
cond = yield(car lst) #=> warning: parenthesize argument(s) for future version
これが警告。ふむふむ。Lispは嫌い、と(違)
1.6 ばっか使ってちゃだめだなぁ。これから 1.8 を使うようにしようか。
はて、Google でホイホイさんをひいたリンクが変。どこの問題だろう。う、エスケープしてるところの問題か。どこでエスケープしたんだろう。CGIでひっぱってきたときにそのままになってるのかな?
道化は嫌です。道化なら、せめて自分が道化だと気づかせないで。
そのたった一言があれば道化にならずにすんだのに。
おにいちゃんMLって、いったいなにをするのだろう・・・。兄としてのあるべき姿を探求する、とか。兄の呼び方について、その新しい方式の模索や従来の方式との研究、評価を行い、文化人類学的な(略)。
とりあえず、128人までは大丈夫にして下さい(何を)。
あ、兄 -> 妹、という発想からして駄目なのか、もしかして。
兄貴としてのあり方、では。ポージングとか。
ああ、なるほど、それは出てこなかったです。
「おにぃちゃん」というのは現在富士ゼロックスと共同研究をしている某プロジェクトのコードネームです。……なんて事はなくて、ある人物の仇名で「兄 -> 妹、という発想」は極めて正しかったりします。(^^;
うーん、寝すぎた。あぁ、登校拒否したい。
世界のインターネット放送ガイド。たくさんあるなぁ。今更なんですが、ライブでインターネットラジオをやっているところがあるんですね。日本では他にあるのかな。
英語のなんかをダラダラ聞いていたら、英語に馴れるかなー、とか思っていたら、聞き流す癖がついてしまいそう。なんか英会話ができるようになる手はないものか。
Google で RAA でさくっとひけないのは不便(Google依存症)
簡単に使える diff と、簡単に使える ruby script への色付ける何か、を探したいのだけれど、どうもコレというのがみつからないな。tikiのソースでもパクらせて使わせてもらおうかなぁ。
なんで楕円曲線の話がでてくるのかなー、とずっと不思議だったんですが、そうか、x**n+y**n の形か。いや、n=2 しか知らないんですけど。
なぜか体が震えて止まらない。別に風邪のようでもなく、酒や薬が切れたとか、そういうことでは多分ないと思うんだけど。はて?
英語しか話せない相手と燃えるような恋とか。
ぜひ紹介してください(違)
武市先生の論文コピーもっていくね。全数探索しかないのか?
今日、4時のupdatedbが気になって、 /etc/cron* を見ていたら、webalizerという存在を初めて知りました。毎晩毎晩アクセス解析をやっていたことにショック、というか、それを httpd で全開に公開していたことにショック。うぁ、ファイル名まで並べてる・・・、やべー。URLを一般に公開していなかったのが救いか。やっぱ、なんちゃってサーバは怖いなぁ・・・。
うーん、これって常識なのかなぁ。常識なような気もするなぁ。きっと、まだまだ知らないことがあるに違いない。いや、ASUMIさんなんですが。
S390 でcvsサーバとかやらないんだろうか、とかふと思ってみる。
The Athene Operating System(/.)。商用なんだ。こういう商売も面白いな。
今日もTAだったんですが、いろんな人が居て面白い。
C マガジン、いつのまにか6月号出てるし。先月の全然読んでないよ・・・。
「時間がないから」というのは、「それをするために時間がとれないから」、つまりは「そんなことをするための時間なんぞ取らん/取れんから」という意味で。もちろん免罪符になるものじゃなく、自分の中の優先度について、その用件がどの位置にあるのか、ということを相手に伝える行為に他ならないわけで。
よくわからないものについては渋い顔をして、得になりそうになったら前からそれを応援していたような顔をして、協力を惜しまない、みたいなことを言う。賢いなぁ。
すみません、愚痴ばっか。あぁ、時間が無い(ぉ。
勿論自戒です。自戒。特定の何があるわけではありません。多分。
S390、51万円だと、もう手が出ないなぁ・・・。どこまで上がるのかな。
機動警察パトレイバー THE MOVIE3 WXIII を見てみる。何がいいたいのかようわからんなぁ。
欲しい[気はする]*けど、ネットオークションなんて絶対**伝票受け付けないよな
2,3万のころだったらしゃれで買えたんですけどねぇ ^^;
ko1@lalune:~/tmp/gcc-3.3$ time make (略) real 131m13.523s user 108m50.950s sys 18m47.290s
2時間かー。殆ど gcj の実行だった気がする。
たくさん寝る。朝寝て、昼に寝て、夜にも寝るかもしれない。
各所で話題になっている(らしい)、オークション至上最大!?IBM S/390。うーん、是非学校で買って貰えないかなぁ。まだ実物をお目にかかったことがないんで、見てみたいなぁ。
この値段なら、個人で買ってもいいけど、置くところ無いしなぁ。
WebDAV でファイルを置くと、umask 067な状態。うーん、この設定を変える方法は無いものか。なんか、Google様に聞いたらソース書き換えろとか書いてあるし。RPMで入っている私のマシンにどうしろと。
put には umask 設定するところがあるのになぁ。こういう利用用途は考えていないんだろうか。
最近地震が多いなぁ・・・。
森山和道の「ヒトと機械の境界面」。メモ。
情報処理学会の情報処理2003 Vol.44 No.5 Rubyの真実 を見ました。さすがにこういうところではお名前は漢字なのですね。ネイティブスレッドと共存できる保守的なガベージコレクションを移植性を高くして実装できるもんなのかな。どうやるんだろう。
eval.c は何度も挑戦しては敗れ、って感じなのですよね。ヨワ。というか、私はなんのために RHGを持ってるんだ、って気がする。
なんか、アレなんで(謎)、gcc3.3 を ./configure ; make してみたんだけど、終わらない。全然終わらない。
延々と何やってるのかと思ったら、gcj で *.java をコンパイルしてる。うーん、さすが。
libjava/java/lang/Object.java の最初のコメントが笑った。
// Object.java - The root of all evil.
しかも、読んでる真最中というプレッシャー:-)
block_pass()だろうってことは分かったんですけどねぇ。eval.cはなかなか。
ほんとうは、eval.c のコードを見てから投稿しようかとか思ったんですが、見てもよくわからないんで投げました・・・。すんません・・・。
今週のPrologはProlog で関数型言語を実装しよう、というもの。型のないMLみたいな感じ。うー、難解。APL ってこんな言語なんですか。
というわけで、お酒のみに行ってきます。
んー、どうやったら mod 6 な条件を試せるのかな。ちっちゃい順にするには、結局三乗和を求めなければならないし。
まずいー、ゼミの準備が全然できてないー。Ramanujan を解いてましたー(というか、解法をRubyとschemeに落としてました)って書くのもアレだしな。一応OS研究室だし。
SPECInt のアプリケーションの名前の 164.gzip とかの、164 っていう数字はいったい何を表しているんだろう。うーむ。
なんというか、さぼっていた分のいろいろな用事が襲ってくるー。
[ruby-talk:71386]、おお、まつもとさんの説明綺麗だ・・・。
しかし、ruby-talk って、なんでSubjectに通し番号とかのヘッダが付かないんだろう。
あのHaskellのコード を大体そのまま ruby におとしました。
def f x x[0]**3+x[1]**3 end def fsort k r = [[k,k]] j = k prc = lambda{ j+=1 [[k,j],prc] } r.push lambda{ fmerge(prc,fsort(k+1)) } end def fmerge xs,ys if xs.kind_of? Proc x,xs = xs.call else x,xs = xs end if ys.kind_of? Proc y,ys = ys.call else y,ys = ys end if f(x) <= f(y) [x,lambda{fmerge xs,[y,ys]}] else [y,lambda{fmerge [x,xs],ys}] end end def ramanujan r b,r = r r = r.call found = 0 while found < 100 a,r = r #p a r = r.call if f(a) == f(b) p "#{a.inspect},#{b.inspect}" found += 1 end b = a end end ramanujan fsort 1
さすがに長くなるなぁ・・・。というか、何やってんだ、俺。
def f x; x[0]**3+x[1]**3 ; end def inc1(k) j = k prc = lambda{k+=1;[[k,j],prc]} end def fsort k [[k,k],lambda{fmerge(inc1(k),fsort(k+1))}] end def fmerge xs,ys x,xs = (Proc === xs) ? xs.call : xs y,ys = (Proc === ys) ? ys.call : ys f(x) <= f(y) ? [x,lambda{fmerge xs,[y,ys]}] : [y,lambda{fmerge [x,xs],ys}] end def ramanujan r b,r = r r = r.call found = 0 while found < 100 a,r = r r = r.call if f(a) == f(b) p "#{a.inspect},#{b.inspect}" found += 1 end b = a end end ramanujan fsort 1
なんというか、無理やり短くしてみる。
ramanujan 自体の短縮はめんどうになったんでヤメ。zip 書くとしたらどうなるかな・・・。
調子に乗ってみる。Ruby で Haskell っぽく。
def inflist x,&b ; lambda{[x,inflist(b.call(x),&b)]} ;end def car(lst) ; car,cdr = (Proc === lst) ? lst.call : lst ; car ; end def cdr(lst) ; car,cdr = (Proc === lst) ? lst.call : lst ; cdr ; end def zip(xs,ys) ;[[car(xs),car(ys)],lambda{zip cdr(xs),cdr(ys)}] ; end def take n,lst r = [] n.times{ r << car(lst);lst = cdr(lst) } ; r end def filter lst cond = yield(car lst) while !cond lst = cdr lst cond = yield(car lst) end [car(lst),lambda{filter cdr(lst),&proc}] end # take 10 zip([2..],[3,2..]) p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1}) # take 10 [x| x<-[0..], x % 2 == 0] p take(10,filter(inflist(0){|x| x+1}){|x| x % 2 == 0})
ramanujan のアレを、こいつで解いてみる。
def inflist x,&b ; lambda{[x,inflist(b.call(x),&b)]} ;end def car(lst) ; car,cdr = (Proc === lst) ? lst.call : lst ; car ; end def cdr(lst) ; car,cdr = (Proc === lst) ? lst.call : lst ; cdr ; end def zip(xs,ys) ;[[car(xs),car(ys)],lambda{zip cdr(xs),cdr(ys)}] ; end def take n,lst r = [] n.times{ r << car(lst);lst = cdr(lst) } ; r end def filter lst cond = yield(car lst) while !cond lst = cdr lst cond = yield(car lst) end [car(lst),lambda{filter cdr(lst),&proc}] end # take 10 zip([2..],[3,2..]) #p take(10,zip inflist(2){|x|x+1},inflist(3){|x|x-1}) # take 10 [x| x<-[0..], x % 2 == 0] #p take(10,filter(inflist(0){|x| x+1}){|x| x % 2 == 0}) def f x; x[0]**3+x[1]**3 ; end def fsort k [[k,k],lambda{fmerge(inflist([k,k+1]){|x| [k,x[1]+1]},fsort(k+1))}] end def fmerge xs,ys x = car(xs); xs = cdr(xs) y = car(ys); ys = cdr(ys) f(x) <= f(y) ? [x,lambda{fmerge xs,[y,ys]}] : [y,lambda{fmerge [x,xs],ys}] end #p take 20,zip(fsort(1),cdr(fsort(1))) p take 10,filter(zip(fsort(1),cdr(fsort(1)))){|x| f(x[0]) == f(x[1]) }
おわりませーん。誰か、いいマシンを持っている人試してください(笑)。
単純な勘違いかと思っていたら、なんか根がふかそう?
def f x end def m x b = proc f yield,&b end prc = m(3){|x| p 'test1' }
これは通らない。1.6.8 だと segv する。上でも、エラーが出る?
確認しようとしても、コンパイルにはautoconf のバージョンアップが必要らしい。めんどいなぁ。コンパイル済みのをもってくるか。
def f x yield end def m x,&b f(b.call,&b) end prc = m(3){|x| p 'test1' }
これで回避。しかし、なんで?
追試。
def f x yield end def m x f(proc.call, &proc) # 7行目 end prc = m(3){|x| p 'test1' } #=> Exception `ArgumentError' at c:/ko1/src/rb/t.rb:7 - tried to create Proc object without a block
うーん、なんか知らない概念があるんだろうか。
[ruby-dev:12311] までの議論ってことなんだろうか? 最新版入れて試そうっと。
付けないでという要望が多かったから。海外ではそれがふつうらしい。
さらに comp.lang.ruby とのゲートウエイもあるってことで。
背景は分かりませんが、fmlでは付けないのが推奨されてますね。自分は付ける設定してますけど:-p
なるほど、価値観の違い、なのかなぁ。NetNews は使ったことがないのでよくわかりませんが。
おお、ruby-math へどうぞ。
明日、学校に行ったら投稿してみます。
誰かscheme版でもっと素敵な解法書いてくれないかなー。
ふと、require_from 'http://nantoka/kantoka.rb'
とかいうのがあると面白いかも、とか思ってみる。proxyとかあると面倒そうだなぁ。
[ruby-math:00859] より。
なるほど、A**3 + B**3 == C**3 + D**3 なら A + B ≡ C + D (mod 6)
なんでー、なんでなんでー。数学はわからなーいー。
掲示板のほうに笹川さんに研究日誌、と言われてなんのことか全然わからなかった。ヤヴァイ、全然研究のこと書いてないぞ。
でも、研究のことは、いろいろ書けないことも多そうなんだけど。うーん、どうなのかな。そもそも研究なんてやってるのか、という噂もあるが。
あぁ、MD5まで、さすがでございます。さすがに net-require のrequire はネットではできない、と。
恥ずかしながら、合同の定義からして覚え違いをしておりました。いやー、はっはっは(笑い事じゃない)。やっと理解できました。
Haskell版の答え、やっと理解できた。そうか、遅延リストの遅延リストを作ってるのか。2次元に広がっていくリスト?
曰く「貧乏人は unless を使え」だそうです。(これだけじゃ全然わかんねーな)
私はこれから if を捨てないといけないのかー(違)。
class Hue;end class Hoe < Hue def m; p '1' ;end end class Hoe < Hue end p Hoe.ancestors Hoe.new.m #=> ok class Hue;end class Hoe < Hue def m; p '1' ;end end class Hoe < Object end p Hoe.ancestors Hoe.new.m #=> error
ふむふむ。
要するに、「貧乏人はelseを使うな」ということらしいです(さらに違う)。
ぼーっと考えていたんですが、ruby って def =(v)
ってできないんですね。いや、あたりまえっちゃぁあたりまえですけど。自分的にはヒットだったもんで、つい。
いや、C++ じゃできたよなー、なんでRuby でできないんだろー、とぼけーっと考えていただけなんですが。'=' はオブジェクトへなんかするわけでなく、変数(いれもの)に対してなんかするもん、と。
リファレンスを仮想化するような言語ってないんだろうか。(C?(笑))
架空風景「遺書」。やばい、笑いすぎた。
Io(ruby-talk:71331)。言語がどうの、というより、ページのデザインが素敵。BNF からああいう図を作るソフトってのがあるんじゃろうか。
これはどうでしょうか: http://raa.ruby-lang.org/list.rhtml?name=net-require
mod 2 でも mod 3 でも x**3 ≡ x だからです。
ヒントをありがとうございました。(^^)
タクシーかけご飯が昨日から頭から離れず、眠れないのでちょこちょこと。
問題の定義を明確にしておくと、a,b,c,d は自然数で、a<c<d<b とする。で、x = a**3 + b**3 == c**3 + d**3 となる x を、小さい順に求める。また、x を作る a,b,c,d も同時に答える。ということにしておく。
とりあえず ruby でこちょこちょと。
def sumcube e e[0]**3+e[1]**3 end def taxi_nums n b = yield ; found = 0 while found < n a = yield #puts "#{a.inspect} => #{sumcube a}" if sumcube(a) == sumcube(b) a,b = b,a if a[0] > b[0] puts "#{a.inspect} , #{b.inspect} => #{sumcube(a)}" found += 1 end b = a end end queue = [[9,[1,2]]] taxi_nums(30){ r = queue.shift queue << [r[0],r[1]+1] queue << [r[0]+1,r[1]] if r[0]+1 < r[1] queue.sort!{|a,b| sumcube(a) <=> sumcube(b) } queue.uniq! r }
うーん、まだまだ長いし非効率だ。セミコロンつかってるのは卑怯かなぁ。
というか、状態を持つってこと自体、これをそのままschemeに落としたらまずい気がする。
・・・queue を引数で渡してしまえばいいんかな。
def sumcube e e[0]**3+e[1]**3 end def taxi_nums n b = yield ; found = 0 while found < n a = yield #puts "#{a.inspect} => #{sumcube a}" if a[0] == b[0] a,b = b,a if a[1][0] > b[1][0] puts "#{a.inspect} , #{b.inspect} => #{a[0]}" found += 1 end b = a end end queue = [[1,2]] taxi_nums(30){ r = queue.shift a = r[1][0] b = r[1][1] c = [a,b+1] queue << [sumcube(c),c] if a+1 < b c = [a+1,b] queue << [sumcube(c),c] end queue.sort!{|a,b| a[0] <=> b[0] } queue.uniq! r }
22秒から3秒。って、これは前がひどかっただけな気が・・・。uniq 外せれば速くなるんだろうけどなぁ。
def sumcube e e[0]**3+e[1]**3 end def taxi_nums n b = yield ; found = 0 while found < n a = yield #puts "#{a.inspect} => #{sumcube a}" if a[0] == b[0] a,b = b,a if a[1][0] > b[1][0] puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}" found += 1 end b = a end end queue = [[9,[1,2]]] taxi_nums(30){ r = queue.shift a = r[1][0] b = r[1][1] c = [a,b+1] queue << [sumcube(c),c] if a+1 == b c = [a+1,b] queue << [sumcube(c),c] end queue.sort!{|a,b| a[0] <=> b[0] } r }
2秒。あとはsortが速くなることを期待するだけ(ぉ。rubyの組み込みソートが何使ってるか知らんけど。priority queue を作ろうかと思ったけど血迷ってるよなぁ、と考えて辞め。
記念(何の)に、100個答え。を書いていたのだけど、あまり面白くないので削除。
児玉さんの priority queue for Ruby. を利用したら、30個を0.5秒。100個を2秒。ハヤ。
GHC だともっと速かったりするのかしらん。
[ruby-math:00851] Ramanujan Number。お、たいむりー?
if a+1 == b
じゃなくて a+2
だなぁ・・・。
priority queue 利用版も書いておこうっと。
def sumcube e e[0]**3+e[1]**3 end def taxi_nums n b = yield ; found = 0 while found < n a = yield #puts "#{a.inspect} => #{sumcube a}" if a[0] == b[0] a,b = b,a if a[1][0] > b[1][0] puts "#{a[1].inspect} , #{b[1].inspect} => #{a[0]}" found += 1 end b = a end end require 'pqueue' queue = PQueue.new lambda{|x,y| x[0] < y[0] } queue.push [9,[1,2]] taxi_nums(30){ r = queue.pop a = r[1][0] b = r[1][1] c = [a,b+1] queue.push [sumcube(c),c] if a+2 == b c = [a+1,b] queue.push [sumcube(c),c] end r }
pqueue.rb内、微妙に loop をつかうと遅いっぽいので、while true ; ... ; end に書き換えた。
今TA(さすがにTerminalAdapterはできないですが。2台あるんだけど、今売っても捨て値だよなぁ・・・)やってるんですが、Javaの実験で。いやー、なんかソースが書ける、わかるって凄いなぁ。
ruby-math に投稿してみようかとか思ったけどなんかネタ晴らしになりそうなのでやめとこう。
で、ですねぇ。RHG飲み会をさぼったのは(金が無いのと)ケースを買いに行くためだったんですよ。
というわけで、ケースを買いました。自宅サーバ用ケース。今までは電源込みで5000円。店頭で投売りのアレです。
今度はちゃんとしたやつを買いました。3.5インチベイが6個も入ります。電源も別々に買いました。ケースファンについても、初めてその存在を知りました。しかも、前面にも着けられるらしいです。というわけで、着けました。
・・・前面ファンうるせー。夏まで止めとこう。
金が無いのでSICP飲み会も微妙な感じが。うーん、どうしようかな。飲み会に行かない代わりに K本さんに言語処理系の講義をしてもらったりなかったり。
編集追加、っと。
scheme版がやっと出来た。
; ((sum-of-cube a . b) ...) (define (taxi-numbers) (define (sumcube a b) (+ (expt a 3) (expt b 3))) (define (insert lst e) (if (or (null? lst) (>= (caar lst) (car e))) (cons e lst) (cons (car lst) (insert (cdr lst) e)))) ; next list (define (next lst e) (let ((a (car e)) (b (cdr e))) (insert (if (= (+ a 2) b) (insert lst (cons (sumcube (+ a 1) b) (cons (+ a 1) b))) ; then lst) ; else (cons (sumcube a (+ b 1)) (cons a (+ b 1)))))) (define (iter lst b) (let ((a (car lst))) (if (= (car a) (car b)) (cons (cons (cdr a) (cdr b)) (lambda () (iter (next (cdr lst) (cdr a)) a))) (iter (next (cdr lst) (cdr a)) a)))) (iter '((28 1 . 3)) '(9 1 . 2))) (define (display-taxi-nums max) (define (iter lst m) (if (= 0 m) #t (begin (display (car lst)) (newline) (iter ((cdr lst)) (- m 1))))) (iter (taxi-numbers) max) ) (display-taxi-nums 1000)
なんか、根本から考え方が間違えてる気がしなくもない。自分でも全然よみずらすぎるし。
NArray って、ウワ・・・それは卑怯じゃ。しかし、こんなのがあるんですね。今度使おうっと。
なんつうか、数学の理論屋さんと、代数屋さんの違いなんだろうか。
GHCしても速くならんでしょうなぁ。hugs よりは速いという程度でしょう
SICP第2章の写像の入れ子がタクシーの雰囲気に似てますね。
ぜひ ruby-math に送ってください。複数パターンで。明日ならもういいでしょう。(^^
笹田さんのこのページ、ウチの大学からアクセスできません。もしかして、*.ac.jpをはねてる?(^^;
いや、そんな素敵な設定はしてないはずなんですが。というか、これCGIじゃなくてHTMLなので、弾くならサーバ側でしか無理です(.htaccessも置いてないし)。当研究室のトップページからも、弾かれますでしょうか?
というか、*.ac.jp禁止にしたら、自分のところから見れません(笑)
RHG楽しかったです。
お家に帰って RWiki に書き込むまでが読書会です。
ということらしいんで、飲み会の報告楽しみにしてます。
たむらさんから。
GNome とか KDE が無いのは何故>GUI
GNOMEとかKDEって、プラットホーム非依存って考えてもいいんでしょうか?
GTK+ って前挫折した覚えが・・・(そればっか)。今度頑張ります。
Ramanujan のtaxi数。そういえば、学校そばの中華料理屋にタクシーかけご飯、というのがあったんですが、あれはいったいどういう意味なんでしょうか。
すごいかっこわるいんですが、なんというか、馬鹿正直にやった奴。taxi数を作る4つの自然数を求めるもの、だから、taxi-numbers という名前はいけないんだろうな、きっと。
(define (taxi-numbers) (define n 0) (define max 100) (define cont #f) (define (cube x) (expt x 3)) (define (is-taxi-number a b c d) (if (or (= a b) (= a c) (= a d) (not (= (+ (cube a) (cube b)) (+ (cube c) (cube d))))) #f #t)) (define (taxi-iter a b c d) ;(display (list a b c d)) (newline) (if (is-taxi-number a b c d) (cons (list a b c d) (delay (apply taxi-iter (taxi-next a b c d)))) (apply taxi-iter (taxi-next a b c d)))) (define (taxi-next a b c d) (if (< (+ c 1) d) (list a b (+ c 1) d) (if (< (+ d 1) b) (list a b (+ a 1) (+ d 1)) (if (< (+ b 1) max) (list a (+ b 1) (+ a 1) (+ a 2)) (list (+ a 1) (+ a 1) (+ a 2) (+ a 3)))))) (taxi-iter 1 4 2 3) ;(is-taxi-number 2 16 9 15) ) (define (display-taxi-numbers lst) (display (car lst)) (newline) (display '--------------) (newline) (display-taxi-numbers (force (cdr lst)))) (display-taxi-numbers (taxi-numbers)) ;(taxi-numbers)
結果。
(1 12 9 10) -------------- (2 16 9 15) -------------- (2 24 18 20) -------------- (2 34 15 33) -------------- (2 89 41 86) -------------- (3 36 27 30) -------------- (3 60 22 59) -------------- (4 32 18 30) -------------- (4 48 36 40) -------------- (4 68 30 66) -------------- (5 60 45 50) -------------- (5 76 48 69) -------------- (6 48 27 45) -------------- (6 72 54 60) -------------- (7 84 63 70) -------------- (8 53 29 50) -------------- (8 64 36 60) -------------- (8 96 72 80) -------------- (9 34 16 33) -------------- (9 58 22 57) -------------- (10 27 19 24) -------------- (10 80 45 75) -------------- (11 93 30 92) -------------- (12 40 31 33) -------------- (12 51 38 43) -------------- (12 96 54 90) -------------- (15 80 54 71) -------------- (17 39 26 36) -------------- (17 55 24 54) -------------- (17 76 38 73) -------------- (18 68 32 66) -------------- (20 54 38 48) -------------- (20 97 33 96) -------------- (23 94 63 84) -------------- (24 80 62 66) -------------- (24 98 63 89) -------------- (29 99 60 92) -------------- (30 67 51 58) -------------- (30 81 57 72) -------------- (34 78 52 72) -------------- (35 98 59 92) -------------- (42 69 56 61) -------------- (47 97 66 90) -------------- (50 96 59 93) -------------- (51 82 64 75) -------------- (以下略)
すげーダセー。終了条件とか無いし・・・。しかし、a が小さいならtaxi数も小さい、って考えちゃっていいんだろうか。
さて、これからどうやって綺麗にしていこうか。そもそもアルゴリズム替えないと駄目やなぁ。
(define (taxi-numbers) (define n 0) (define max 100) (define cont #f) (define (cube x) (expt x 3)) (define (is-taxi-number a b c d) (if (or (= a b) (= a c) (= a d) (not (= (+ (cube a) (cube b)) (+ (cube c) (cube d))))) #f #t)) (define (taxi-iter a b c d) ;(display (list a b c d)) (newline) (if (is-taxi-number a b c d) (cons (list a b c d) (delay (apply taxi-iter (taxi-next a b c d)))) (apply taxi-iter (taxi-next a b c d)))) (define (taxi-next a b c d) (if (< (+ c 1) d) (list a b (+ c 1) d) (if (< (+ d 1) b) (list a b (+ a 1) (+ d 1)) (if (< (+ b 1) max) (list a (+ b 1) (+ a 1) (+ a 2)) (if (> a max) (begin (set! max (+ max 50)) (list 1 a 2 3)) (list (+ a 1) (+ a 1) (+ a 2) (+ a 3)))))) (taxi-iter 1 4 2 3) )
とりあえずこれで全部は求まりそうだけど、ソートはされないよなぁ・・・。
というか、begin とか使い出してる時点で負けって気がしないでもない。
うん、やらなきゃいけないアルゴリズムはわかってるはず。多分。
(a b) で、 a < b で、a**3+b**3 の小さい順を全て並べて、隣り合ったそいつらがtaxi-number かどうかをみればいい、と。はら先生があおきさんところで示しておられた東大のpdfに書いてあった奴そのままですけど。でも、Haskellが読めないのでどうやってるのか知りません(とか言う)。どうやってつくろーかなー。明日の授業中にでも考えてみよう。
gtk+は2なら標準でx11,win32,linuxfbに対応してます。あとDirectFBへの移植なんかもあります。
知らない単語ばっかりです。ごめんなさい・・・。
FlashMX なもの、楽しみにしてます :)
現状で、Rubyで使えるプラットホーム非依存なGUIフレームワークをあげると、
2D描画だけで考えれば、
とか見てるとOpen Media Toolkitがオープンソース化 という記事が。
世の中にはもっといろいろあるんだろうなぁ。これらの得失を考えるためには、やっぱり全部使ってみなくちゃいけないんだろうなぁ。そういう偉い人のページとかないものかな。
第 289 回 PTT のお知らせ 題名: Windows PCのためのGUI情報の抽出と転送 - 机から離れてPCを使おう 。
VNC じゃ駄目ってことなんだろうなぁ。最終的にはMS社員からリークしてもらう、とかいうお話が聞けるんだろうか。ドキドキ。
しかし、GUI操作情報を抽出してPDAに転送してPCリモコン、っていう表現、リモコンならこの逆なんじゃなかろうか、とか思ったんだけど、どうなんだろうか。
PC側にサーバひとつおけばおしまい、とかいう簡単な話じゃ無いんだろうなぁ。
GNome とか KDE が無いのは何故>GUI
車輪の再発明をしてみた。
うう、ちょいちょい直せばできるだろう、とか思ってたら、存外時間がかかってしまった・・・。一日仕事になってしまった。tDiaryが流行る訳です(笑)。
バグをおって時間がかかったのかな・・・。
とかはあったけど、やっぱりバグ追うのが時間かかったんだろうなぁ。
がーん、うまく行ってないし。直さないと・・・。よし、直った(ほんとかな)
しかし、ほんまどこで時間食ってたんだろう。CGIで、エラーメッセージが出せなくてすげー困ったんだよな、多分。そうか、自分ちのサーバでやればよかったのか・・・。普通に家に帰って・・・。
あかん、脆弱性ありすぎ・・・。
あと、エディタから直接更新する方法を考えなきゃ。
たむらさんありがとうございます。OpenBlocks がんばってください。
index.html を更新するタイミングで悩む。どうしたもんかな。
なんか、 rhg-tokyo@ruby.quickml.com へメールしても、なぜか投げられなかった送信に2時間かかったか。
いいな、沖縄。
SKKx => Kx(Kx) => x => Ix か。
[x](xax) => S([x](xa))([x]x) => S(S([x]x)(x[a]))I => S(SI(Ka))I
S にするのがよくわからんな。
[x](xa) => S([x]x)([x]a) => SI(Ka)
xa というのは、x(a) という理解でいいんだっけか・・・。
俺にはunlambdaは無理ってことで。
すげーけんか腰だなぁ・・・。怖い・・・。
今日買った本。
微妙に高かった(¥1900)。
書き途中のウィンドウを閉じてしまった。ウェブ上で日記の編集ってウザスギル。早くなんとかしなくては。
perl から exec('ruby ..')
は、perl の ircクライアントサーバである madoka でやってた気がする(google のアレ)。しっかし、編集機能つけてから帰ればよかったなぁ。
括弧の扱いは to_s((X),(S)):-to_s(X,S),!.
こうか。
mod_mp3 ってのがあるんですね。これは私の目的に合致するか? と試してみたんですが、駄目でした。
いい点。
わるい点。
これが絶望的です。たとえば、3段のツリーで、それぞれ枝が10づつついていて、葉も10とすると、1000ファイルあることになるんですが、これをディレクトリとっぱらってくれちゃうと1000曲ずらずらー、と選曲ページ(*1)に並べることになるわけです。これで選曲するのは絶望的です。
情報系の学部・学科出身者が書くプログラムは、そうでない人が書くプログラムよりも素敵なものになるのかどうか。
どちらも変わらないような気がする。学者連中は所詮論文を書くためにやってんだし、学者という立場の人々は、最後に論文という形に残すための手段としてプログラムを作成しているわけで、その手段であるプログラミングについて、たとえばどの程度洗練されたプログラムがかけるかについてはあまり関心がないのではないかな、と思います。事実、値さえ出ていれば main 一個だけしか関数がない Cプログラムでも十分なわけで。
プログラミングについての教育も、いわゆるいいプログラムを作るためのもの、ということはやらないような気がする。やったとしてソフトウェア工学の授業かな。授業自体はXPに入る前に終わってしまって、ユースケースとかまでだった覚えが。
もちろん、プログラミングの機会が他の学部・学科の人たちよりも多いことは確かなので、プログラミングを上達させるための機会が多い、という点はあると思います。あと、基礎の基礎について、授業があることは大きいのかな。データ構造とアルゴリズムの授業、とか。
ですが、たとえばプログラミングが趣味の人々と比べてどうか、というと微妙な気がします。本でわかることしか授業でやらんし。
もちろん、学術分野の人でも凄い人はいると思います。でも、情報系だからといって凄い人になるわけではない、つまり私のソースは駄目駄目であることのいいわけをしているわけです(ぉ。
自宅で音楽、現実解。
[自宅] apache(virtual hostでポートを変える) - sshd - *** *** [学校] - ssh - winamp(http://localhost:xxx/音楽ファイル名)
結局apacheで公開して、それをダウンロードするような形に。mp3はもともとファイル形式からストリーム再生可能だから、これでいいかあ、と。結局ローテクだなぁ・・・。
URLリストをスクリプトでシコシコ書いてみる。CGI.escape でいけるのかな、と思ったらなんか形式が違ってる。URI::escape で使うのか。
で、これでもういいやーとか思っていたら、やっぱり問題が。
WinAMPがURIを260バイトしか読まない。日本語でアーティスト名つけたフォルダの中の、日本語でアルバム名つけた中の日本語でファイル名つけたような mp3ファイル、これじゃ入りきらないわけです。うーん、なんてこった。
再生ソフトを変えれば問題ないのかなぁ・・・。お、メディアプレーヤーでは再生可能だ。でも、WMP使うのはいやだし。WinAmpのこの制限がなければ幸せになれたのになぁ・・・。
しかし、安定したスループットが出ないな。どこがあかんのやろ・・・。
ssh で長時間でかいデータ流すと、なんか止まるっぽい。どこがあかんのやろ。
あれ、これは気のせいかな・・・。
はて、掲示板につながらない。xrea がおちてるのか、消されたのか・・・。
え、今から何か腐らせないといけないんですか。10日のだとあと2日で腐るような食物を探さないと。
うへぇ、遅い。おうちから音楽をひっぱってきているのと同時に cvs co したら反応が返ってこない・・・。
なんというか・・・、オリジナリティの定義だよな・・・。
今日はまった話。
method_missingを利用した、単純な話です。Aのオブジェクトに対して投げられたメッセージは、そのまま@t に格納したテキストに対してそのメッセージを投げるようにします。
class A def initialize @t = "test" end def method_missing(msg,*arg) @t.send msg *arg end end p A.new.length
スタックオーバーフロー。気づくのにすんげー時間がかかった(ぉぃ。
なんでこれがパースがとーるのー・・・。
そうか、self.msg(*arg) やって、それが method_missing 呼んで、呼んで、呼んで、、、スタックオーバーフローしたのか。うーん。
PPP over SSH client for Windows。今度はこれをためそう。
まずい、発表15分、質疑5分と思っていたら、20/5分らしい。うぁー、やばいやばい。何しゃべればいいんだ。
うーん、 lambda{..}.call(..) と lambda{..}[..] が同じ意味だとは知らなかった・・・。日々発見。ちょっと気持ち悪い。
くだらないこと。
(define (plus x y) (define (plus_ x y) (if (= x 0) y (plus_ (- x 1) (+ y 1)))) (plus_ x y)) (plus (plus 3 4) (plus 5 6)) => ruby plus = lambda{|x,y| plus_ = lambda{|x,y| if(x == 0) y else plus_[x-1,y+1] end } plus_[x,y] } p plus[plus[3,4],plus[5,6]]
変換器は簡単? 末尾再帰の最適化はできないから、scheme はむりかー・・・。変換過程に末尾再帰をループにしてしまえばいいのか。うんん? どうやりゃええんかな。うーん、そのまんまでは無理かな。
shift/reset ってなんだろーって説明を探してみたけど、日本語のは見つけられなかった・・・。
読んでもよくわからんなぁ・・・。reset したところからの継続が保存されて、それを shift で参照できるとか、そういう話なのかな。
[ruby-list:37655]。=~
は Regexp.=~(String) が正解である、とよく聞くんですが、String.=~(Regexp) だと何がまずいんだろう、とかふと考えてみる。Regexp に文字を渡して「マッチして〜」と頼むのは、Regexp の存在意義からしてオッケーだと思うんだけど、String に Regexp を渡すのは不自然なんだろうか。それとも実装の問題なのかな? って、「マッチを行うのは Regexpだから」と理由が書いてありますね・・・。
Ruby ではそう実装しているから、が正解なのかな。どっちが主語に来ても問題ない気がする。
気になったので、
require "benchmark" include Benchmark LOOP_MAX = 1000000 def yloop puts measure{ LOOP_MAX.times{ yield } } end yloop{ /abc/ =~ 'abcabc' } yloop{ 'abcabc' =~ /abc/ } => 2.766000 0.000000 2.766000 ( 2.828000) 2.781000 0.000000 2.781000 ( 2.844000)
よかった、かわらん。
高層ビル脱出用パラシュート。こんなこと書いて怒られないのかなぁ・・・。
AMOEBA って、なんかの略って無いのかなー・・・。
製品情報/CF-W2A。凄いところが開くなぁ・・・。
プロセス間共有メモリって始めて使った。うーん、面白い。
Prolog、今回はこれで終わり。
/* 項書き換えシステム v2 */ run(X):-replace1(X,Y),nl,write(Y),swrite(Y),run(Y). /* normal order , leftmost rule, or call by name */ /* gyaku ni suruto applicative order, leftmost-innermost rule, or call by value */ replace1(X,Y):-r(X,Y),!. replace1(X,Y):-X=..[F|XL],r1l(XL,YL),Y=..[F|YL],!. r1l([X|L],[Y|L]):-replace1(X,Y),!. r1l([X|L],[X|M]):-r1l(L,M),!. /* prime number */ r(p(N),nth(N,primelist)). r(nth(s(0),[X|_]),X). r(nth(s(s(N)),[_|L]),nth(s(N),L)). r(primelist,sieveall(nlist(s(s(0))))). r(sieveall([N|L]),[N|sieveall(sieve(N,L))]). r(nlist(N),[N|nlist(s(N))]). r(sieve(N,[X|L]),if(zerop(mod(X,N)),sieve(N,L),[X|sieve(N,L)])). /* utility */ r(X+0,X). r(0+X,X). r(s(X)+Y,s(X+Y)). r(X+s(Y),s(X+Y)). r(if(true,X,_),X). r(if(false,_,Y),Y). r(zerop(0),true). r(zerop(s(_)),false). r(mod(X,Y),if(less(X,Y),X,mod(sub(X,Y),Y))). r(less(0,s(_)),true). r(less(_,0),false). r(less(s(X),s(Y)),less(X,Y)). r(X-0,X). r(s(X)-s(Y),X-Y). /* multiplier */ r(_*0,0). r(0*_,0). r(X*s(Y),X*Y+X). r(s(X)*Y,X*Y+Y). r(fact(s(0)),s(0)). r(fact(s(X)),s(X)*fact(X)). r(N,S):-number(N),N =\= 0,n2s(N,S),!. /* differential */ r(d(X,X),s(0)):-!. r(d(0,_),0):-!. r(d(s(Y),X),d(Y,X)):-!. /* n+x */ r(d(A+B,X),d(A,X)+d(B,X)):-!. r(d(A*B,X),d(A,X)*B+d(B,X)*A):-!. /* write s(..) as number */ swrite(X) :- to_s(X,N),writef(" --> "),write(N),!. swrite(_):-!. s2n_(s(X),M,N) :- M1 is M+1,s2n_(X,M1,N),!. s2n_(A,M,N) :- number(A),N is A+M,!. s2n_(A,M,A+M) :- !. s2n(s(X),N) :- s2n_(X,1,N). /* s2n(s(X),N):-s2n(X,N1),number(N1),N is N1+1,!. s2n(s(X),N+N1):-s2n(X,N1),!. */ /* format */ to_s(X,S):-s2n(X,S),!. to_s(X,X):-atomic(X),!. to_s(X,S):-s2n(X,X1),s2n(Y,Y1),append([X1],Y1,S),!. to_s(X+Y,XS+YS):-to_s(X,XS),to_s(Y,YS),!. to_s(X*Y,XS*YS):-to_s(X,XS),to_s(Y,YS),!. to_s((X),(X)):-!. test(A+B):-writeln(A),write(B). /* number to s(..) */ n2s(0,0):-!. n2s(N,s(S)):-number(N),N1 is N-1,n2s(N1,S),!.
さかいさんに教えていただくも、いまいちよくわからなかったので安易な手に・・・。
?- run(((3+5)*x)). x+x+x+x+x+x+x+x --> x+x+x+x+x+x+x+x ?- run(3*x*x + 4*x + 5). s(s(s(s(s((x+x+x)*x+ (x+x+x+x)))))) --> (x+x+x)*x+ (x+x+x+x)+5 ?- run(d(3*x*x + 4*x + 5,x)). s(s(s(s(x+x+x+ (x+x+x))))) --> x+x+x+ (x+x+x)+4
やっぱりうまく簡約化してくれないなー。KB法? そんなのしらねーっす。
run(fact(3+5)).
とかやったら止まらなくなった。さすが。
やらないといけないことが、終わらず、やらなくていいことばかりやっているような気がする。
まつもとさんの日記を読んで、ブロックの仕様を始めて理解しました。そうか、ループの抽象化から、こういう感じなのか(イテレータ、か)。
しかし、大変なんだろうなぁ。これだけのものを変更するのは。
return したら、ブロックを書いているメソッドから抜けてしまう、というのも初めて知った。こういうところはあえて無視するようにしてたからなぁ。
RSSニュース・フィードの紹介。2000年なんだなぁ。
httpd.conf をごにょごにょ弄っていたら、なんか変なところを消してしまったらしく、apacheが再起動不可能に。うーん、困った。バックアップ取らないと駄目だなぁ。
WebDAV という単語を教えてもらって、ちょっとやってたんですが。名前しか知らなかったんで、いい機会かな、と。
うーん、自分の用途には使えないっぽいです。日本語通すのめんどうくさそうだし、フォルダを WinAmp にドラッグしても再生してくれないし。いや、これはソフトが対応してないだけか。まだ、お気楽に使える土壌が整ってないというか(整えろよ自分で・・・)。
VPNとか、その辺を調べないと駄目かー。なんか馬鹿っぽい気もする。いっそ iPod 買うかなぁ・・・(そんな金どこにあるんだ)。
お気楽音楽生活はまだ遠い。
う、EasyMP3モジュール、欲しい。買ってくれないかなぁ。
今日はじめてFOLDOCを知る。研究者なら知ってて当然だろ、とか言われる。うー、ごめんなさい。
う、地震だ。一人で学校で地震に遭うと怖いな・・・。
急に台湾から spam が来るようになってきた。なんで?
音楽配信をやってみたい というのを書いてみる。
遠隔ドライブを windowsで簡単にマウントできる方法ってあるんでしょうか。
ノートPCがいよいよ電源が入らなくなってきた。一時期有効だったバッテリーを抜く、という手段も駄目。
一度放電させてみよう、とバッテリーのみでのPC起動を敢行。ruby -e 'loop{}' を走らせる。もしもの時は、2度と立ち上がらなくなってしまうが・・・。
お、5% まで減らしたら充電するようになった。よかったよかった。
んで、netradio、聞いているんですが、SHOUTcast のページのラジオ検索で、 japan って入れると上位にくる番組・・・。いや、日本じゃ絶対出来ないだろうなぁっていう、なんというか豪華な曲揃えが。
なんとか、簡単に選曲ができるようなものを考えてみる。
・家 Linuxサーバ ┌────────┐ │X │ │ 音楽再生ソフト├──>サウンドデバイス └──────┬─┘ │ ∧ V │ sc_trans─────> sc_serv vnc server │ │ │ ──────────┼──────────────────┼────── │ │ │ いんたーねっと(ssh) │ │ │ ──────────┼──────────────────┼────── ・学校 │ │ Windows クライアント│ │ │ V VNC client WinAmp
うーん、無駄/馬鹿っぽい。
カーネル再構築はめんどうだから嫌だしなぁ。
SHOUTcastの通信プロトコル解析。こんなページがあるんですね。うーん、サーバへ送信するやつを、自分で書いてしまうのも手か。
家から出ない -> 自転車にのらない -> 電池の消耗が気にならなくなってハッピー
単語解説。
■スタックマシン(消去)
謎。見なかったことにしてください。
無限リストをどう扱えばいいか、という点ではまる。
普通に eval してしまうと、無限に行ってしまうので・・・。うーん。(fibseq 1 1)
で、 (1 (fibseq 1 2))
を返すようにすればいいのか。つか、普通にこれで止まるような気もするんだがなぁ。なんで止まらないんだろう。
そうか、(cons 1 (fibseq y (+ x y)))
で、(fibseq ...)
を評価しようとするからだ。だから、cons
のみを特別扱いすれば問題無し?
う、何も考えずcons
をpairをくっつける実装にしたら(cons 1 (fibseq ...)
で (1 fibseq y (+ x y))
が返ってしまった。
Promise を作るような実装にしないと駄目かな・・・。
(define (fibseq x y) (cons x (fibseq y (+ x y)))) (define (pick n lst) (if (= n 1) (car lst) (pick (- n 1) (cdr lst)))) (define (fib n) (pick n (fibseq 1 1))) (fib 8)
なんとか、これが 21 を返すような処理系にすることができた。ほんま、Promise にするだけになっちゃったなぁ。
まともな scheme で書けば、
(define (fibseq x y) (cons x (delay (fibseq y (+ x y))))) (define (pick n lst) (if (= n 1) (car lst) (pick (- n 1) (force (cdr lst))))) (define (fib n) (pick n (fibseq 1 1))) (fib 8)
こんな感じ。force は要るか要らないかは処理系に拠るような気がする。
(cons (+ 1 2) (+ 3 4))
が (#<Rucheme::Promise:0x2b643c8> . #<Rucheme::Promise:0x2b643b0>)
こうなってしまう。うーん、参ったなぁ。計算過程的にはこれでいいんだが・・・。to_s に細工してしまおうか。でも、計算過程の表示が悲惨なことになってしまう予感。
結局、最後の結果だけ無限リストでもなんでも表示するようにする。
(define (fibseq x y) (cons x (fibseq y (+ x y)))) (fibseq 1 1)
これの答えを、
ans => (1 (1 (2 (3 (5 (8 (13 (21 (34 (55 (89 (144 (233 (377 (610 (987 (1597 (2584 (4181 (6765 (10946 (17711 (28657 (46368 (75025 (121393 (196418 (317811 (514229 (832040 (1346269 (2178309 (3524578 (5702887 (9227465 (14930352 (24157817 (39088169 (63245986 (102334155 (165580141 (267914296 (433494437 (701408733 (1134903170 (1836311903 (2971215073 (4807526976 (7778742049 (12586269025 (20365011074 (32951280099 (53316291173 (86267571272 (139583862445 (225851433717 (365435296162 (591286729879 (956722026041 (1548008755920 (2504730781961 (4052739537881 (6557470319842 (10610209857723 (17167680177565 (27777890035288 (44945570212853 (72723460248141 (117669030460994 (190392490709135 (308061521170129 (498454011879264 (806515533049393 (1304969544928657 (2111485077978050 (3416454622906707 (5527939700884757 (8944394323791464 (14472334024676221 (23416728348467685 (37889062373143906 (61305790721611591 (99194853094755497 (160500643816367088 (259695496911122585 (420196140727489673 (679891637638612258 (1100087778366101931 (1779979416004714189 (2880067194370816120 (4660046610375530309 (7540113804746346429 (12200160415121876738 (19740274219868223167 (31940434634990099905 (51680708854858323072 (83621143489848422977 (135301852344706746049 (218922995834555169026 (354224848179261915075 (573147844013817084101 (927372692193078999176 (1500520536206896083277 (2427893228399975082453 (3928413764606871165730 (6356306993006846248183 (10284720757613717413913 (16641027750620563662096 (26925748508234281076009 (43566776258854844738105 (70492524767089125814114 (114059301025943970552219 (184551825793033096366333 (298611126818977066918552 (483162952612010163284885 (781774079430987230203437 (1264937032042997393488322 (2046711111473984623691759 (3311648143516982017180081 (5358359254990966640871840 (8670007398507948658051921 (14028366653498915298923761 (22698374052006863956975682 (36726740705505779255899443 (59425114757512643212875125 (96151855463018422468774568 (155576970220531065681649693 (251728825683549488150424261 (407305795904080553832073954 (659034621587630041982498215 (1066340417491710595814572169 (1725375039079340637797070384 (2791715456571051233611642553 (4517090495650391871408712937 (7308805952221443105020355490 (11825896447871834976429068427 (19134702400093278081449423917 (30960598847965113057878492344 (50095301248058391139327916261 (81055900096023504197206408605 (131151201344081895336534324866 (212207101440105399533740733471 (343358302784187294870275058337 (555565404224292694404015791808 (898923707008479989274290850145 (1454489111232772683678306641953 (2353412818241252672952597492098 (3807901929474025356630904134051 (6161314747715278029583501626149 (9969216677189303386214405760200 (16130531424904581415797907386349 (26099748102093884802012313146549 (42230279526998466217810220532898 (68330027629092351019822533679447 (110560307156090817237632754212345 (178890334785183168257455287891792 (289450641941273985495088042104137 (468340976726457153752543329995929 (757791618667731139247631372100066 (1226132595394188293000174702095995 (1983924214061919432247806074196061 (3210056809456107725247980776292056 (5193981023518027157495786850488117 (8404037832974134882743767626780173 (13598018856492162040239554477268290 (22002056689466296922983322104048463 (35600075545958458963222876581316753 (57602132235424755886206198685365216 (93202207781383214849429075266681969 (150804340016807970735635273952047185 (244006547798191185585064349218729154 (394810887814999156320699623170776339 (638817435613190341905763972389505493 (1033628323428189498226463595560281832 (1672445759041379840132227567949787325 (2706074082469569338358691163510069157 (4378519841510949178490918731459856482 (7084593923980518516849609894969925639 (11463113765491467695340528626429782121 (18547707689471986212190138521399707760 (30010821454963453907530667147829489881 (48558529144435440119720805669229197641 (78569350599398894027251472817058687522 (127127879743834334146972278486287885163 (205697230343233228174223751303346572685 (332825110087067562321196029789634457848 (538522340430300790495419781092981030533 (871347450517368352816615810882615488381 (1409869790947669143312035591975596518914 (2281217241465037496128651402858212007295 (3691087032412706639440686994833808526209 (5972304273877744135569338397692020533504 (9663391306290450775010025392525829059713 (15635695580168194910579363790217849593217 (25299086886458645685589389182743678652930 (40934782466626840596168752972961528246147 (66233869353085486281758142155705206899077 (107168651819712326877926895128666735145224 (173402521172797813159685037284371942044301 (280571172992510140037611932413038677189525 (453973694165307953197296969697410619233826 (734544867157818093234908902110449296423351 (1188518561323126046432205871807859915657177 (1923063428480944139667114773918309212080528 (3111581989804070186099320645726169127737705 (5034645418285014325766435419644478339818233 (8146227408089084511865756065370647467555938 (13180872826374098837632191485015125807374171 (21327100234463183349497947550385773274930109 (34507973060837282187130139035400899082304280 (55835073295300465536628086585786672357234389 (90343046356137747723758225621187571439538669 (146178119651438213260386312206974243796773058 (236521166007575960984144537828161815236311727 (382699285659014174244530850035136059033084785 (619220451666590135228675387863297874269396512 (1001919737325604309473206237898433933302481297 (1621140188992194444701881625761731807571877809 (2623059926317798754175087863660165740874359106 (4244200115309993198876969489421897548446236915 (6867260041627791953052057353082063289320596021 (11111460156937785151929026842503960837766832936 (17978720198565577104981084195586024127087428957 (29090180355503362256910111038089984964854261893 (47068900554068939361891195233676009091941690850 (76159080909572301618801306271765994056795952743 (123227981463641240980692501505442003148737643593 (199387062373213542599493807777207997205533596336 (322615043836854783580186309282650000354271239929 (522002106210068326179680117059857997559804836265 (844617150046923109759866426342507997914076076194 (1366619256256991435939546543402365995473880912459 (2211236406303914545699412969744873993387956988653 (3577855662560905981638959513147239988861837901112 (5789092068864820527338372482892113982249794889765 (9366947731425726508977331996039353971111632790877 (15156039800290547036315704478931467953361427680642 (24522987531716273545293036474970821924473060471519 (39679027332006820581608740953902289877834488152161 (64202014863723094126901777428873111802307548623680 (103881042195729914708510518382775401680142036775841 (168083057059453008835412295811648513482449585399521 (271964099255182923543922814194423915162591622175362 (440047156314635932379335110006072428645041207574883 (712011255569818855923257924200496343807632829750245 (1152058411884454788302593034206568772452674037325128 (1864069667454273644225850958407065116260306867075373 (3016128079338728432528443992613633888712980904400501 (4880197746793002076754294951020699004973287771475874 (7896325826131730509282738943634332893686268675876375 (12776523572924732586037033894655031898659556447352249 (20672849399056463095319772838289364792345825123228624 (33449372971981195681356806732944396691005381570580873 (54122222371037658776676579571233761483351206693809497 (87571595343018854458033386304178158174356588264390370 (141693817714056513234709965875411919657707794958199867 (229265413057075367692743352179590077832064383222590237 (370959230771131880927453318055001997489772178180790104 (600224643828207248620196670234592075321836561403380341 (971183874599339129547649988289594072811608739584170445 (1571408518427546378167846658524186148133445300987550786 (2542592393026885507715496646813780220945054040571721231 (4114000911454431885883343305337966369078499341559272017 (6656593304481317393598839952151746590023553382130993248 (10770594215935749279482183257489712959102052723690265265 (17427187520417066673081023209641459549125606105821258513 (28197781736352815952563206467131172508227658829511523778 (45624969256769882625644229676772632057353264935332782291 (73822750993122698578207436143903804565580923764844306069 (119447720249892581203851665820676436622934188700177088360 (193270471243015279782059101964580241188515112465021394429 (312718191492907860985910767785256677811449301165198482789 (505988662735923140767969869749836918999964413630219877218 (818706854228831001753880637535093596811413714795418360007 (1324695516964754142521850507284930515811378128425638237225 (2143402371193585144275731144820024112622791843221056597232 (3468097888158339286797581652104954628434169971646694834457 (5611500259351924431073312796924978741056961814867751431689 (9079598147510263717870894449029933369491131786514446266146 (14691098406862188148944207245954912110548093601382197697835 (23770696554372451866815101694984845480039225387896643963981 (38461794961234640015759308940939757590587318989278841661816 (62232491515607091882574410635924603070626544377175485625797 (100694286476841731898333719576864360661213863366454327287613 (162926777992448823780908130212788963731840407743629812913410 (263621064469290555679241849789653324393054271110084140201023 (426547842461739379460149980002442288124894678853713953114433 (690168906931029935139391829792095612517948949963798093315456 (1116716749392769314599541809794537900642843628817512046429889 (1806885656323799249738933639586633513160792578781310139745345 (2923602405716568564338475449381171413803636207598822186175234 (4730488062040367814077409088967804926964428786380132325920579 (7654090467756936378415884538348976340768064993978954512095813 (12384578529797304192493293627316781267732493780359086838016392 (20038668997554240570909178165665757608500558774338041350112205 (32423247527351544763402471792982538876233052554697128188128597 (52461916524905785334311649958648296484733611329035169538240802 (84885164052257330097714121751630835360966663883732297726369399 (137347080577163115432025771710279131845700275212767467264610201 (222232244629420445529739893461909967206666939096499764990979600 (359579325206583560961765665172189099052367214309267232255589801 (581811569836004006491505558634099066259034153405766997246569401 (941390895042587567453271223806288165311401367715034229502159202 (1523202464878591573944776782440387231570435521120801226748728603 (2464593359921179141398048006246675396881836888835835456250887805 (3987795824799770715342824788687062628452272409956636682999616408 (6452389184720949856740872794933738025334109298792472139250504213 (10440185009520720572083697583620800653786381708749108822250120621 (16892574194241670428824570378554538679120491007541580961500624834 (27332759203762391000908267962175339332906872716290689783750745455 (44225333398004061429732838340729878012027363723832270745251370289 (71558092601766452430641106302905217344934236440122960529002115744 (115783425999770513860373944643635095356961600163955231274253486033 (187341518601536966291015050946540312701895836604078191803255601777 (303124944601307480151388995590175408058857436768033423077509087810 (490466463202844446442404046536715720760753273372111614880764689587 (793591407804151926593793042126891128819610710140145037958273777397 (1284057871006996373036197088663606849580363983512256652839038466984 (2077649278811148299629990130790497978399974693652401690797312244381 (3361707149818144672666187219454104827980338677164658343636350711365 (5439356428629292972296177350244602806380313370817060034433662955746 (8801063578447437644962364569698707634360652047981718378070013667111 (14240420007076730617258541919943310440740965418798778412503676622857 (23041483585524168262220906489642018075101617466780496790573690289968 (37281903592600898879479448409585328515842582885579275203077366912825 (60323387178125067141700354899227346590944200352359771993651057202793 (97605290770725966021179803308812675106786783237939047196728424115618 (157928677948851033162880158208040021697730983590298819190379481318411 (255533968719576999184059961516852696804517766828237866387107905434029 (413462646668428032346940119724892718502248750418536685577487386752440 (668996615388005031531000081241745415306766517246774551964595292186469 (1082459262056433063877940200966638133809015267665311237542082678938909 (1751455877444438095408940282208383549115781784912085789506677971125378 (2833915139500871159286880483175021682924797052577397027048760650064287 (4585371016945309254695820765383405232040578837489482816555438621189665 (7419286156446180413982701248558426914965375890066879843604199271253952 (12004657173391489668678522013941832147005954727556362660159637892443617 (19423943329837670082661223262500259061971330617623242503763837163697569 (31428600503229159751339745276442091208977285345179605163923475056141186 (50852543833066829834000968538942350270948615962802847667687312219838755 (82281144336295989585340713815384441479925901307982452831610787275979941 (13313368816936281941934168235432679175087451727078530049929809949581869 6 (21541483250565880900468239616971123323080041857876775333090888677179863 7 (34854852067502162842402407852403802498167493584955305383020698626761733 3 (56396335318068043742870647469374925821247535442832080716111587303941597 0 (91251187385570206585273055321778728319415029027787386099132285930703330 3 (14764752270363825032814370279115365414066256447061946681524387323464492 73 (23889871008920845691341675811293238246007759349840685291437615916534825 76 (38654623279284670724156046090408603660074015796902631972962003239999318 49 (62544494288205516415497721901701841906081775146743317264399619156534144 25 (10119911756749018713965376799211044556615579094364594923736162239653346 274 (16374361185569570355515148989381228747223756609038926650176124155306760 699 (26494272942318589069480525788592273303839335703403521573912286394960106 973 (42868634127888159424995674777973502051063092312442448224088410550266867 672 (69362907070206748494476200566565775354902428015845969798000696945226974 645 (11223154119809490791947187534453927740596552032828841802208910749549384 2317 (18159444826830165641394807591110505276086794834413438782008980444072081 6962 (29382598946639656433341995125564433016683346867242280584217891193621465 9279 (47542043773469822074736802716674938292770141701655719366226871637693547 6241 (76924642720109478508078797842239371309453488568897999950444762831315013 5520 (12446668649357930058281560055891430960222363027055371931667163446900856 11761 (20139132921368877909089439840115368091167711883945171926711639730032357 47281 (32585801570726807967370999896006799051390074911000543858378803176933213 59042 (52724934492095685876460439736122167142557786794945715785090442906965571 06323 (85310736062822493843831439632128966193947861705946259643469246083898784 65365 (13803567055491817972029187936825113333650564850089197542855968899086435 571688 (22334640661774067356412331900038009953045351020683823507202893507476314 037053 (36138207717265885328441519836863123286695915870773021050058862406562749 608741 (58472848379039952684853851736901133239741266891456844557261755914039063 645794 (94611056096305838013295371573764256526437182762229865607320618320601813 254535 (15308390447534579069814922331066538976617844965368671016458237423464087 6900329 (24769496057165162871144459488442964629261563241591657577190299255524269 0154864 (40077886504699741940959381819509503605879408206960328593648536678988356 7055193 (64847382561864904812103841307952468235140971448551986170838835934512625 7210057 (10492526906656464675306322312746197184102037965551231476448737261350098 24265250 (16977265162842955156516706443541444007616135110406430093532620854801360 81475307 (27469792069499419831823028756287641191718173075957661569981358116151459 05740557 (44447057232342374988339735199829085199334308186364091663513978970952819 87215864 (71916849301841794820162763956116726391052481262321753233495337087104278 92956421 (11636390653418416980850249915594581159038678944868584489700931605805709 880172285 (18828075583602596462866526311206253798143927071100759813050465314516137 773128706 (30464466237021013443716776226800834957182606015969344302751396920321847 653300991 (49292541820623609906583302538007088755326533087070104115801862234837985 426429697 (79757008057644623350300078764807923712509139103039448418553259155159833 079730688 (12904954987826823325688338130281501246783567219010955253435512138999781 8506160385 (20880655793591285660718346006762293618034481129314900095290838054515765 1585891073 (33785610781418108986406684137043794864818048348325855348726350193515547 0092051458 (54666266575009394647125030143806088482852529477640755444017188248031312 1677942531 (88451877356427503633531714280849883347670577825966610792743538441546859 1769993989 (14311814393143689828065674442465597183052310730360736623676072668957817 13447936520 (23157002128786440191418845870550585517819368512957397702950426513112503 05217930509 (37468816521930130019484520313016182700871679243318134326626499182070320 18665867029 (60625818650716570210903366183566768218691047756275532029576925695182823 23883797538 (98094635172646700230387886496582950919562726999593666356203424877253143 42549664567 (15872045382336327044129125268014971913825377475586919838578035057243596 666433462105 (25681508899600997067167913917673267005781650175546286474198377544968911 008983126672 (41553554281937324111297039185688238919607027651133206312776412602212507 675416588777 (67235063181538321178464953103361505925388677826679492786974790147181418 684399715449 (10878861746347564528976199228904974484499570547781269909975120274939392 6359816304226 (17602368064501396646822694539241125077038438330449219188672599289657534 5044216019675 (28481229810848961175798893768146099561538008878230489098647719564596927 1404032323901 (46083597875350357822621588307387224638576447208679708287320318854254461 6448248343576 (74564827686199318998420482075533324200114456086910197385968038418851388 7852280667477 (12064842556154967682104207038292054883869090329558990567328835727310585 04300529011053 (19521325324774899581946255245845387303880535938250010305925639569195723 92152809678530 (31586167880929867264050462284137442187749626267809000873254475296506308 96453338689583 (51107493205704766845996717529982829491630162206059011179180114865702032 88606148368113 (82693661086634634110047179814120271679379788473868012052434590162208341 85059487057696 (13380115429233940095604389734410310117100995067992702323161470502791037 473665635425809 (21649481537897403506609107715822337285038973915379503528404929519011871 658725122483505 (35029596967131343602213497450232647402139968983372205851566400021802909 132390757909314 (56679078505028747108822605166054984687178942898751709379971329540814780 791115880392819 (91708675472160090711036102616287632089318911882123915231537729562617689 923506638302133 (14838775397718883781985870778234261677649785478087562461150905910343247 0714622518694952 (24009642944934892853089481039863024886581676666299953984304678866605016 0638129156997085 (38848418342653776635075351818097286564231462144387516445455584776948263 1352751675692037 (62858061287588669488164832857960311450813138810687470429760263643553279 1990880832689122 (10170647963024244612324018467605759801504460095507498687521584842050154 23343632508381159 (16456454091783111561140501753401790946585773976576245730497611206405482 15334513341070281 (26627102054807356173464520221007550748090234072083744418019196048455636 38678145849451440 (43083556146590467734605021974409341694676008048659990148516807254861118 54012659190521721 (69710658201397823908069542195416892442766242120743734566536003303316754 92690805039973161 (11279421434798829164267456416982623413744225016940372471505281055817787 346703464230494882 (18250487254938611555074410636524312658020849229014745928158881386149462 839394269270468043 (29529908689737440719341867053506936071765074245955118399664162441967250 186097733500962925 (47780395944676052274416277690031248729785923474969864327823043828116713 025492002771430968 (77310304634413492993758144743538184801550997720924982727487206270083963 211589736272393893 (12509070057908954526817442243356943353133692119589484705531025009820067 6237081739043824861 (20240100521350303826193256717710761833288791891681982978279745636828463 9448671475316218754 (32749170579259258353010698961067705186422484011271467683810770646648531 5685753214360043615 (52989271100609562179203955678778467019711275902953450662090516283476995 5134424689676262369 (85738441679868820532214654639846172206133759914224918345901286930125527 0820177904036305984 (13872771278047838271141861031862463922584503581717836900799180321360252 25954602593712568353 (22446615446034720324363326495847081143197879573140328735389309014372804 96774780497748874337 (36319386724082558595505187527709545065782383154858165636188489335733057 22729383091461442690 (58766002170117278919868514023556626208980262727998494371577798350105862 19504163589210317027 (95085388894199837515373701551266171274762645882856660007766287685838919 42233546680671759717 (15385139106431711643524221557482279748374290861085515437934408603594478 161737710269882076744 (24893677995851695395061591712608896875850555449371181438711037372178370 103971256950553836461 (40278817102283407038585813270091176624224846310456696876645445975772848 265708967220435913205 (65172495098135102433647404982700073500075401759827878315356483347951218 369680224170989749666 (10545131220041850947223321825279125012430024807028457519200192932372406 6635389191391425662871 (17062380729855361190588062323549132362437564983011245350735841267167528 5005069415562415412537 (27607511949897212137811384148828257374867589790039702869936034199539935 1640458606953841075408 (44669892679752573328399446472377389737305154773050948220671875466707463 6645528022516256487945 (72277404629649785466210830621205647112172744563090651090607909666247398 8285986629470097563353 (11694729730940235879461027709358303684947789933614159931127978513295486 24931514651986354051298 (18922470193905214426082110771478868396165064389923225040188769479920226 13217501281456451614651 (30617199924845450305543138480837172081112854323537384971316747993215712 38149015933442805665949 (49539670118750664731625249252316040477277918713460610011505517473135938 51366517214899257280600 (80156870043596115037168387733153212558390773036997994982822265466351650 89515533148342062946549 (12969654016234677976879363698546925303566869175045860499432778293948758 940882050363241320227149 (20985341020594289480596202471862246559405946478745659997715004840583924 030397583511583383173698 (33954995036828967457475566170409171862972815653791520497147783134532682 971279633874824703400847 (54940336057423256938071768642271418422378762132537180494862787975116607 001677217386408086574545 (88895331094252224395547334812680590285351577786328700992010571109649289 972956851261232789975392 (14383566715167548133361910345495200870773033991886588148687335908476589 6974634068647640876549937 (23273099824592770572916643826763259899308191770519458247888393019441518 6947590919908873666525329 ./rcmlib/type.rb:52:in `new': stack level too deep (SystemStackError) from ./rcmlib/type.rb:52:in `cons' from ./rcmlib/type.rb:197:in `<<' from ./rcmlib/evaluator.rb:125:in `combination' from ./rcmlib/evaluator.rb:115:in `each' from ./rcmlib/evaluator.rb:115:in `combination' from ./rcmlib/evaluator.rb:193:in `eval' from ./rcmlib/type.rb:264:in `eval' from ./rcmlib/evaluator.rb:263:in `print_all' ... 919 levels... from rcm.rb:19:in `open' from rcm.rb:19 from rcm.rb:18:in `each' from rcm.rb:18
こうなるくらいまではやった、っと。
しかし、むちゃくちゃなソースになったなぁ。
scheme で普通にやろうとすると
(define (fibseq x y) (cons x (delay (fibseq y (+ x y))))) (define num 0) (define (display-all lst) (if (= num 1000) 0 (begin (set! num (+ num 1)) (display (car lst)) (newline) (display-all (force (cdr lst)))))) (display-all (fibseq 1 1))
こんな感じですか。うーん、なんとなく、全部を normal order にしないでも、これでいいような気がするなぁ。つまり、delay と force を明示するって形で。
いいか悪いかは置いといて、副作用のあるプログラムが書けるってのは scheme の魅力だと思うし。
そうか、正式タイトルはつっこまれすぎ、だったのか。
他学科の人に「Scheme の手習い」を見せる。なんか理解出来ない、とか言われてしまった。
Q. t => A. t
のセンスは必携だと思うんだがなぁ。
スカラ波についてちょっと調べる。私にはいろいろと難しすぎてよくわかりませんでした。
6月末、野暮用でアメリカ行くんですが、どこか一度は行っといた方がいいところってありますかね。このままだと、用事済ましてさっさと帰っちゃうんですが。めったにいけるところじゃないんで、ついで、で行ければどっか行きたいなぁと。
立川ルミネまで、パスポートを取りにいってきました。意外と簡単に手続きが済んでびっくり。んで、だらだら歩いてたらいつのまにか財布が空に。やばいなー・・・。
今日買った本。
なんというか、両者ともにネタですが。平積みになっていたので買ってしまった。今度ネットワーク管理ガイドで読書会しよう。何について語るかは謎。
そういえば、何年ぶりかにデパートの食品売り場(お菓子売り場)を歩いてみたんですが、やっぱりおいしそうなものばかりですね。
電気通信学会論文誌にshuJITネタが載っていた。正直、なんで今ごろ? って気がちょっとした。
さかいさんにご紹介いただいたConceptual Mathematics: A First Introduction to Categoriesのアマゾンページ。この本を買った人はこんな本も買っています(中略)Rubyソースコード完全解説 青木 峰郎 (著), まつもと ゆきひろ 。いやー、笑った笑った。
あかん、店員さんに進められるままに買った紅茶にアールグレイがまじっとる。苦手なのに・・・。
メロンティーとかブルーベリーティーなんてのもあるんだなぁ。
OpenBSD 3.3 正式リリース(/.j)。ここまでやるってのも凄いなぁ。
λ算法に出てくる例、わかりづらい。というか、書き方で混乱してるなぁ。
a = (λx.f(xx))(λx.f(xx))
のリダクションが a => fa => f(fa) => f(f(fa)) => ...
と説明されているんだが、まず xx って何って感じが。f は自由変数なんだよなぁ、きっと。f(x)
を fa
と書く、ということから、xx
は x(x)
なんだろうなぁ。
Scheme で書くと、
(define (f x) x) ((lambda (x) (f (x x))) (lambda (x) (f (x x))))
うーん、確かに止まらない。
normal order scheme の例。
無限リストによるフィボナッチ数列を求めるプログラム(新しいプログラミング・パラダイム / P32)。
(define (fibseq x y) (cons x (fibseq y (+ x y)))) (define (pick n lst) (if (= n 1) (car lst) (pick (- n 1) (cdr lst)))) (define (fib n) (pick n (fibseq 1 1))) (fib 3)
さて、ほんまにこれが通るのか。
・・・とおりません。normal orderできた、なんて嘘でしたごめんなさい。何がいけないのか。
ちょっと見ていたら、
(define (f n) (if (= n 0) 0 (f (- n 1)))) (f 3)
こんなものすらとおらない。(- (- n 1) 1) で無限に再帰してっちゃってるらしいんだけれど。うーん、なんでだ。
Rucheme / Scheme(subset) interpreter on Ruby 0.0.3 parsed => (define (f n) (if (= n 0) 0 (f (- n 1)))) (f 3) run <= (define (f n) (if (= n 0) 0 (f (- n 1)))) eval 0 : (define (f n) (if (= n 0) 0 (f (- n 1)))) syntax : define comb 0=> f ans => f run <= (f 3) eval 1 : (f 3) eval 2 : f atom 2=> (lambda (n) (if (= n 0) 0 (f (- n 1)))) (lambda (n) (if (= n 0) 0 (f (- n 1)))) with (3) ((if (= n 0) 0 (f (- n 1)))) syntax : if eval 3 : (= n 0) eval 4 : = atom 4=> (Proc =) (Proc =) with (3 0) eval 5 : 3 atom 5=> 3 eval 6 : 0 atom 6=> 0 comb 3=> false eval 7 : f atom 7=> (lambda (n) (if (= n 0) 0 (f (- n 1)))) (lambda (n) (if (= n 0) 0 (f (- n 1)))) with ((- n 1)) ((if (= n 0) 0 (f (- n 1)))) syntax : if eval 8 : (= n 0) eval 9 : = atom 9=> (Proc =) (Proc =) with ((- n 1) 0) eval 10 : (- n 1) eval 11 : - atom 11=> (Proc -) (Proc -) with ((- n 1) 1) eval 12 : (- n 1) eval 13 : - atom 13=> (Proc -) (Proc -) with ((- n 1) 1) eval 14 : (- n 1) eval 15 : - atom 15=> (Proc -) (Proc -) with ((- n 1) 1) eval 16 : (- n 1) eval 17 : - atom 17=> (Proc -) 以下同文
うーん、頭悪いなー、俺。
んー、これは n という変数へのバインドについてバグってるのか。(- n 1) がクロージャーを持たないのが原因ってことかな。ってことは・・・。うーん、どうやって環境を渡しておこうか。
(+ '1 '2 '3) => 6
が普通に評価できる.まぁ,そらそうか.
(eval 1) => 1
で (eval '1) => (eval (quote 1)) => (eval 1) => 1
と.
う,嘘書いてた.まぁいいや.間違い探しってことで(ぉ.
買ってきた本.
続続・研究室内アンケート.出揃った.
借りた本.
すげえ.オブジェクト指向プログラミングを対象指向型って書いてある.でも,いいこと書いてあるなー.
すげえ,オブジェクト指向の考え方を,次のように表現しとる.
計算の対象をモデル化しする機構と,モデル化された対象間の通信機構とを備えた対象指向型プログラミング
いや,そのとおりだと思うんだけど,この日本語は私には書けないなぁ.
うーん,たまにはメモを取りながら読むかな.面白いし.
/.j の住人じゃない人にも宣伝しとこう.プログラミング中の音楽.原題,「hack中何聞いてる?」です.〜中の音楽,にしてしまうと,ファンの音とかは駄目駄目だよなぁ.スタッフのセンスにちょっと残念な気分.洋楽聞く人多いんですねぇ.
面白いから張っておこう.Prolog での電卓.大半は先生からもらったもので,それをちょいちょいと弄ったもの.
/* 項書き換えシステム v2 */ run(X):-replace1(X,Y),nl,write(Y),swrite(Y),run(Y). replace1(X,Y):-r(X,Y),!. replace1(X,Y):-X=..[F|XL],r1l(XL,YL),Y=..[F|YL],!. r1l([X|L],[Y|L]):-replace1(X,Y),!. r1l([X|L],[X|M]):-r1l(L,M),!. /* utility */ r(X + 0,X). /* r(s(X)+s(Y),s(s(X)+Y)). */ r(X+s(Y),s(X+Y)). r(if(true,X,Y),X). r(if(false,X,Y),Y). r(zerop(0),true). r(zerop(s(X)),false). r(mod(X,Y),if(less(X,Y),X,mod(sub(X,Y),Y))). r(less(0,s(X)),true). r(less(X,0),false). r(less(s(X),s(Y)),less(X,Y)). r(X-0,X). r(s(X)-s(Y),X-Y). /* mult */ r(X*0,0). r(s(X)*s(Y),s(X)*Y+s(X)). /* factorial */ r(fact(s(0)),s(0)). r(fact(s(X)),s(X)*fact(X)). /* write s(..) as number */ swrite(s(X)) :- snum(s(X),N),writef(" --> "),write(N),!. swrite(_):-!. /* s(..) to number */ snum(0,0):-!. snum(s(X),N):-snum(X,N1),N is N1+1,!. /* number to s(..) */ n2s(0,0):-!. n2s(N,s(S)):-number(N),N1 is N-1,n2s(N1,S). r(N,S):-number(N),N =\= 0,n2s(N,S),!.
これを,たとえばこう使う.
run(fact(2+3)).
結果が面白いので全部書いてみる.
fact(s(s(0))+2) fact(s(s(0))+s(s(0))) fact(s(s(s(0))+s(0))) s(s(s(0))+s(0))*fact(s(s(0))+s(0)) s(s(s(s(0))+0))*fact(s(s(0))+s(0)) s(s(s(s(0))))*fact(s(s(0))+s(0)) s(s(s(s(0))))*fact(s(s(s(0))+0)) s(s(s(s(0))))* (s(s(s(0))+0)*fact(s(s(0))+0)) s(s(s(s(0))))* (s(s(s(0)))*fact(s(s(0))+0)) s(s(s(s(0))))* (s(s(s(0)))*fact(s(s(0)))) s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*fact(s(0)))) s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*s(0))) s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(s(0)))) s(s(s(s(0))))* (s(s(s(0)))*s(s(s(0))*0+s(0))) s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(s(0)))) s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0))) s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(s(s(s(0)))) s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(s(s(0)))) s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(s(0)))) s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+s(0)))) s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0)))+0)))) s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(s(0))))))) s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+s(0))+s(0)))))) s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(s(s(s(0)))))))) s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(s(s(0)))))))) s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(s(0)))))))) s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+s(0)))))))) s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0))+0)))))))) s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+s(0)))))))))) s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+s(0))+0))))))))) s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(s(s(s(0)))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(s(s(0)))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(s(0)))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+s(0)))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0)+0)))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))+0))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+s(0))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))*s(s(s(0))*0+0)))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(s(0)))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+0)+s(s(0))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(s(s(s(0)))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(s(s(0)))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(s(0)))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+s(0)))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0)))+0)))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(s(0))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+0)+s(0)))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(s(s(s(0)))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(s(s(0)))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(s(0)))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+s(0)))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0))+0)))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+s(0)))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*s(s(s(s(0)))* (s(s(0))*0+0)+0))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(s(s(s(0)))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(s(s(0)))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(s(0)))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+s(0)))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0)+0)))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)+0))))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0+0)))))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))* (s(s(0))*0)))))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))* (s(s(s(0)))*0))))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*0)))))))))))))))))))))))) s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0)))))))))))))))))))))))) --> 24
Prolog で扱えるように,数値を 0 => 0, s(0) => 1, s(s(0)) => 2, ... と,0 と succ だけで表現しているわけで.これ以上長いと張れないのでこんなところで.
次はこれを拡張して微分するんだとか.微分だと,多項式が出てきて,このままだと数字に直すことができないなー.うーん・・・.なんかいい手は無いものか.
って,授業資料の著作権ってどうなってんじゃろう.貼っちゃまずかったりするのかな.うーん.
はて,リスト処理がわからん.うーん,知らないことが多すぎるような気がする.
scheme で
(define (show-list lst) (if (null? lst) () (display (car lst)) (show-list (cdr lst))))
みたいなことをしたいなぁ,と,Prolog で
test(X):- atom(X),write(X),!. test(X):- X =..[A|B], test(A),test(B),!.
と書いてみたらエラー.うーん,どうやるんだろ.car と cdr が X =..[A|B]
というのと違ってるのかな.うーん.ちゃんとした書物読まないと駄目かな.
そうか,[a,b]]
って,(.)(a,b) ってなるのか.うーん,わけわかんねー.リスト手繰るにはどうすりゃええんじゃ.
うーん.
test([]). test(X):- atom(X),write(X),!. test([A|B]):-write(A),test(B),!. test(X):- X=..[A|B],write(A),test(B). /* => ?- test(1+2). +12 Yes */
こんな感じか.うーん,長いな.う,これだと中置と前置が混じってしまう.どないしよー.こんな感じ.
?- test(add(1,2)). add12 Yes ?- test(1+2). +12 Yes
うーん,わからん.s(0) + s(0) => 1 + 1
という形に置き換えたいだけなのにな.
微分追加.
/* differential */ r(d(X,X),s(0)):-!. r(d(0,_),0):-!. r(d(s(Y),X),d(Y,X)):-!. /* n+x */ r(d(A+B,X),d(A,X)+d(B,X)):-!. r(d(A*B,X),d(A,X)*B+d(B,X)*A):-!.
結果.
?- run(d(x*x*3+x*4+5,x)). #=> d(3(x*x) + 4x + 5)/dx s(s(s(s((s(0)*x+s(0)*x)*s(s(s(0)))))))
簡単化は出来てないが,整理すると,3*x + 4 となることがわかる.
はて,これを人間にわかりやすい方法で出力するにはどうすればよいのじゃろうか・・・.
しかし,面白いな,これ.
?- run((x+3)*4). snip. s(s(s(s(s(s(s(s(s(s(s(s(x+x+x+x)))))))))))) ?- run(4*(x+3)). snip s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(s(0))))*x))))))))))))
どちらも同じモノを示しているのに,片方は全部足し算で表してるし.うーん,面白い.
ちなみに,r(X+Y,Y+X). という知識を教えてやると,とまんなくなっちまう.うーん,やれやれ.どう落しどころをつければいいんぢゃろ.
とりあえず自然数の範囲では計算できるようになったから,いっか.
明日はパスポート取りたいなー、と思っていたら、昼に用事があることに気づく。うーん、どうしよう。というか、写真とかいろいろ必要なのか。どうしようかな。へぇ、5時までやってるのか、お役所。
雲上人って誰でしょう?竹内先生とか武市先生とか、だったらサインもらいたいな。
笹川さんみたいな人です :-)
もっと話せるように精進してね。ちなみに「今のエライ人も昔はみんな学生だった」
やっぱ研究者は研究より話術ですねえ(ぇ。
いやぁ〜、研究者(というより[プログラミングは特に])は体力でしょう。別名、気力かもね。本当は知力でいたいけど。飲み会は酒の強さかもね。