Lisp入门6-リスト
commonlisp吧
全部回复
仅看楼主
level 13
动的なデータの并び
数値や文字など、LISP で扱うことができる何らかのデータをまとめてリストとして管理することができます。 リストは、一般的なプログラミング言语における配列のようなものだと思って良いですが、LISP 言语には明确に配列という机能も存在するため、リストと配列は异なります。 LISP のリストは、近年のオブジェクト指向型フレームワークにおける动的配列やイテレータのような、顺次アクセス型の动的なデータ并びに近い存在です。
リストも LISP が扱う一つのデータ型で、组み込み関数 list で定义することができます。
list &rest args
この関数の引数には、リストのデータ并びに指定する任意のデータを指定します。 このとき、リストに配置される各々のデータを要素と呼びます。 例えば (list 10 20 30) とあった场合、数値 10、20、30 がリストの要素となるのです。
> (list 1 2 3 4 5)
(1 2 3 4 5)
このように、list 関数でリストを定义すると、システムは括弧 ( ) で括ってリストを表示します。 リストも一つのデータなので、リストの要素にリストを指定することも可能です。
> (list (list 1 2 3) (list 10 20 30) 100 200 300)
((1 2 3) (10 20 30) 100 200 300)
このリストの第一要素と第二要素は、同じく list 関数で作成されたリスト型のデータになっています。 このように、様々なデータ型をリストとして并べることができるので、リストは柔软にデータを扱うための重要な存在です。
list 関数に値の列を送ることでリストを得ることができましたが、quote 特别式にリスト表记を指定することで式を评価しないリストを得ることもできます。
quote object
この式は、変数を使うために记号型の値を作成するときに使いました。 実は、quote は引数に渡されたデータを评価せずに値として返すという性质を持つ特别式なのです。 そのため、x や sakura という识别子を渡すと、そのまま x や sakura という记号を评価せずに返したのです。
LISP のデータ构造に惯れていない手続き型思考のプログラマには、この概念は难しく感じるかもしれません。 例えば (1 2 3) という表记はリスト表记ですが、これをシステムが実行すると 1 という関数に引数 2 と 3 を渡すものだと评価されてしまうのです。 同様に、変数 x が 10 という値を保存している场合 (set x 20) は変数 x に 20 を代入するのではなく、(set 10 20) と评価されてしまうのです。
これを逆に考え、quote は引数に渡したデータを评価しないという特别式であるということを认识すると、quote の本质的な意味が理解できます。 (quote x) は x を评価するのではなく、システムが认识できる直接の记号 x を返していたのです。 システムはリストを括弧で括ったデータ列として认识するため quote に ( ) 表记のデータを渡せば、それを评価せずにリストとして返すということになります。
> (quote (10 20 30))
(10 20 30)
> '(10 20 30)
(10 20 30)
これは、リスト表记のデータを quote 特别式に指定することでリストを作成した例です。 quote は ' で省略表记できたので、(quote (10 20 30)) は '(10 20 30) でも同じです。
くどく言いますが、list 関数と quote 特别式の违いは、式を评価するかどうかです。 list 関数は引数に指定された任意の个数のデータを受け取り、それをリストに変换して返します。 このとき、list 関数を実行した时点で引数は评価されています。 一方 quote は评価されません。
> (setq x 10 y 20 z 30)
30
> (list x y z)
(10 20 30)
> (quote (x y z))
(X Y Z)
これは、setq で初期化した変数 x、y、z をリストの各要素に指定した场合の例です。 list 関数の场合の结果は明白で、関数実行时に x、y、z 记号が评価され、変数に格纳されている値がリストの要素となります。 一方の quote は (x y z) が评価されずに、记号がそのままリストの要素となります。
--------------------------------------------------------------------------------
2011年11月04日 12点11分 1
level 13
リストの操作
リストは一種のスタックのような性質があり、動的に要素を追加したり、要素を取得することができます。 近年で一般的な動的配列とは異なり、どちらも先頭要素を対象にして行われるという特徴があるので注意してください。
リストの先頭要素を取得するには car 関数、先頭要素以外を得るには cdr 関数を使います。 この二つの関数による処理を繰り返すことができれば、先頭要素から順にリストのデータを検出することができるでしょう。
car list
cdr list
これらの関数の引数には、リスト型のデータを指定します。
> (setq x '(10 20 30))
(10 20 30)
> (car x)
10
> (setq x (cdr x))
(20 30)
> (car x)
20
> (setq x (cdr x))
(30)
> (car x)
30
この例では、変数 x にリスト (10 20 30) を保存し、このリストを先頭から順に取り出すというものです。 先頭要素のデータを得るには car 関数を用いて、先頭要素を取り除いたリストを得るには cdr 関数を使っています。 (setq x (cdr x)) では、変数 x が保存しているリストの先頭要素を除いたリストを改めて x に保存しています。

2011年11月04日 12点11分 2
level 13

逆に、リストにデータを追加したい場合は cons 関数を使います。 cons 関数は指定したリストの先頭に、新しい要素としてデータを追加します。
cons addValue list
addValue には追加するデータを、list には対象のリストを指定します。 この関数によって、list の先頭に addValue を追加した新しいリストが返されます。
> (setq x '(30))
(30)
> (setq x (cons 20 x))
(20 30)
> (setq x (cons 10 x))
(10 20 30)
この例では、最初は 30 が要素を一つだけのリストを x に保存し、その後 (setq x (cons 20 x)) というような形で、リストを保存している変数 x に対して新しい要素を追加しています。
----------------------------------------------------------------------------------------------------------------------------
2011年11月04日 12点11分 3
level 13
空のリスト
cdr 関数で要素が全て失われたリストや、最初から要素が存在しないリストは空のリストと呼ばれます。 空のリストは表記上 ( ) と記述されますが、システムでは定数 nil と同義です。 そのため、リストの評価結果が nil である場合、リストは要素を持たないと解釈することができます。
> (list)
NIL
> (quote ())
NIL
この例から確認できるように list 関数に引数を渡さなかった場合や ( ) は nil であることがわかります。 nil は特別な定数で、nil という記号を表します。
リストが空であるかどうかは、length 関数から判断することも可能です。 この関数は引数に指定されたリストの要素の数を返します。
length sequence
sequence にリストを指定することで、この関数は指定されたリストの要素数を返します。 要素が空である場合や nil が指定された場合は 0 を返すでしょう。
> (length '(10 20))
2
> (length (cdr '(10)))
0
> (length nil)
0
2011年11月04日 12点11分 4
level 13
ええと。。。これはちょっとゆっくり消化しないと头の中がぐちゃぐちゃで発酵しそうな感じです。。。
↓これは结果的に同じ?
(setq x '(10 20 30))
(setq x (list 10 20 30))
↓これだと违う?
(setq x '(a b c))
(setq x (list a b c))
2012年08月14日 08点08分 5
前者最后的结果都是列表(10 20 30),后者中的第二上(list a b c)错误,因为符号a b c没有定义,求值将失败,前者则结果为(A B C)
2012年08月14日 19点08分
回复@雾雨魔理沙㊣ :おはようございます~[太开心]今日は珍しく朝から。。。あれ。。。タイムスタンプがおかしい[狂汗]
2012年08月14日 23点08分
回复 nadesico19 :[揉脸]
2012年08月15日 07点08分
回复 雾雨魔理沙㊣ :[汗]うらやましいな。。。
2012年08月15日 07点08分
1