Lispの属性リストとSymbolの調査

途中までしか読んでなかった 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をどう扱うかだけの話なので準備も必要なしに、いきなり設定できるようです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください