2008-09-01から1ヶ月間の記事一覧
C言語に限らず、ファイルの終わりを示す記号というか、符号のような役割をする情報がEOF。 Windowsで秀丸とか使っていると、テキストの最後に「EOF」と出るあれ。 End of File の略だが、プログラムの中でこれを使うことができる。 main(){ int type = 0; wh…
文字列の連結をしたい場合に使用できる関数。以下のようになる。 (concatenate 'string "Hello " "World.") "Hello World."文字列以外にも連結できる。たとえば、 (concatenate 'list '(a b) '(c d)) (A B C D)と、リストの連結にも使用できる。もっとも、リ…
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 という関数がある。これは、複数の処理をブロック化するものらしい。たとえば、何らかの条件を比較した後で処理を行いたい、とする。たいていの場合は、if 文を使って (if (> x y) (真の処理) (偽の処理))というように書くはず。このとき、…
getchar() で値を受け取ると、よくわからない挙動をすることがある。 先日書いたプログラムだと新しい値を入力するたびに画面に「10」とか表示される。 よくわからなかったが、これは仕様っぽい。 次のようにするとこれを止めることができる。 main() { int …
Lispには、let という関数(?)がある。これは、いわゆるローカル変数を定義する、というような役割なのだが・・・ちょっとわかりにくい。こういう風に使うみたいだ。 (defun let-test (lst) (let ( (value_1 '(a b)) (value_2 '(1 2)) ) (format t "value_…
dotimes は、C や Java でいうところの for 文に近い。近い、というのは、for 文ではカウンタを 1 ずつ増やさなくてもよいが(たいていそうするけれども)、dotimes は 1 ずつ増える動作になるため。 実際に使ってみる。1 から 1000 までの合計を求める。 (s…
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 と dolist というのがある。 とりあえず、do を使ってみる。 構文は以下。 (do (変数 初期値 更新方法) (反復終了の判定処理) (処理1) (処理2) ... (処理n))以下、do を利用するサンプル。 (defun do-sample (st…
Lispの条件判定では、if や cond 以外にも and と or というのがある。 それぞれ複数の条件をとる 最後の式は、真判定の場合のみの動作。偽判定時の処理は書けない。 という点は共通。それぞれ、以下のような動作をする。 and の動作 条件式すべてが真の場合…
番兵制御、内容自体はすでに知っていたが、こういう言い方があるとは知らなかった。 ループ処理を書いていると、(Javaの例) while( true ) { InputStreamReader reader = new InputStreamReader(System.in); BufferedReader bufReader = new BufferedReade…
Lispでは、ローカル変数の定義にlet関数を使用する。 以下のように、ある関数の実行前に変数 x が定義されていたとする。 (setf x 10)しかし、 ある関数の中でも x という変数を使用したい もと(定義済み)の変数 x はそのまま保持したい という場合などは…
長い関数を定義する際に、処理系を起動して、 (defun function-name (x y z) ... ; 実際の関数の処理 )と入力していると、入力ミスなどがあった場合に修正が面倒。 こういう場合、任意のテキストファイルに関数を書いておき、 それを読み込むことができる。…
Lisp は、関数もデータもすべて「リスト」として扱う。LISt Processing というのがLispの正式名称であるように、リストを処理するための言語がLispだ。では、Lispがリストを扱う際に、そのリストが内部的にどのようになっているのか?それは、2つのブロック…
技術力を向上させたい、という思いと裏腹に、自分のだらしなさとかが最近やたらと気になる。 裏腹というわけではないのかもしれないが・・・一番イヤな気持ちになるのが、わからないことを調べるときの自分の姿勢。 3〜4時間ほど調べてもわからないと誰か…
car関数がリストの先頭要素を返すのに対し、cdr関数はリストの先頭以外の要素を返す。 (cdr '(a b c d)) (B C D) リスト=car の実行結果+ cdr の実行結果、ということになるのか。 なぜこんな関数があるんだ???
渡された引数(リスト)の先頭要素を返す関数。以下のように使用する。 > (setq lst '(a b c)) (A B C) > (car lst) A まだ使いどころまでは見えない。
Lisp にも繰り返し処理があるようだ。 再帰処理が中心だから、繰り返しも再帰で表現するものと思っていたが。 以下のように書く。 (while (loop というのもある。 (loop (setq sum (+ sum x)) (setq x (+ x 1)) (if (> x 100) (return sum))) loop を実行す…