以dotimes为单位的多个返回值

147*_*7pm 2 common-lisp multiple-value floor

floorHyperspec对文章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))))
Run Code Online (Sandbox Code Playgroud)

如果floor返回两个值,例如(floor 5 2)- > 21,如何dotimes知道只使用第一个值而忽略第二个值的计数形式?

Rai*_*wig 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
Run Code Online (Sandbox Code Playgroud)

要使用多个值执行等效(调用函数,绑定变量),需要使用特殊构造:

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)
Run Code Online (Sandbox Code Playgroud)


Sil*_*olo 6

7.10.1开始,

通常不使用多个值.需要特殊形式来生成多个值并接收它们.如果函数的调用者没有请求多个值,但被调用函数产生多个值,则第一个值被赋予调用者,而所有其他值都被丢弃; 如果被调用函数产生零值,则调用者获取nil值.

除非您专门处理多个值(例如由multiple-value-call处理它们的各种宏或其中一个),否则将忽略除第一个值之外的所有值.