プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやるITエンジニアがスキルアップの話を中心に日常を綴るブログです。

「Ansi Common Lisp」8章読了

シンボルに関する章。RubyのシンボルもLispのシンボルに似てるのかしら。
どっちも未だにイマイチ理解できてないですが。

シンボル名

大文字と小文字は区別しない。空白を含んだシンボル名はパイプ(|)でくくる。

* 'abc

ABC
* (eql 'symbol 'SYMBOL)

T
* '|abc|

|abc|
* '|ABC|

ABC
* '|Common Lisp|

|Common Lisp|
*

なんで'|abc|は|abc|で、'|ABC|はABCなのだろう。。
普通は大文字なんだけど、小文字のシンボル名を敢えて使っているからですかね。

属性リスト

オブジェクト指向言語でいうところのプロパティみたいなものらしい。

* (setf (get 'rectangle 'width) 10)

10
* (setf (get 'rectangle 'height) 5)

5
* (* (get 'rectangle 'width) (get 'rectangle 'height))

50
* (symbol-plist 'rectangle)

(HEIGHT 5 WIDTH 10)
*

symbol-plistを使うと、属性リストの一覧が連想リストで返ってくるので、
以前練習問題で作った、連想リスト → ハッシュの関数を使えば、扱いやすくなるかも知れませんね。

シンボルは大きい

要は一種のオブジェクトなので、サイズは大きいですよ。というお話。

シンボルの生成

今までは:symbol-nameでシンボルを生成してきたが、internを使う方法もあるよ。というお話。

* (setf sym (intern "Symbol"))
Warning:  Declaring SYM special.

|Symbol|
* (symbolp sym)

T
* (symbolp "sym")

NIL
*

symbolpでシンボルかどうかテストできるみたいです。
パッケージうんぬんって話も載ってますが、Javaのパッケージの概念に近いのだと思う。要は名前空間でしょ。多分。

多重パッケージ

パッケージの定義と使い方。
モジュール分割をやってみました。
package.lがライブラリで、use-package.lがライブラリを使う方。

* taka@taka-desktop:~/lisp$ more package.l
(defpackage "MY-LIBRARY"
            (:use "COMMON-LISP")
            (:nicknames "MY-LIBRARY")
            (:export "TWICE"))

(in-package my-library)

(defun twice (x)
  (* x 2))
taka@taka-desktop:~/lisp$ more use-package.l
(defpackage "MY-APPLICATION"
            (:use "COMMON-LISP" "MY-LIBRARY")
            (:nicknames "APP"))

(in-package my-application)

(twice 2)
(my-library:twice 2)
taka@taka-desktop:~/lisp$ cat package.l use-package.l | lisp -batch -quiet
*
#<The MY-LIBRARY package, 0/8 internal, 1/2 external>
*
#<The MY-LIBRARY package, 0/8 internal, 1/2 external>
*
TWICE
*
#<The MY-APPLICATION package, 0/9 internal, 0/2 external>
*
#<The MY-APPLICATION package, 0/9 internal, 0/2 external>
*
4
*
4
* taka@taka-desktop:~/lisp$

キーワード

いまいちキーワードとシンボルの違いが分からず。。

* (keywordp :abc)

T
* (keywordp (intern "abc"))

NIL
* (symbolp :abc)

T
* (symbolp (intern "abc"))

T
*

つまり、

- symbolp keywordp
シンボル t nil
キーワード t t

ってことで、キーワードは:hogeって形式で書かれ、シンボルでもあるってことですかね。

シンボルと変数

オブジェクトと値(Javaでいうところのリファレンス型とプリミティブ型)の違いみたいなものかなあ。