Lisp
スピードと題して。Lispは、 高速のプログラムを書くための言語であり、 高速にプログラムを書くための言語である。 だそうです。 それって二律背反のような気がするのですが、どうなんでしょう。 最近の言語は前者を犠牲にして、後者を取ってますよね。 あ…
1. 自分の使っているコンパイラがインライン宣言に対応しているかどうか確かめよ。 declareも、declaimも使えたので、対応しているのでしょう。 2. 以下の関数を末尾再帰に書き換えよ。コンパイルしたときどのぐらい速度が改善するか。 (defun foo (x) (if (…
ANSI Common Lisp (スタンダードテキスト)作者: ポールグレアム,Paul Graham,久野雅樹,須賀哲夫出版社/メーカー: ピアソンエデュケーション発売日: 2002/08メディア: 単行本購入: 1人 クリック: 102回この商品を含むブログ (68件) を見る本当はあと数章残っ…
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…
データの構造と題して、なんか抽象的な感じ。 共有構造 「あるリストが別のリストの一部」である状態を指すらしい。 * (setf part (list 'b 'c)) Warning: Declaring PART special. (B C) * (setf whole (cons 'a part)) Warning: Declaring WHOLE special. …
1. 図11.2に定義されたクラスに対して、アクセサ、スロットの初期値、スロット初期化引数を定義せよ(:accessor, :initform, :initargを指定する)。また、slot-valueを呼ばずにすむように関連コードを書き換えよ。 図11.2 (defclass rectangle () (height wid…
CLOS(Common Lisp オブジェクトシステム)に関する章。 ほんとなんでもアリって感じですね。 オブジェクト指向プログラミング オブジェクト指向に関する一般的な話なのでスルー。 クラスとインスタンス クラスの定義とインスタンスの作成 * (defclass circle …
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)…
マクロに関する章。「On Lisp」のメインテーマだったような。これが理解できれば「On Lisp」は読みこなせるかも!? Eval リストをLispコードとして扱わせる。 * '(+ 1 2 3) (+ 1 2 3) * (eval '(+ 1 2 3)) 6 * evalは、 効率が悪い(その都度interpriteするか…
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…
数値に関する章。 データ型 基本は、整数、浮動小数点数、分数(ratio)、複素数の4種類。 図9.1に数値型の一覧と親子関係について載っているのですが、 細分化すると全部で14種類もあります。 複素数をデフォルトでサポートしているところが、なんとなくPytho…
シンボルに関する章。RubyのシンボルもLispのシンボルに似てるのかしら。 どっちも未だにイマイチ理解できてないですが。 シンボル名 大文字と小文字は区別しない。空白を含んだシンボル名はパイプ(|)でくくる。 * 'abc ABC * (eql 'symbol 'SYMBOL) T * '|a…
1. 同一の名前をもつ2つのシンボルがeqlでないということはありうるか。 別パッケージで同一の名前ってのがあるので、ありうるが答えでしょう。 (defpackage "PACKAGE1" (:use "COMMON-LISP") (:nicknames "PKG1") (:export "WIN")) (in-package package1) (…
入出力に関する章。 普通のプログラミング言語の入門書なら、まず外せない内容でしょうね。 「ふつうのHaskellプログラミング」では、Wikiエンジンの開発の中で取り上げられていたみたいですが、ここ読んでないので結局標準入出力しか分かってないなあ。。 …
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 …
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 …
関数に関する章。これもLispの核のような気がするので多分重要です。 大域関数 fboundpは関数の存在を確かめる関数。 * (fboundp '+) T * (fboundp '&) NIL * ドキュメンテーション defunで定義した関数の本体前の式(の一つ)がストリングであれば、それは関…
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…
5章は制御構造のお話し。 普通(?)の言語なら、ここで条件分岐と繰り返しについて語られるところですが、いきなりブロックときたもんだ。 ブロック ブロックを作るには、progn、block、tagbodyがあるが、 普通はprogn、途中での飛び出し(処理中断)が必要であ…
1. 正方の配列(大きさが(n n)の配列)を引数としてそれを90度、時計回りに回転させる関数を定義せよ。 ちょ。いきなり難しいなあ。 思いっきり手続き言語っぽいが、とりあえずできた。 (defun quarter-turn (arr2d) (let ((arr2d-dimensions (array-dimension…
特別なデータ構造と題して、リスト以外のデータ構造を扱う。 本章ではLispのほかのデータ構造である、配列(ベクタとストリングを含む)、ストラクチャ、ハッシュ表の使用法を説明する。これらは、リストほど柔軟性はないかもしれないが、高速なアクセスとスペ…
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…
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"…
リストに関する章。LispはLISt Processorの略なので、かなり重要と思われます。 コンス car(先頭要素へのポインタ)とcdr(残りの要素へのポインタ)の組をコンスというらしい。 Haskell的に書けば、xxs@(x:xs)記法(アズパターンという名前らしい)を使って、 ma…
Haskellに置き換えられそうなやつだけやってみる。 4.2つの数を引数として、大きい方を返す関数を定義せよ。 先日のエントリで、 大きい方って、同じ場合はどうするんでしょうね。 とりあえずnilを返すようにしてみました。 って書いたけど、Haskellにはnil…
長いので別エントリにしてみる。 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) * …
Lispを学ぶついでに、Haskellの復習もやってしまおうという企画(?)にしました。 が、どこまで出来るのかは不明です。。(と逃げを打っておく) リストから3番目の要素を取り出す thirdって関数があるらしい。便利。 (third '(1 2 3)) (third '(1 2)) (third '(…
とりあえず処理系は、WikipediaのCommon Lispのページの実装のリストで先頭に載っていたCMUCLを使うことにしました。 sudo apt-get install cmucl でOK。 cmucl、または、lispコマンドをたたくことでインタプリタが起動するので、とりあえずlispプログラムを…
ANSI Common Lisp (スタンダードテキスト)作者: ポールグレアム,Paul Graham,久野雅樹,須賀哲夫出版社/メーカー: ピアソンエデュケーション発売日: 2002/08メディア: 単行本購入: 1人 クリック: 102回この商品を含むブログ (68件) を見る色々あって(なんだか…