Shammer's Philosophy

My private adversaria

2008-01-01から1年間の記事一覧

何かを作りたい衝動・・・

開発の仕事を離れてしばらく経つ。そのせいか、何かガリガリコーディングするのに夢中になりたくなる。 この夢中になっている時間が何とも言えず好きだと自分で思う。 今正社員雇用でなく、個人として働いているが、経済状況も手伝って正社員の方がいいのか…

間違えたお客様観?

お客様は神様、という前提で、お金を払っているからといって理不尽な要求ばかりしてくるユーザー(会社)がある。 その会社自体は日本ではかなり有名な某ポータル系企業なわけだが、ここのとある方のクレームたるや本当に子供じみてひどいものだった。 おそ…

Lisp の Hash Table

Hashtable の作成自体は、make-hash-table関数を使用する。以下、使用例。 > (setf car-hashtable (make-hash-table)) #<HASH-TABLE :TEST EQL size 0/60 #xC57544E> > (gethash 'car car-hashtable) NIL NIL > (setf (gethash 'my-car car-hashtable) 'Porte) PORTE > (setf (gethash 'my-want-car car</hash-table>…

雇用不安定な状況はいつまで続くのだろう

世の中経済の見通しが立たない状態で突然の解雇が相次ぎ問題になっている一方で、各種求人サイトを見ると求人が0になっているわけでもない。 でも大半は首都圏の仕事というのが問題なのかもしれない。人が多いところにはそれだけ仕事も需要がある。 アリス…

配列とポインタその2

C

C言語では、配列はポインタとして使うことができる、というか配列名はその配列の先頭要素のアドレスと同義。配列とポインタその1 - Shammerismでも多少言及したけれども。 つまり、 ポインタ=配列の先頭要素のアドレスというのはC言語の仕様。これを確認す…

配列とポインタその1

C

実際の開発現場ではほとんど利用されていないようだが、入門書などでよく利用されているscanfという巻数がある。 これは、引数に値を格納する変数のアドレスを指定する。つまり、 int value = 0; scanf("%d", &value); というような形で、変数の頭に&をつけ…

Lispの構造体

Lispでも構造体が使える。以下のような実装になる。 > (defstruct test x y) TEST > (setf x (make-test :x 0 :y 0)) #S(TEST :X 0 :Y 0) > (test-x x) 0 > (test-y x) 0構造体を作成すると、勝手に「make-構造体名」という関数が定義され、それを利用して構…

文字列の扱い初歩

C

プログラミングの中で文字列を扱う、というのはある意味では定番。 Javaの場合は、java.lang.Stringというクラスがあり、文字列はこのクラスが中心になる。 内部的には、このクラスはcharの情報を持っていて、これが文字列の実体だった。 Cの場合はどうか。C…

Cの配列チェック

C

Javaではあり得ないようなことがCでは普通にありえる。 こうした内容の話は探せばたくさんあるのだろうけれども、配列の要素数もその一つ。 Javaだと、 String array = {"AAA","BBB","CCC"}; System.out.println(array[100]); と、存在しない配列の要素数を…

Lispには文字列置換関数がない?

