可以“康德”完全替换“if”声明?

发布于 2024-12-11 08:36:43 字数 52 浏览 0 评论 0原文

我知道“cond”是基于“if”的,但是“cond”可以做“if”能做的所有事情吗? 谢谢

I know 'cond' is based off 'if', but can 'cond' do everything 'if' can do?
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦在深巷 2024-12-18 08:36:43

是的。任何

(if x y z)

使用 if 的条件都可以转换为使用 cond 的等效条件:

(cond (x y)
      (t z))

例如,考虑以下情况:

(if (= 1 2) (format t "crazy~%") (format t "sane~%"))

上面的代码可以转换为:

(cond ((= 1 2) (format t "crazy~%"))
      (t (format t "sane~%")))

Yes. Any conditional

(if x y z)

using if can be transformed into an equivalent conditional using cond:

(cond (x y)
      (t z))

For example, consider the following:

(if (= 1 2) (format t "crazy~%") (format t "sane~%"))

The above code can be transformed into:

(cond ((= 1 2) (format t "crazy~%"))
      (t (format t "sane~%")))
陈甜 2024-12-18 08:36:43

“if”很可能被实现为围绕“cond”的宏。 “cond”是这里实际的“原语”,而不是“if”。

"if" may well be implemented as a macro around "cond". "cond" is the actual "primitive" here, not "if".

梦年海沫深 2024-12-18 08:36:43

根据您所处理的 Lisp,ifcond 肯定并不总是可以互换。这是一个测试来找出答案。我给出的结果来自 MIT 的(2014)Scheme 解释器。

测试

我们可以设计一个使用 cond 实现的 new-if 方法:

(define (new-if predicate then-clause else-clause)
   (cond (predicate then-clause)
         (else  else-clause)))

我们可以使用 old-if 和 new-if 尝试以下操作:

(define (recursive-func a b)
    (if (= a 0) b
        (recursive-func a b)))

(recursive-func 0 1)

=> 1

并使用 new-if

(define (recursive-func a b)
    (new-if (= a 0) b
         (recursive-func a b)))

(recursive-func 0 1)

=>; ;中止!:超出最大递归深度

Depending on which lisp you're dealing with, if and cond are definitely not always interchangeable. Here's a test to find out. The results I give are from MIT's (2014) Scheme interpreter.

Test

We may design a new-if method made using cond:

(define (new-if predicate then-clause else-clause)
   (cond (predicate then-clause)
         (else  else-clause)))

We may try the following with the old-if and the new-if:

(define (recursive-func a b)
    (if (= a 0) b
        (recursive-func a b)))

(recursive-func 0 1)

=> 1

And with new-if:

(define (recursive-func a b)
    (new-if (= a 0) b
         (recursive-func a b)))

(recursive-func 0 1)

=> ;Aborting!: maximum recursion depth exceeded

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文