Scheme中的return语句是什么?

sco*_*cot 5 scheme return

我正在尝试将这个Python程序翻译成Scheme:

def test(x):
    if x > 1:
        print('foo')
    if x > 10:
        return
    if x == 4: 
        print('bar')


test(1)
test(2)   # prints 'foo'
test(4)   # prints 'foo\nbar'
test(11)  # prints 'foo'
Run Code Online (Sandbox Code Playgroud)

return方案中的声明是什么?

Ósc*_*pez 5

在Scheme中没有显式的return关键字——它比这简单得多,表达式序列中最后一个表达式的值就是返回的值。例如,您的 Python 代码将转换为此内容,并注意大小写(> x 10)必须移至底部,因此如果为 true,则可以立即使用#f值退出该函数。

(define (test x)
  (if (> x 1)
      (do-something))
  (if (= x 4)
      (do-something))
  (if (> x 10)
      #f))

(test 11)
=> #f
Run Code Online (Sandbox Code Playgroud)

事实上,在对条件重新排序后,我们可以删除最后一个,但要注意:根据 Guile 的文档x,如果is not ,将返回未指定的值- 换句话说,您应该始终在每种情况下返回一个值,并且表达式应该具有后续部分和替代部分。4if

(define (test x)
  (if (> x 1)
      (do-something))
  (if (= x 4)
      (do-something)))

(test 11)
=> unspecified
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我认为 Python 代码中的逻辑有点不对劲。x每当传递大于的值时,第一个条件将始终被评估1,但如果它小于或等于1Python中的返回值,则返回值None,而在Scheme中则未指定。此外,原始函数没有显式返回值 - 在 Python 中,这意味着None将返回该值,在 Scheme 中,返回值要么是(do-something)ifx碰巧是4,要么在任何其他情况下未指定。

  • 更忠实的翻译是 `(define (test x) (if (> x 1) (do-something)) (if (not (> x 10)) (if (= x 4) (do-something))) )`,因为`if (x) return; {block}` 等价于 `if (!x) {block}`。 (2认同)