Shammer's Philosophy

My private adversaria

2008-09-01から1ヶ月間の記事一覧

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 を実行す…