【问题标题】:Multiple return values of floor in dotimesdotimes 中 floor 的多个返回值
【发布时间】:2018-11-22 18:41:45
【问题描述】:

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 怎么知道只使用第一个值而忽略第二个的计数形式?

【问题讨论】:

    标签: common-lisp floor multiple-value


    【解决方案1】:

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

    【讨论】:

    • 这是泛函的基本 lambda 演算需要/趋于 curry 的例子吗?
    • @147pm:不,这无关
    【解决方案2】:

    来自7.10.1

    通常不使用多个值。 产生多个值和接收它们都需要特殊的形式。如果一个函数的调用者没有请求多个值,但是被调用的函数产生了多个值,那么第一个值被赋予调用者,其他的都被丢弃;如果被调用函数产生零值,则调用者将nil 作为值。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 2013-02-19
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多