Существуют ли аргументы по умолчанию для процедур, если они имеют только один? - PullRequest
1 голос
/ 28 января 2020

Может ли кто-нибудь объяснить следующее выражение

> (+)
0
> (+ 1)
1
> (- 1)
-1
> (/ 1)
1
> (/ 2)
1/2
> (/ 3)
1/3

Если аргумент по умолчанию равен 1, почему (+ 1) возвращает 1, а (/ 2) возвращает 1/2?

Не должен (+ 1) вернуть 2?

Ответы [ 3 ]

5 голосов
/ 28 января 2020

Для + и * неявный первый аргумент по умолчанию - это элемент идентификации для представляемых ими математических операций, которые представляют собой операции сложения и умножения в различных числовых полях. Для + это 0, который является элементом идентификации для группы сложения по числам; для * это 1, который является единичным элементом для умножения на числа.

Итак

  • (+) равен (+ 0) равен 0;
  • (+ 1) это (+ 0 1) это 1;
  • (*) это (* 1) это 1;
  • (* 2) это (* 1 2) это 2 .

Для - и / неявные аргументы по умолчанию являются соответствующими идентификаторами операций, для которых они также являются обратными, хотя для этих функций требуется как минимум один аргумент и их поведение с более чем одним аргументом не так просто.

Так что

  • (-) - ошибка (я не понимаю, почему это не должно быть 0);
  • (- 1) равно (- 0 1) равно -1;
  • (- 1 2) равно не (- 0 1 2);
  • (/) ошибка (Я не понимаю, почему это не должно быть 1);
  • (/ 2) это (/ 1 2) это 1/2;
  • (/ 3 2) это не (/ 1 3 2).

Если быть точным, в контексте схемы аргументами по умолчанию являются * 107 1 * точные числа, представляющие тождества, я думаю.

Обратите внимание, что эти аргументы по умолчанию просто выбраны для математического удобства: это не является чем-то присущим структуре языка. Я мог бы определить язык, где (+) было "foo", хотя, вероятно, это был бы не очень полезный язык.

4 голосов
/ 28 января 2020

Если есть аргумент по умолчанию 1, почему (+ 1) возвращает 1 ...

Посмотрите внимательно. Для + «аргумент по умолчанию» на самом деле 0 (а не 1, как вы заявляете):

> (+)
0

Это именно то, что документация говорит о +:

... Если аргументы не предоставлены, результат равен 0.

Затем, когда вы добавляете 1 к 0, вы получаете 1:

> (+ 1)
1

(Примечание. Если вы хотите добавить 1 к номеру, используйте add1. Например, (add1 1) -> 2)

Для процедуры variadi c (т. Е. Процедуры, которая может принимать переменное число аргументов), «аргумент по умолчанию» зависит от того, как процедура была реализована. Например, если вы определяете процедуру, используя (define (f . arglist) ...), неявный аргумент по умолчанию зависит от того, как процедура использует arglist.

0 голосов
/ 29 января 2020

Вы должны понимать операции уменьшения и складывания . + и - могут быть выражены как сокращения, но в сокращениях вы явно видите значение для пустого набора операндов.

...