无论如何都要检查一个函数是否在Scheme中没有返回任何内容?

时间:2015-11-19 07:29:23

标签: scheme guile

无论如何都要检查函数是否在Scheme中没有返回任何内容?

例如:

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

(define (f2) (values) )

(define (f3) (define var 10))

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

提前致谢。

2 个答案:

答案 0 :(得分: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确实只返回一个值,并且在报告中未定义(Scheme标准)。这意味着它可以在不同呼叫之间进行更改,(eq? (display "test1") (display "test2"))的结果未知。

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

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

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

答案 1 :(得分:0)

在GNU Guile中,检查它的功能是unspecified?

(unspecified? (if #f #f)); returns #t
(unspecified? '()); returns #f