Несколько возвращаемых значений этажа в dotimes - PullRequest
0 голосов
/ 22 ноября 2018

Статья floor Hyperspec на dotimes имеет следующий пример:

(defun palindromep (string &optional
                           (start 0)
                           (end (length string)))
   (dotimes (k (floor (- end start) 2) t)
    (unless (char-equal (char string (+ start k))
                        (char string (- end k 1)))
      (return nil))))

Если floor возвращает два значения, например, (floor 5 2) -> 2 и1, как dotimes узнает, что нужно просто использовать первое значение и игнорировать второе для его счетной формы?

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Это общий механизм, не специфичный для dotimes.

Если кто-то вызывает функцию или устанавливает переменную, то будет передано только первое значение:

CL-USER 52 > (defun foo (x) x)
FOO

CL-USER 53 > (foo (floor 5 2))
2

CL-USER 54 > (let ((foo (floor 5 2)))
               foo)
2

Комусделать эквивалент (вызов функций, связывание переменных) с несколькими значениями, нужно использовать специальные конструкции:

CL-USER 55 > (multiple-value-call #'list
               (floor 5 2) (floor 7 3)) 
(2 1 2 1)

CL-USER 56 > (multiple-value-bind (foo0 foo1)
                 (floor 5 2)
               (list foo0 foo1))
(2 1)
0 голосов
/ 22 ноября 2018

С 7.10.1 ,

Обычно множественные значения не используются.Специальные формы требуются как для получения нескольких значений, так и для получения их.Если вызывающая функция не запрашивает несколько значений, но вызываемая функция создает несколько значений, то первое значение предоставляется вызывающей функции, а все остальные отбрасываются;если вызываемая функция выдает нулевые значения, то вызывающая сторона получает nil в качестве значения.

Если только вы специально не сделаете что-то, чтобы справиться с множественными значениями (например, с помощью multiple-value-call или одного из различных макросов, предназначенных для их обработки), все, кроме первого значениябудет игнорироваться.

...