умножение пустого списка в emacs lisp - PullRequest
7 голосов
/ 24 января 2012

Почему в lisp (Emacs Lisp и Scheme, как я знаю) конструкция типа (*) возвращает 1?

Что я умножаю здесь?Как я могу вызвать эту функцию * без аргументов?

Ответы [ 2 ]

10 голосов
/ 24 января 2012

Это математическое соглашение: произведение пустой последовательности чисел равно единице по определению;обратите внимание, что один является единичным элементом для умножения (1 × a = a × 1 = a ).Это удобно, потому что вы можете вызывать * с переменным числом аргументов, не беспокоясь о случае, когда аргументов нет.

Аналогично, сумма пустой последовательности чисел равна нулю, элемент тождествадля дополнения.Попробуйте ввести (+) в командной строке Lisp.

4 голосов
/ 24 января 2012

Это свойство, унаследованное от математики. Это как сложение , вы можете сложить любое количество чисел, в особом случае, когда сложение без чисел даст вам нулевую сумму.

Аналогично для умножения, если вы умножите произвольное число чисел, вы получите продукт. Чтобы это работало без чисел, в качестве базового значения используется 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
...