0

无论如何检查一个函数是否在Scheme中什么都不返回?

例如:

(define (f1)
  (if #f #f)
)

或者

(define (f2) (values) )

或者

(define (f3) (define var 10))

如何检查是否不f返回任何内容?

提前致谢。

4

2 回答 2

1

是的。您可以将调用包装在生成值列表的内容中。例如。

(define-syntax values->list 
  (syntax-rules ()
    ((_ expression) 
     (call-with-values (lambda () expression) 
                       (lambda g (apply list g))))))

(apply + 5 4 (values->list (values))) ; ==> 9
(null? (values->list (values)))       ; ==> #t

您的过程f2确实只返回一个值,并且在报告中未定义(方案标准)。这意味着它可以从一个调用到另一个调用而变化,结果(eq? (display "test1") (display "test2"))是未知的。

实现通常选择一个单例值来表示未定义的值,但您不能依赖它。实现可以自由地做任何事情。例如。我知道在至少一个方案实现中会发生这种情况:

(define test 10)
(+ (display 5) (set! test 15))
; ==> 20 (side effects prints 5, and test bound to 15)

实际使用它会很疯狂,但它可能在 REPL 中很有用。

于 2015-11-19T09:35:47.050 回答
0

在 GNU Guile 中,检查这一点的功能是unspecified?

(unspecified? (if #f #f)); returns #t
(unspecified? '()); returns #f
于 2017-11-15T19:34:56.560 回答