いろいろ探してみたが、Lispには文字列置換関数がないようだ。指定した範囲の文字列を置換できる、replaceという関数はある。 The Common Lisp Cookbook - Stringsにreplaceの使用例がある。 > (setf my-string (string "Zeppo Marx")) "Zeppo Marx" > (repl…

Lisp配列要素の置換

配列の要素を取得するには、aref関数を使う。 > (setq array-1 #2A(("AAA" "BB")("C" "DDDD"))) #2A(("AAA" "BB") ("C" "DDDD")) > (aref array-1 0 0) "AAA"この、aref の戻り値を置き換えるような形で配列要素の置換ができる。 > (setf (aref array-1 0 0)…

#define

C

プリプロセッサの命令に define というのがある。 #define VALUE 100これを使用すると、コンパイラはコンパイル前にソースコード内の「VALUE」という値を 100 に置き換えてからコンパイルする。 Javaでいうfinalによるインライン化と同じようなことをしてく…

Lisp文字列の配列は?

文字列が、文字の配列だとすると・・・文字列の配列はどうなるのか? 最初に、文字列に対してarray-total-sizeとかを使ってみる。 >(array-total-size "This is a pen.") 14 >(array-rank "This is a pen.") 1 >(array-dimension "This is a pen." 0) 14なる…

開発環境(Eclipse)上でコンパイルをするということは・・・

本当は使いたくなくても、仕事をしていると使わざるを得ないものってある。 自分にとっては、JavaのIDEってそれ。なんかほとんど使いこなせないくらい多くの機能があってそれで非常に重たい。 シンプルでいいから軽くしてくれ・・・って思ってしまう。 Antや…

Lispの文字列

Lispで文字列を定義するのは簡単だ。ダブルクォートで、文字を囲んでやればいい。 >"AAA" "AAA" >(setf string-1 "AAA") "AAA" >string-1 "AAA"また、文字列は個々の文字列の配列(ベクタ)でもある。文字列を表現するには、#\aとか、#\bとかやるようだ。他…

再帰処理と反復処理

C

再帰と反復と、両方とも繰り返し処理を扱うものだが、その使い分けとかをどうするか考えてみた。 とりあえず、それぞれの特徴をまとめると、[再帰処理] 関数呼び出しを繰り返す 基底ケースに達したときに処理が終了する [反復処理] 反復構造を明示的に利用し…

スコープと変数

C

JavaとCではどうも変数のスコープが異なるようだ。 ネストされたブロック内でもCだと同じ変数が使えるらしい。 たとえば、 main() { int x = 100; { int x = 1000; printf("%d\n", x); } printf("%d\n", x); return 0; } Java だとこのようなことはできない…

Lispで配列の要素数を調べる

make-array関数で配列を作ることができる、というのは[Lisp] - Shammerismですでに試してみた。一歩進んで、作成された配列の要素数を調べてみる。length関数を使用すればできるかと思ったが、多次元配列だとうまくいかなかった。 > (setq array1 (make-arra…

rand と srand

C

C言語で乱数を生成する場合にどうするか? その際に使うのが rand 関数と srand 関数だ。 これを組み合わせて乱数を生成する。 まず、 rand 関数を実行して、その結果を出力してみる。 main() { int i = 0; for( i = 0 ; i int x = 1 + rand() % 9; printf("…

consとlist

consは、与えられた引数を連結してリストを作る、と思っていたが、どうも少し違うようだ。 > (cons 'a 'b) (A . B) > (list 'a 'b) (A B) > (car (list 'a 'b)) A > (car (cons 'a 'b)) A > (cdr (list 'a 'b)) (B) > (cdr (cons 'a 'b)) B(A.B)というドット…

oddpとevenp

Lispには、奇数・偶数判定を行える関数がある。 oddp 引数が奇数の場合にT evenp 引数が偶数の場合にT 構文は、それぞれ以下のようになる。 (oddp N) (evenp N) 実際に使ってみる。 ?(oddp 1) T ?(oddp 2) NIL ?(oddp 3) T ?(evenp 1) NIL ?(evenp 2) T ?(ev…

SEQUENCEを扱う関数たち

length の他にも、SEQUENCEを扱う関数をメモ。 every reverse some sort subseq それぞれ、以下のような構文になる。 (every PREDICATE ONE-SEQ &REST SEQUENCES) (reverse SEQUENCE) (some PREDICATE ONE-SEQ &REST SEQUENCES) (sort SEQUENCE PREDICATE &K…

値呼び出しと参照呼び出し

C

値呼び出しと参照呼び出し。これはJavaでも散々やった。 どのプログラム言語にもあるのかな・・・ Cでもポインタをやる前にこれを抑えておく必要がある。まず、値呼び出しとは、別の関数にパラメータを渡したときにそのパラメータがコピーされるということ。…

Lispのsubseq関数

SEQUENCEの一部(あるいはすべて)をコピーするのがsubseq関数。 (SUBSEQ SEQUENCE START &OPTIONAL END)&OPTIONAL とは、省略可能な引数ということか。 この関数の実行例は以下のような感じ。 ?(setf lst '(a b c d e f g)) (A B C D E F G) ?(subseq lst 3…

発表会前日

発表会で着る衣装をクリーニングに出していて、今日はそれを取りに行ってきた。 間に合わなかったらどうしようとか思っていたけれどどうにか間に合った。 先生から襟を立てるように言われていたが、クリーニング終わって戻ってきたシャツは襟が折れていて、…

Lispのlength関数

リストの長さ(要素数)を調べる関数に、lengthというのがある。この関数を処理系に打ち込んでみると、 LENGTH : (SEQ)と表示される。どうやら、SEQUENCEというデータ型があり、それの長さを調べることができる、というものだ。当然、リストはSEQUENCEの一部…

まともに踊れるのだろうか

趣味でやっているフラメンコの発表会が迫ってきた・・・ 初めてフラメンコをやったのは去年の7月ころ。 しかし、始めた直後に仕事が忙しくなり、ほとんどいけなくなって最初に入った教室は年明けの1月でやめることになった。 約半年ほどだったが10回くら…

Lispで配列を扱う

他の言語同様、Lispでも配列を扱える。配列を作成するのは、make-array関数。以下のような引数をとる。 make-array DIMS &KEY ELEMENT-TYPE DISPLACED-INDEX-OFFSET ADJUSTABLE FILL-POINTER INITIAL-ELEMENT INITIAL-CONTENTSう〜ん、オプションがたくさん…

format関数は「String」しか出力できない?

引数として渡されたリストを、別のリストと連結(append)して、それをトップレベルに出力するような関数を書いた。 (defun say-hello (lst) (if (not (null lst)) (if (listp lst) (progn (format t (append '(Hello) (car lst))) (say-hello (cdr lst))))))…

Lisp の集合関数

Lispにも、集合を扱える関数がある。リストの要素を集合に見立てて使うのだが、 adjoin union intersection set-difference という関数が用意されている。それぞれ、以下のような構文。 (adjoin ITEM LIST &KEY TEST TEST-NOT KEY) (union LIST1 LIST2 &KEY …