私は関数の引数宣言で&rest
を見ると、ruby
の*args
と似ていると思っていました。そして私は+
と同じことをするために関数sumit
を書き始めました。共通リスプで `&rest` argsをどう扱うか
(defun sumit (&rest args)
(if (null args)
0
(+ (car args) (sumit (cdr args)))))
が、私はそれがセグメンテーションフォールトを取得(sumit 1 2 3)
を呼び出すとき、再帰は決して終わりません。 (sumit)
でも動作します。
私の容疑者は(null args)
の部分ですが、(eql nil args)
などのようなものを変更した後でも同様のことはできません。
したがって、&rest
argsを分解する正しい方法は何ですか? nil
をチェックする正しい方法は何ですか?
'SUMIT'は可変数の数値を引数としてとりますが、数字ではなく単一のリスト引数で呼び出す'(sumit(cdr args) ')にあります。代わりに '(apply# 'sumit(cdr args))'を使う必要があります。 – jkiiski
@jkiiskiオハイオ州、そうですよ!どうも! btw、 'apply'を使わずに複数の引数にリストを展開する方法はありますか? – delta
@delta:no、use APPLY –