下班时间的底楼的多个返回值

时间:2018-11-22 18:41:46

标签: common-lisp floor multiple-value

dotimes上的floor Hyperspec文章有以下示例:

(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)-> 21dotimes如何知道只使用第一个值而忽略第二个值的计数形式?

2 个答案:

答案 0 :(得分:7)

这是一种通用机制,并不特定于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)

答案 1 :(得分:6)

7.10.1

  

通常不使用多个值。需要特殊格式才能产生多个值并接收。如果一个函数的调用者不要求多个值,但是被调用的函数产生多个值,则将第一个值提供给调用者,而所有其他值均被丢弃;如果被调用函数产生零值,则调用者将获得nil作为值。

除非您专门进行一些处理以处理多个值(例如,通过multiple-value-call或配备用于处理它们的各种宏之一),否则除第一个值以外的所有值都将被忽略