Shammer's Philosophy

My private adversaria

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

関数プロトタイプ

C

関数プロトタイプとは、Cのソースコード上で使用している外部ファイルの関数のシグネチャを定義しておくもの。 Javaだとシグネチャといえば通じるはずだがCでは何というのか・・・(って関数プロトタイプというのだが)。 外部ファイルをincludeしたり、独自…

Lisp の member-if 関数

昨日は member 関数をやったので、今日は似たような member-if 。これを ClozureCL で使おうとすると、 MEMBER-IF : (TEST LIST &KEY KEY)と、シグネチャが出る。う〜ん、Lisp ではこの関数の定義の様子をなんと言うのだろうか。 member-if は、member と同…

Lisp の member 関数

member 関数は、最低2つの引数を必要とする。 (member 'a (list 'b 'c)) NIL最初の引数が、2つ目の引数で渡されたリストの中に含まれていれば、それ以降の要素をリストとして返す。ClozureCL で member を使うと、次のようにリファレンス(?)が出る。 ME…

Lisp 再帰処理の失敗

Lisp でプログラムを書いていると、再帰処理でリスト要素がなくなった場合のチェックを忘れてうまく動作しないことがある。 (defun ng-recursive-func (object lst) (if (eql object (car lst)) lst (ng-recursive-func object (cdr lst))))これを動作させる…

関数定義とJavaのオーバーロード

C

Java には、メソッドのオーバーロードという機能があり、 同じクラスに同じ名前のメソッドを複数定義できる。 (戻り値や引数は異なる必要がある) しかし、Cの場合は、同じ名前のメソッドを定義できないようだ。 関数プロトタイプというのがあり、それを明…

= と ==

C

よくやってしまうケアレスミスの一つに、代入演算子と比較演算子を間違える、というのがある。 つまり、= と書くべきところを == にしてしまうとか、== とすべきところを = としてしまう、 というもの。後者の方が多いかな。 やっかいなのは、頭でわかってい…

mapcar 関数と mapc 関数比較その2

mapc を使った場合、引数に渡されたリストの情報も更新されるのではないか、と考えていろいろ試している。 [Lisp] - Shammerism しかし、予想通りの結果にならなかった。let を使ったからか?と思い、let を使用せずに同様の処理を書いてみた。 (defun mapc-…

kill Command

Mac

ちょっとふざけて無限ループさせるコードを実行させていたら、 プロセスが暴走してしまったのか普通に kill PID とやっても無限ループが終了しなくなってしまった。 再起動させるしかないかと焦ったけれども、kill のオプションに -KILL を指定することで 暴…

mapcar 関数と mapc 関数比較

もう少しみてみることにした。前に定義した、 (defun mapc-test (lst) (if (listp lst) (mapc #'(lambda (x) (format t "~A~%" (concatenate 'string "Good-bye, " x))) lst) (format t "Usage: mapc-test $LIST~%")))だと、厳密には mapc の実行結果が出力…

少しでも短くコードを書くこと

Javaでも同じことだが、C言語でwhileループを使うときには main(){ int counter = 1; while( counter printf("%d\n", counter); ++counter; } return 0; } というように書く。(この場合は for文使うだろってのは今はなし) ここで、このコードの行数を減ら…

Lisp の mapc 関数

mapc 関数は、mapcar 関数と似ている。引数で渡されたリストに対して、指定された処理を繰り返す、というものだが、新しいリストを返さない、という点が異なる。 ? (defun mapcar-test (lst) (if (listp lst) (mapcar #'(lambda (x) (concatenate 'string "H…

Lisp の maplist 関数

mapcar と似たような関数。mapcar が引数の car の結果に対して行っていた作業を cdr に対して行う。 (maplist #'append '(10 20 30) '(a b c)) ((10 20 30 A B C) (20 30 B C) (30 C))渡されたリスト要素の数が同じでない場合は、少ない方の数だけ実行され…

EOFの入力

C

C言語に限らず、ファイルの終わりを示す記号というか、符号のような役割をする情報がEOF。 Windowsで秀丸とか使っていると、テキストの最後に「EOF」と出るあれ。 End of File の略だが、プログラムの中でこれを使うことができる。 main(){ int type = 0; wh…

Lisp の concatenate 関数

文字列の連結をしたい場合に使用できる関数。以下のようになる。 (concatenate 'string "Hello " "World.") "Hello World."文字列以外にも連結できる。たとえば、 (concatenate 'list '(a b) '(c d)) (A B C D)と、リストの連結にも使用できる。もっとも、リ…

Lisp の mapcar 関数

mapcar 関数というのは、引数で渡されたリストの各要素に対して、任意の処理を行う関数。 (defun mapcar-test (lst) (if (listp lst) (mapcar #'(lambda (x) (concatenate 'string "Hello, " x)) lst) (format t "Usage: mapcar-test $LIST_VALUE.~%"))) >(m…

Lisp の progn 関数

Lisp には、progn という関数がある。これは、複数の処理をブロック化するものらしい。たとえば、何らかの条件を比較した後で処理を行いたい、とする。たいていの場合は、if 文を使って (if (> x y) (真の処理) (偽の処理))というように書くはず。このとき、…

getchar() の入力値

C

getchar() で値を受け取ると、よくわからない挙動をすることがある。 先日書いたプログラムだと新しい値を入力するたびに画面に「10」とか表示される。 よくわからなかったが、これは仕様っぽい。 次のようにするとこれを止めることができる。 main() { int …

Lispのlet式

Lispには、let という関数(?)がある。これは、いわゆるローカル変数を定義する、というような役割なのだが・・・ちょっとわかりにくい。こういう風に使うみたいだ。 (defun let-test (lst) (let ( (value_1 '(a b)) (value_2 '(1 2)) ) (format t "value_…

Lisp の dotimes(反復)

dotimes は、C や Java でいうところの for 文に近い。近い、というのは、for 文ではカウンタを 1 ずつ増やさなくてもよいが(たいていそうするけれども)、dotimes は 1 ずつ増える動作になるため。 実際に使ってみる。1 から 1000 までの合計を求める。 (s…

Lisp の dolist(反復)

loop と do に続いて、dolist を使ってみる。Lisp $B%W%m%0%i%_%s%0#1(Bによれば、dolist は foreach 文に相当するようだ。 サンプルを書いてみる。 >(setq lst '(1 2 3 4 5 6 7 8 9)) (1 2 3 4 5 6 7 8 9) >(setq result 1) 1 >(dolist (i lst result) (s…

Lisp の do (反復)

Lispでの繰り返し処理を行うための関数に、do と dolist というのがある。 とりあえず、do を使ってみる。 構文は以下。 (do (変数 初期値 更新方法) (反復終了の判定処理) (処理1) (処理2) ... (処理n))以下、do を利用するサンプル。 (defun do-sample (st…

and と or

Lispの条件判定では、if や cond 以外にも and と or というのがある。 それぞれ複数の条件をとる 最後の式は、真判定の場合のみの動作。偽判定時の処理は書けない。 という点は共通。それぞれ、以下のような動作をする。 and の動作 条件式すべてが真の場合…

番兵制御

番兵制御、内容自体はすでに知っていたが、こういう言い方があるとは知らなかった。 ループ処理を書いていると、(Javaの例) while( true ) { InputStreamReader reader = new InputStreamReader(System.in); BufferedReader bufReader = new BufferedReade…

let関数

Lispでは、ローカル変数の定義にlet関数を使用する。 以下のように、ある関数の実行前に変数 x が定義されていたとする。 (setf x 10)しかし、 ある関数の中でも x という変数を使用したい もと(定義済み)の変数 x はそのまま保持したい という場合などは…

load関数

長い関数を定義する際に、処理系を起動して、 (defun function-name (x y z) ... ; 実際の関数の処理 )と入力していると、入力ミスなどがあった場合に修正が面倒。 こういう場合、任意のテキストファイルに関数を書いておき、 それを読み込むことができる。…

コンスとは

Lisp は、関数もデータもすべて「リスト」として扱う。LISt Processing というのがLispの正式名称であるように、リストを処理するための言語がLispだ。では、Lispがリストを扱う際に、そのリストが内部的にどのようになっているのか?それは、2つのブロック…

技術的なことを調査する時に・・・

技術力を向上させたい、という思いと裏腹に、自分のだらしなさとかが最近やたらと気になる。 裏腹というわけではないのかもしれないが・・・一番イヤな気持ちになるのが、わからないことを調べるときの自分の姿勢。 3〜4時間ほど調べてもわからないと誰か…

cdr関数

car関数がリストの先頭要素を返すのに対し、cdr関数はリストの先頭以外の要素を返す。 (cdr '(a b c d)) (B C D) リスト=car の実行結果+ cdr の実行結果、ということになるのか。 なぜこんな関数があるんだ???

car 関数

渡された引数(リスト)の先頭要素を返す関数。以下のように使用する。 > (setq lst '(a b c)) (A B C) > (car lst) A まだ使いどころまでは見えない。

Lisp の 繰り返し処理

Lisp にも繰り返し処理があるようだ。 再帰処理が中心だから、繰り返しも再帰で表現するものと思っていたが。 以下のように書く。 (while (loop というのもある。 (loop (setq sum (+ sum x)) (setq x (+ x 1)) (if (> x 100) (return sum))) loop を実行す…