转换为cond时遇到问题

时间:2018-09-09 08:37:28

标签: scheme

我试图理解为什么这两个功能给我不同的结果。当我将嵌套的if语句转换为conds时,是否会缺少某些情况?这些功能应该递归地对列表中的元素进行计数。

SELECT /* DISTINCT ?? */
    Sales.Orders.custid
  , Sales.Customers.companyname
  , CASE
        WHEN ca.Order_Delay >= 7 THEN '7+ Weeks'
        WHEN ca.Order_Delay >= 1 AND ca.Order_Delay < 7 THEN CAST(ca.Order_Delay AS varchar) + ' Weeks'
        WHEN ca.Order_Delay IS NULL then 'Unshipped'
        ELSE 'Unknown'
    END AS order_delay
FROM Sales.Orders AS o
INNER JOIN Sales.Customers AS c ON o.custid = c.id
OUTER APPLY (
    SELECT
        FLOOR(DATEDIFF(DAY, o.shippeddate, o.orderdate) / 7)
    ) ca (order_delay)
ORDER BY
    order_delay ASC
;

我尝试过手动操作,但是很难找到问题所在。

1 个答案:

答案 0 :(得分:2)

您的else大小写包含三个不同的表达式:(eq? x L)10。这被视为begin块(可能会说cond的每种情况都会自动启动begin块),这意味着所有三个表达式都按顺序求值,然后求值返回最后一个表达式。因此,无论else是否等于0,您的x案例总是返回L

(eq? x L)不应是else块中的表达式,它应该是cond的条件之一。所以应该是:

(cond
    ((null? L) 0)
    ((pair? L) (+ (countall x (car L)) (countall x (cdr L))))
    ((eq? x L) 1)
    (else 0))