質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top