(list '+ 3 5)
(+ 3 5)
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
3 行目の結果が 2 行目の結果と異なるのはなぜですか?
(list '+ 3 5)
(+ 3 5)
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
3 行目の結果が 2 行目の結果と異なるのはなぜですか?
2 番目の例で(+ 3 5)
は、数値 3 と 5 が評価され、次に、記号 に対応する関数を数値 3 と 5 に適用することによって、式全体が評価され+
ます。最初の例で追加'
する必要があります。)
最初の例では、Lisp は3 と 5 と同様'+
に (結果として記号) を評価し、それらに関数を適用します。これは、(評価された) 引数のリストを作成するだけです。+
list
3 番目の例は、内側のリストに対して同じことを行います。最初の例と同様に、全体が評価されます。これにより、 が得られ(+ 3 5)
ます。次に、関数の外部インスタンスがlist
この結果に適用され、別のリストがラップされます。
3 番目の例の代わりに、次のようにしたいかもしれません。
(list (funcall #'+ 3 5))
この場合、#'
は Lisp に に関連付けられた関数を取得するように指示し+
ます。Common Lisp は通常、シンボルの通常の値を格納する方法とは異なる方法で関数を格納します。シンボルの通常の評価は通常のシンボル値を取得しますが、評価#'your-symbol
は関連する関数が存在する場合はそれを取得します。
次にfuncall
で得た関数#'+
を 3 と 5 に適用します。その演算の値を に渡しlist
、 を生成し(8)
ます。
(これについてはもっと正確な言い方もありますが、私は初心者にアイデアを伝えようとしています。)
LIST は、引数からリストを作成する関数です。s 式が評価されるとき、Lisp はその最初の要素をチェックし、それが関数 (LIST は関数) である場合、最初にリスト内のすべての要素を繰り返し、それらを評価し、値を引数として関数に渡します。
2 行目では、8 に評価された内部形式 (つまり (+ 3 5)) があり、外部の (list ) 呼び出しは 1 つの要素を含むリストを作成します。
3 行目には、値として 3 要素リスト (+ 3 5) に評価された list への内部呼び出しがあります。これは Lisp がさらに評価するフォームではありません。記号 + を先頭に持つリストを作成しただけです。外部リスト呼び出しを評価すると、別の 1 要素リスト (3 要素リストをヘッドとして含む) が得られます。
それが役に立てば幸い。