apply と funcall - 異なる結果
-
21-12-2019 - |
質問
ANSI共通Lisp。最後のケースで別の答えが得られるのはなぜですか?
(list 1 2 3 nil) ; (1 2 3 nil)
(funcall (function list) 1 2 3 nil) ; (1 2 3 nil)
(apply (function list) '(1 2 3 nil)) ; (1 2 3 nil)
(apply (function list) 1 2 3 nil) ; (1 2 3)
解決
APPLY
引数として期待されるもの:
- 機能
- ゼロ ...n 個の引数
- 最後に引数のリスト
この関数は基本的に次の結果で呼び出されます。 (list* 0-arg ... n-arg argument-list)
ご了承ください (list* '(1 2 3))
と評価します (1 2 3)
.
引数は呼び出されます 拡張可能な引数リスト Common Lispで。
CL-USER 60 > (apply (function list) 1 2 3 nil)
(1 2 3)
CL-USER 61 > (apply (function list) (list* 1 2 3 nil))
(1 2 3)
CL-USER 62 > (apply (function list) (list* '(1 2 3)))
(1 2 3)
APPLY
は、設計上、このような拡張可能な引数リストを使用します。例えば (... 1 2 3 '(4 5))
. 。と FUNCALL
いつものように引数を書く必要があります: (... 1 2 3 4 5)
.
APPLY
Common Lisp における目的は 1 つです。これにより、計算された引数リストを使用して関数を呼び出すことができます。これをもう少し便利にするために、拡散可能な引数リストのアイデアが使用されています。たとえばEmacs Lispでも同様に機能します。
引数のリストがあり、その前に 2 つの引数を追加するとします。
CL-USER 64 > (apply '+ args)
60
CL-USER 65 > (apply '+ 1 2 args)
63
CL-USER 66 > (apply '+ (append (list 1 2) args))
63
所属していません StackOverflow