2007-08-01から1ヶ月間の記事一覧

SICPを読む(47) 問題 2.17 - 2.20 一発で解けた。

一発で解けた。スゲー嬉しい!! 問題 2.17 リストの最後の要素をリストで返す。 (define odds (list 1 3 5 7)) (define (last-pair items) (if (null? (cdr items)) items (last-pair (cdr items)))) (last-pair odds) ; (7) (null? (cdr items))で一個先読み…

SICPを読む(44) 問題 2.12 - 2.16 区間演算の問題を解く?

SICPを読もう〜 問題 2.12 (define (make-center-percent c p) (make-center-width c (* c (/ p 100)))) (define (percent i) (* (/ (width i) (center i)) 100)) (percent (make-center-percent 2 50)) ; 50 2.11のmake-center-width,center,widthを活用す…

SICPを読む(46) 2.2.1(2) append

appendがわかりにくい。 (define o `(1 3 5 7)) (define s `(1 4 9 16)) (define (append list1 list2) (if (null? list1) list2 (cons (car list1) (append (cdr list1) list2)))) (append o s) ; (1 3 5 7 1 4 9 16) 展開してみる。 (cons (car o) (cons (…

SICPを読む(45) 2.2.1(1) 空リスト

やっとリストらしくなってくるぞぉ〜。が・・・しかし・・・nilが無い!!gaucheでは、 gosh> (cons 1 (cons 2 nil)) *** ERROR: unbound variable: nil Stack Trace: _______________________________________ gosh> (cons 1 (cons 2 null)) *** ERROR: unbou…

Vim上でRubyを動かしたい。

Vim上でirbみたいな事が出来たら素敵かなぁと思って、こんなスクリプト作ってみた。 概要 Vim上でのRuby開発を加速させます(たぶん) 組込みRubyを使ってVim上でirbみたいな事ができます。 ノーマルモードで「ctrl + enter」すると、カーソル下の行実行 ビジ…

Rubyで自己書換えプログラムを作る。

なんとなく。 % ruby -e 'ex = lambda{|e| puts e}; b = binding; STDIN.each{|l| ex.call(eval(l, b))}' 1 + 2 3 ex = lambda{|e| print "=> "; puts e} # ex update #<Proc:0xb7f40a58@-e:1> 1 + 2 => 3 ex = lambda{|e| print "=> "; puts e; print ": "} => #<Proc:0xb7f40760@-e:1> => nil : 1 + 2 =</proc:0xb7f40760@-e:1></proc:0xb7f40a58@-e:1>…

標準入力からgnuplot

忘れそうなのでメモ。 % cat plot.txt plot '-' w l 1 1 2 4 3 9 4 16 e % gnuplot -persist < plot.txt -persistでグラフウィンドウ表示 plot '-'でファイルの代わり。eまたはendで終了。 プログラムから利用するときに便利です。 Rubyでgnuplot 2乗のグラ…

Rubyで電卓作ってみた。

前回のエントリでコマンドライン電卓dcを試したけど、Rubyワンライナの方が断然便利だった。 % ruby -e 'STDIN.each{|l| puts eval(l)}' 1 + 2 3残念ながらこのワンライナでは、 フォーマット指定が面倒 変数が使えない と、イマイチな所もあるので、書き直…

bcメモ。

コンソール用電卓が欲しくなってきたので、bcを試してみた。 はじめてのbc % bc -q 1 + 2 3 obase = 2 2 ^ 10 10000000000 ibace = 8 755 1011110011 quit ibase,obaseで基数の変更が出来る。 manのサンプルが凄いっす。電卓の域を遥かに越えてる・・・。 2…

K&Rを読もう(30) 2.9 2進数のダンプをマクロで

GCC

2.9はビット演算子の解説です。ビット演算といえば2進数のダンプが欲しくなる。型ごとに関数を作るのが面倒なので、マクロを活用してみた。 #include <stdio.h> #include <stdlib.h> #define dump(type, bin) \ do { \ int i; \ for (i = sizeof (type) * 8 - 1; i >= 0; i--) \</stdlib.h></stdio.h>…

K&Rを読もう(29) 問題2-4 tr -dみたいな。

GCC

夏休みだったので実家でゴロゴロしてました。休みぼけモードのtanakaです。 問題 2-4 問題の意図が掴みづらかった。「文字列s2中の任意の文字に等しい文字をs1から除去するような形のsqueeze(s1,s2)を書け」どうやら、 % tr -d abc % sed 's/[abc]//g'みたい…

C言語の配列を理解する。

GCC

C言語の配列宣言が、バイナリレベルでは全く違う事がわかってきた。次は配列とポインタの違いを探るために、array[i]と*(array + i)の違いを探ってみる。 #include <stdio.h> #include <stdlib.h> #define SIZE 5 int main(void) { int i; int array[SIZE] = {0, 1, 2, 3, 4}; f</stdlib.h></stdio.h>…

値の変更が出来る文字列についての格闘期。

GCC

ちょっとはまって調べてみたら、もっとはまってしまった・・・。値の変更が出来る文字列についての格闘記。 値の変更について func(char *s) { *s = 'a' } func("moge"); というアホなプログラムを書いてしまった・・・値が変更が出来る訳が無い!!なんとなく…

1から10まで表示メモ。

seq便利なんっすけどぉぉぉ。 % seq 10 1 2 3 4 5 6 7 8 9 10横に並べるときは、zsh。 % echo {1..10} 1 2 3 4 5 6 7 8 9 10プログラムのテストに最適デス。1から10まで表示して、ランダムに並べ替えて、元に戻す。 % seq 10 | random | sort -n 1 2 3 4 5 6…

K&Rを読もう(28) 問題2-5 文字のマッチング

GCC

2-4より先に2-5をやる。文字列のマッチングをして、一致する文字の位置を返す問題。mixi時代にkusakabeさんに激しく突っ込まれたのでよく覚えてる。 #include <stdio.h> #include <stdlib.h> int any(char *s, char *match) { int i = 0; char *sp; char *mp; for (;*s != '\0';</stdlib.h></stdio.h>…

glibcのソースを入手してみた。

GCC

K&Rを読んでるとライブラリの再実装を行っているものが多い。しかし、K&Rでは初歩の初歩の実装を扱っているだけで全く足りないので、本物のソースを入手することにした。GNU C Library - GNU Project - Free Software Foundation (FSF)20MB。フロッピーディ…

C言語の文字列宣言を理解する

GCC

前回のエントリで、C言語の文字列宣言によって参照するポインタの位置に違いがある事がわかった。では、バイナリレベルでGCCがどのように解釈を行っているのかを理解したいと思う。 #include <stdio.h> void hello1(void) { char *s = "Hello, C String World !! Hell</stdio.h>…

K&Rを読もう(27) 問題2-3 htoi

GCC

16進文字列を数値に変換するhtoiを実装せよ。0xのある場合も考慮しなければならない。という問題。GCC拡張のcase 'a' ... 'f'を使ってみた。 #include <stdio.h> #include <stdlib.h> int htoi(char *s) { unsigned int i = 0; int tmp; if (*s == '0' && *(s + 1) == 'x') s +=</stdlib.h></stdio.h>…

K&Rを読もう(26) randの写経。

GCC

疑似乱数がこんなに単純なアルゴリズムで出来ているとは・・・。もっと単純にしてみた。 適当なa、p、qを選んで、ap + q = a'とする。次にa'をaに代入する。で、余りを取る。後はニュートン法のように繰り返すだけ。 #include <stdio.h> #include <stdlib.h> unsigned long int </stdlib.h></stdio.h>…

K&Rを読もう(25) atoiとlowerの写経。

GCC

K&Rを写経しよう。今回はatoiとlower。文字列演算が出てきたので、rot13(シーザー暗号)も追加してみた。 #include <stdio.h> #include <stdlib.h> int atoi_copy(char *s) { int i, n = 0; for (i = 0; isdigit(*(s + i)); i++) n = 10 * n + (*(s + i) - '0'); return n; } int</stdlib.h></stdio.h>…

K&Rを読もう(24) strlenの写経。

GCC

K&Rを写経しよう。サンプルは配列だったので、ポインタ演算でstrlenしてみた。 #include <stdio.h> #include <stdlib.h> int strlen_copy(char *s) { int i = 0; while (*(s + i) != '\0') i++; return i; } int main(void) { printf("%d\n", strlen_copy("test strings.")); /*</stdlib.h></stdio.h>…

K&Rを読もう(23) 演習2-2 getline改

GCC

今日から夏休みデス!!前回のGWはRuby三昧だったので、今回はK&R三昧にしようかと考えてますが、今回の夏休みは実家に帰る予定なので、あんまり進まなそう・・・。 演習 2-2 getlineを&&,||を使わずに・・・という問題ですが、前にやっちゃったので、略。ボク…

Vimで大文字小文字変換の動作を変える。

Vim

あ、しまった!!小文字だよ!!って時は、~を使うと大文字、小文字を変換できる。 #define |size 10~~~~ってやると, #define SIZE| 10が、Viper的にありえない感じなので、もうちょっとスマートにいきたいところ。そんな時は、おもむろに:set :set tildeop~w #d…

if式で気づいたこと

Lispはif式という偉大なる発明をした。が、どういう訳か「if文」として世の中に広がっていってしまった。 来年に向けて、閏年でも判別してみる。僕はLisp使えないのでSchemeで書きます(えへ (define year 2007) (if (= (remainder year 4) 0) (display "閏年…

SICPを読む(43) 問題 2.11 9つの計算法

面倒すぎるので解法だけ書いておく。 問題2-11 1つの区間を3パターンに分けられる。 区間が正 区間が負 区間に0を含む 3パターン x 3パターンなので、解法は9つになる。そのうち、区間に0を含む x 区間に0を含むの場合の乗算では、上限、下限がわからないの…

GNU catを読む - 全体的な流れ

GCC

GNU catのソース読んでます。長くなってきたので分割しました。 ソースコードのありか オンラインで見るときはCVSを sources Index of /coreutils/coreutils/src ソースはftpからゲットせよ。 Coreutils - GNU core utilities グローバル グローバル変数stat…

GNU catを読む - next_line_num()編

GCC

昨日、catのソースを読んでいて謎だったnext_line_num()の処理を解析してみた。 実際の動作を確認する。 cat -nで行番号表示が出来る。 % cat -n next_line_num.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define LINE_COUNTER_BUF_LEN 20 5 static char line_buf[LINE</stdlib.h></stdio.h>…

Hacking Vim欲しい!!

Vim

Vimの本ってなかなか無いんですよね・・・世界中で使われてるグレイトなエディタなのに〜なぜだぁぁぁ!!と思ってたら、でた、でた、でたぁぁぁ〜Vim7本!!(洋書だけど)Hacking Vim: A Cookbook to Get the Most Out of the Latest Vim Editor作者: Kim Schulz…

catで標準入力と連結

catコマンドは猫じゃなかった。catはファイルを連結出来る。そう、catはconcatenateの略なのだ!!と、今日改めて感じたのでメモ。 ふつうの使い方。 % cat hoge.txt ほげほげ % cat moge.txt もげもげスゲーふつう。 2つのファイルを連結する。 % cat hoge.tx…

C言語にもboolがあった。

GCC

最近cflowの便利さに気づいたtanakaです。 % cflow cat.c | grep ':$' | sed 's/<.*//' main() usage() simple_cat() cat() write_pending() next_line_num()コールグラフが一目瞭然でっす。超便利。便利過ぎなので関数のみ抽出するシェルスクリプト作った。…