2012-01-24 8 views
7

なぜlisp(私が知っているようにEmacs Lisp and Scheme)のような構文で(*)が返されるのは1ですか?空リストのemacs lispでの乗算

私はここに何を掛けますか?どのように私はこの関数を引数なしで*と呼びますか?

答えて

10

これは数学的な慣例です。product of an empty sequence of numbersは定義の1つです。 1つは乗算のための恒等要素であることに注意してください(1× = ×1 = )。これは、引数が存在しない場合を心配することなく、可変数の引数で*を呼び出すことができるので便利です。

同様に、数字の空のシーケンスの合計はゼロです。これは、追加の恒等要素です。あなたのLispプロンプトで(+)を発行してみてください。

+4

'(*(+)*(*)(*)(*)(*)(*))(+ (*(+(*)(*)(*))(+(*)(*))) –

+0

@EliBarzilay:isそれは獣のsexprですか? –

+0

larsmans、明確な答えをありがとう。 – karasiov

4

これは数学から継承されたプロパティです。それはのようなものです。のように、任意の数の数値を加算することができます。数字を加算しないと、合計がゼロになるという特別なケースがあります。

同様に乗算では、任意の数の数を乗算すると、その製品が得られます。数字を使わないようにするには、1が基本値として使用されます(これは数年前に忘れてしまった数学的な名前です)。

これはプログラミング言語では実用的ですか?はい、任意の数の引数を持つ+*のような関数を呼び出すことができるので、私は「はい」と答えるでしょう。例:

(apply '+ '(2 3 4)) => 9 
(apply '+ '(2 3)) => 5 
(apply '+ '(2))  => 2 
(apply '+ '())  => 0 

(apply '* '(2 3 4)) => 24 
(apply '* '(2 3)) => 6 
(apply '* '(2))  => 2 
(apply '* '())  => 1 
+1

注:Schemeでは、実行する例については、演算子の前にある '' '(つまり' quote')を削除する必要があります。たとえば、 '(apply '+'())の代わりに'(apply + '()) 'を実行します。 –