2006-06-04
■ [zaurus] SL-C1000
買っちゃった。(中古だけど)
電車の中で変愚をやろうという魂胆だったんだけど、まだコンパイルできてない。 ここのxangbandがターミナルで動いている程度。 文字がちっちゃくてしんどい(笑)。
コンパイルのためにLinux環境を整える必要があって、せっかくだから きまぐれ日記:colinux から VMware Player に乗り換え を参考にQEMU + VMware Player + Debian(testing)という環境にしてみた。上のページからリンクをいくつか辿って、手順どおりに やればインストールは簡単。ネットワークの設定が一切不要なのが嬉しい。
とりあえず、今は LinuxZaurusの常識・非常識/ゼロからのX/Qt を参考にX/Qtを入れてみたところ。
2006-06-08
■ [ruby] injectとto_proc
いまさらだが、to_procってinjectと組み合わせても便利なのね。
irb(main):005:0> class Symbol ;def to_proc; Proc.new { |obj, *args| obj.send(self, *args) }; end; end => nil irb(main):006:0> [1,2,3].map(&:to_s) => ["1", "2", "3"] irb(main):012:0> [1,2,3].inject(&:+) => 6 irb(main):013:0> [1,2,3].inject(&:*) => 6
整数の配列の和を求めるのにブロック書くのはめんどい!と思ってた(よくArray#sumとか定義してた)んだけど、 array.inject(&:+) くらいなら許容範囲か。
2006-06-13
■ [lab] 輪講
輪講の発表の準備。5人で回しているのでこれで2回目。時間的に3回目はなさそうだなぁ。
知らない単語が多くて困る。
- reccurence relation : 再帰関係
- lurk : 待ち伏せする、潜在する
- versatile : 用途の広い
- closed form : 閉形式
- binomial coefficient : 二項係数
2006-06-14
■ [vim] フィルタ処理
vimで、編集中のファイルをRubyで加工しようとして
:%!ruby -pe "$_.reverse!"
とやると、
-e:1: syntax error $_.reverseruby -pe $_.reverseruby ^ -e:2: syntax error $_.reverseruby -pe $_.reverseruby -e 'p ARGF.read.map{ <C:/DOCUME~1/yhara/LOCALS~1/Temp/VIiEF.tmp |s| s.split(/\\|/).map{|s| s}' ^ -e:2: syntax error $_.reverseruby -pe $_.reverseruby -e 'p ARGF.read.map{ <C:/DOCUME~1/yhara/LOCALS~1/Temp/VIiEF.tmp |s| s.split(/\\|/).map{|s| s}' ^
のような謎のエラーになってしまうのだが、どうしたら良いのだろうか。(「|」が特殊な記号っぽい?)
素直にrubydo使えということか(^^;
2006-06-19
■ [prog] Lispはなぜ凄いのか
KMCでは、毎週のミーティングのときに誰か一人が15〜30分程度の発表(「講座」という)を行う習慣がある。 今日は僕がLispに関する話をしたので、せっかくだからその内容をメモっておこうと思う。
内容は「Lispはスゴいという話をたまに聞くけど、何が凄いの?」という話。 Lispの凄いところは2つあって、1つは「動的」「GC」「高階関数」など最近プログラミング言語に搭載されるようになった機能を、'59年に既に備えていたということ。 (ちなみに最初の高級言語であるFORTLANができたのが'57年で、Lispは「2番目に古い高級言語」だったりする。) *1
ここでLispの歴史について少し。'57年に最初の版ができて以来たくさんの方言が作られたが、 現在はCommon LispとSchemeという2つのLispがよく使われている。 違いは、Common Lispがそれまでの方言の スーパーセットを目指したのに対し、Schemeはできるかぎりシンプル(かつ、強力)な仕様を目指したところ。 *2
LISP系言語はSchemeとCommon Lispを二大潮流とするが、提案された機能を原則全て導入するCommon Lispに対して、メンバーの全員一致を原則とするSchemeという特徴を持っている。
[wikipedia:Schemeより引用]
さて、もう一つは、「マクロ」と呼ばれる強力な機能を備えていること。マクロというとC言語の「#define ...」を想像するかも知れないけど、Lispのマクロはそれよりもずっと強力。 例えば、Haskellでは [ x*x | x in [1,2,3] ] と書くと [1,4,9] というリストが得られる(リスト内包表現)んだけど、Lispでは同じような機能をマクロで書くことができる。
(list-of (* x x) (x in '(1 2 3 4 5))) => (1 4 9 16 25)
このlist-ofは、関数ではない。関数だとすると実行するまえに引数が全て評価されるはずだけど、「(* x x) を計算した結果」がlist-ofに渡っても仕方がないよね。「(* x x) というコードそのもの」がlist-ofに渡らないといけない。この「コードそのもの」を扱える点が、マクロと関数の大きな違い。
さて、このように強力なマクロだが、なぜ他の言語ではあまり採用されていないのか? その理由の一つに、マクロがLispの「データとコードを同じ形(S式)で扱う」という特徴に拠っていることが挙げられる。 「コードをそのものを渡したい」と思ったとき、他の言語ではどうすれば良いだろうか?文字列?うーん。 Lispでは、コードはS式(リスト)で書かれるから、シンボルのリストを渡せばよい。
list-ofは
(define-syntax list-of (syntax-rules () ((list-of expr ...) (以下略)
のように実装される。exprにlist-of以下のコードが(リスト形式で)渡されるわけだ。 *3
つづく(かも?)
2006-06-25
■ [prog] キミならどう書く 2.0 - ROUND 1 -
Befungeで書いてみました。
>v >125*25*pv v < > v >25*25*g 1+:25*`| > v >:25*25*p >25*25*g + :55*4*`| ^ < ^ < >:::25*%\25*/p ^ >25*,@ ^ < v < >0>1+:55*4*`| v < > ^ >::25*%\25*/g 48*-| >:.v ^ < <
yhara@cosmos:~/src/befunge % ./a.out primes.bf Befunge-93 Interpreter/Debugger v2.12 2 3 5 7 11 13 17 19 23 29 31 32 37 41 43 47 53 59 61 67 71 73 79 83 89 97
Befungeについては、こちらを参照。
自分で動かしてみたいという奇特な方は、http://quadium.net/funge/downloads/ から 処理系(Cのソースコードと、Windows用EXE入り)を入手してください。