Shammer's Philosophy

My private adversaria

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

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 …

関数プロトタイプ

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))渡されたリスト要素の数が同じでない場合は、少ない方の数だけ実行され…