Lispの属性リストとSymbolの調査
2007/06/06
途中までしか読んでなかった On Lispを最初から少しだけ読みなおしてみました。
今さら、属性リストを知らないことに気付きました。
属性リスト
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp08.html
属性リストは、ただのキーと値のリストだそうです。属性リストへのアクセス方法は、get関数を使って属性値を取得可能です。設定も、get関数で取得した結果に、setfで値を設定すればよいようです。
なんか定義もせずに連想配列みたいなのにアクセスできるなんて奇妙な感じがしました。make-plistみたいな関数があるかと思ったのですが。
※定義せずに連想配列みたいなのにアクセスできるというのは正確には間違っていたので、追記予定(20070614)
でsymbolは、名前と関数定義と変数と属性リストを持つそうです。
- LispのSymbol
- 名前
- 関数定義
- 変数
- 属性リスト
Lisp で a にいろいろ詰めてみる
(setf a "value") (defun a () "fun") (setf (get 'a 'key) "value of plist") (format t "変数: ~a~%" 'a) (format t "変数値: ~a~%" a) (format t "関数の戻り値: ~a~%" (a)) (format t "属性リストの値: ~a~%" (get 'a 'key))
結果
変数: a 変数値: value 関数の戻り値: fun 属性リストの値: value of plist
Lispでは、a というSymbolに、変数値と関数と属性リストの値を別々に格納することができる、とうことのようです。
これ見て、perlを思い出しました。
- perlの変数
- 名前
- スカラー
- 配列
- 連想配列
perl で a にいろいろ詰めてみる
#!/usr/bin/perl use strict; use warnings; my $a = 'this is scalar.'; my @a = (1, 2, 3, "this is array."); my %a = (1, 2, 3, "this is hash."); #(1 => 2, 3 => "this is hash.")と同じ { no strict "refs"; *{"main::a"} = sub {return "this is sub.";}; } print '$a:', $a, "\n"; print '$a[3]:', $a[3], "\n"; print '$a{"3"}:', $a{"3"}, "\n"; print 'a():', a(), "\n";
結果
$a:this is scalar. $a[3]:this is array. $a{"3"}:this is hash. a():this is sub.
perlでは、a という変数にスカラーと配列と連想配列を別々に格納できます。関数はおまけです。
内部的には、いろいろと違うのかもしれないけど、lispのSymbolに親しみを覚えました。
例によって脱線してますが、Listの属性リストはSymbolをどう扱うかだけの話なので準備も必要なしに、いきなり設定できるようです。