ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

Lisp

「Ansi Common Lisp」13章読了

スピードと題して。Lispは、 高速のプログラムを書くための言語であり、 高速にプログラムを書くための言語である。 だそうです。 それって二律背反のような気がするのですが、どうなんでしょう。 最近の言語は前者を犠牲にして、後者を取ってますよね。 あ…

「Ansi Common Lisp」13章練習問題

1. 自分の使っているコンパイラがインライン宣言に対応しているかどうか確かめよ。 declareも、declaimも使えたので、対応しているのでしょう。 2. 以下の関数を末尾再帰に書き換えよ。コンパイルしたときどのぐらい速度が改善するか。 (defun foo (x) (if (…

「Ansi Common Lisp」読了

ANSI Common Lisp (スタンダードテキスト)作者: ポールグレアム,Paul Graham,久野雅樹,須賀哲夫出版社/メーカー: ピアソンエデュケーション発売日: 2002/08メディア: 単行本購入: 1人 クリック: 102回この商品を含むブログ (68件) を見る本当はあと数章残っ…

「Ansi Common Lisp」12章練習問題

1. ((A) (A) (A))のように表示される3種類のツリーを描け。さらにおのおののツリーを生成する式を書け。 * (setf a '((A) (A) (A))) Warning: Declaring A special. ((A) (A) (A)) * (setf b1 '((A) (A))) Warning: Declaring B1 special. ((A) (A)) * (setf…

「Ansi Common Lisp」12章読了

データの構造と題して、なんか抽象的な感じ。 共有構造 「あるリストが別のリストの一部」である状態を指すらしい。 * (setf part (list 'b 'c)) Warning: Declaring PART special. (B C) * (setf whole (cons 'a part)) Warning: Declaring WHOLE special. …

「Ansi Common Lisp」11章練習問題

1. 図11.2に定義されたクラスに対して、アクセサ、スロットの初期値、スロット初期化引数を定義せよ(:accessor, :initform, :initargを指定する)。また、slot-valueを呼ばずにすむように関連コードを書き換えよ。 図11.2 (defclass rectangle () (height wid…

「Ansi Common Lisp」11章読了

CLOS(Common Lisp オブジェクトシステム)に関する章。 ほんとなんでもアリって感じですね。 オブジェクト指向プログラミング オブジェクト指向に関する一般的な話なのでスルー。 クラスとインスタンス クラスの定義とインスタンスの作成 * (defclass circle …

「Ansi Common Lisp」10章練習問題

1. xがa、yがb、zが(c d)であるとして、これらの変数のみから以下のそれぞれを出力するようなバッククォート式を書け。 (a) ((C D) A Z) (b) (X B C D) (c) ((C D A) Z) ; 前提 (setf x 'a) (setf y 'b) (setf z '(c d)) ; (a) `(,z ,x z) ; (b) `(x ,y ,@z)…

「Ansi Common Lisp」10章読了

マクロに関する章。「On Lisp」のメインテーマだったような。これが理解できれば「On Lisp」は読みこなせるかも!? Eval リストをLispコードとして扱わせる。 * '(+ 1 2 3) (+ 1 2 3) * (eval '(+ 1 2 3)) 6 * evalは、 効率が悪い(その都度interpriteするか…

「Ansi Common Lisp」9章練習問題

1. 実数のリストを引数として、このリストが降順でない並びになっている場合に真を返す関数を定義せよ。 (defun is-not-descending-order (real-lst) (not (apply #'> real-lst))) (is-not-descending-order '(0.3 0.2 0.1)) (is-not-descending-order '(0.1…

「Ansi Common Lisp」9章読了

数値に関する章。 データ型 基本は、整数、浮動小数点数、分数(ratio)、複素数の4種類。 図9.1に数値型の一覧と親子関係について載っているのですが、 細分化すると全部で14種類もあります。 複素数をデフォルトでサポートしているところが、なんとなくPytho…

「Ansi Common Lisp」8章読了

シンボルに関する章。RubyのシンボルもLispのシンボルに似てるのかしら。 どっちも未だにイマイチ理解できてないですが。 シンボル名 大文字と小文字は区別しない。空白を含んだシンボル名はパイプ(|)でくくる。 * 'abc ABC * (eql 'symbol 'SYMBOL) T * '|a…

「Ansi Common Lisp」8章練習問題

1. 同一の名前をもつ2つのシンボルがeqlでないということはありうるか。 別パッケージで同一の名前ってのがあるので、ありうるが答えでしょう。 (defpackage "PACKAGE1" (:use "COMMON-LISP") (:nicknames "PKG1") (:export "WIN")) (in-package package1) (…

「Ansi Common Lisp」7章読了

入出力に関する章。 普通のプログラミング言語の入門書なら、まず外せない内容でしょうね。 「ふつうのHaskellプログラミング」では、Wikiエンジンの開発の中で取り上げられていたみたいですが、ここ読んでないので結局標準入出力しか分かってないなあ。。 …

「Ansi Common Lisp」7章練習問題

1. ファイル名を引数として、ファイルの各行を構成するストリングをリストとして返す関数を定義せよ。 (defun file-to-str-list (file) (let ((result nil)) (with-open-file (str file :direction :input) (do ((line (read-line str nil 'eof) (read-line …

「Ansi Common Lisp」6章練習問題

1. 60ページのtokensについて、:testと:startを引数としてとる(デフォルトはそれぞれ#'constituent, 0)形に定義せよ。 (defun tokens (str test start) (let ((p1 (position-if test str :start start))) (if p1 (let ((p2 (position-if #'(lambda (c) (not …

「Ansi Common Lisp」6章読了

関数に関する章。これもLispの核のような気がするので多分重要です。 大域関数 fboundpは関数の存在を確かめる関数。 * (fboundp '+) T * (fboundp '&) NIL * ドキュメンテーション defunで定義した関数の本体前の式(の一つ)がストリングであれば、それは関…

「Ansi Common Lisp」5章練習問題

1. 以下の式をletや*letを使わないで、しかも1つの式が2度評価されることがないような等価な式に書き換えよ。 (a) (let ((x (car y))) (cons x x)) letはlambdaで置き換えられるので、 (setf y '(a b c)) (let ((x (car y))) (cons x x)) ((lambda (y) (cons…

「ANSI Common Lisp」5章読了

5章は制御構造のお話し。 普通(?)の言語なら、ここで条件分岐と繰り返しについて語られるところですが、いきなりブロックときたもんだ。 ブロック ブロックを作るには、progn、block、tagbodyがあるが、 普通はprogn、途中での飛び出し(処理中断)が必要であ…

「ANSI Common Lisp」4章練習問題

1. 正方の配列(大きさが(n n)の配列)を引数としてそれを90度、時計回りに回転させる関数を定義せよ。 ちょ。いきなり難しいなあ。 思いっきり手続き言語っぽいが、とりあえずできた。 (defun quarter-turn (arr2d) (let ((arr2d-dimensions (array-dimension…

「ANSI Common Lisp」4章読了

特別なデータ構造と題して、リスト以外のデータ構造を扱う。 本章ではLispのほかのデータ構造である、配列(ベクタとストリングを含む)、ストラクチャ、ハッシュ表の使用法を説明する。これらは、リストほど柔軟性はないかもしれないが、高速なアクセスとスペ…

「ANSI Common Lisp」3章練習問題

1. 箱表記で以下のリストを示せ。 (d)はちょっと自信なし。 2. もとのリストでの要素の並びを保持するように動作するunionの変形版を書け。 (defun new-union (x y) (if (null y) x (if (member (car y) x) (new-union x (cdr y)) (new-union (append x (lis…

「ANSI Common Lisp」3章練習問題 - Haskell版

2. もとのリストでの要素の並びを保持するように動作するunionの変形版を書け。 newUnion::(Eq a) => [a] -> [a] -> [a] newUnion x [] = x newUnion x (y:ys) = if elem y x then newUnion x ys else newUnion (x ++ [y]) ys main = print $ newUnion "abc"…

「ANSI Common Lisp」3章読了

リストに関する章。LispはLISt Processorの略なので、かなり重要と思われます。 コンス car(先頭要素へのポインタ)とcdr(残りの要素へのポインタ)の組をコンスというらしい。 Haskell的に書けば、xxs@(x:xs)記法(アズパターンという名前らしい)を使って、 ma…

「ANSI Common Lisp」2章練習問題 - Haskell版

Haskellに置き換えられそうなやつだけやってみる。 4.2つの数を引数として、大きい方を返す関数を定義せよ。 先日のエントリで、 大きい方って、同じ場合はどうするんでしょうね。 とりあえずnilを返すようにしてみました。 って書いたけど、Haskellにはnil…

「ANSI Common Lisp」2章練習問題

長いので別エントリにしてみる。 1. 以下の式が評価されたとき何が起こるかを説明せよ。 やってみればいいじゃん。 * (+ (- 5 1) (+ 3 7)) 14 * (list 1 (+ 2 3)) (1 5) * (if (listp 1) (+ 1 2) (+ 3 4)) 7 * (list (and (listp 3) t) (+ 1 2)) (NIL 3) * …

「ANSI Common Lisp」2章読了

Lispを学ぶついでに、Haskellの復習もやってしまおうという企画(?)にしました。 が、どこまで出来るのかは不明です。。(と逃げを打っておく) リストから3番目の要素を取り出す thirdって関数があるらしい。便利。 (third '(1 2 3)) (third '(1 2)) (third '(…

CMUCLでファイルに保存されたLispプログラムを実行する

とりあえず処理系は、WikipediaのCommon Lispのページの実装のリストで先頭に載っていたCMUCLを使うことにしました。 sudo apt-get install cmucl でOK。 cmucl、または、lispコマンドをたたくことでインタプリタが起動するので、とりあえずlispプログラムを…

「ANSI Common Lisp」読み始めました。

ANSI Common Lisp (スタンダードテキスト)作者: ポールグレアム,Paul Graham,久野雅樹,須賀哲夫出版社/メーカー: ピアソンエデュケーション発売日: 2002/08メディア: 単行本購入: 1人 クリック: 102回この商品を含むブログ (68件) を見る色々あって(なんだか…