无论如何都要检查函数是否在Scheme中没有返回任何内容?
例如:
(define (f1)
(if #f #f)
)
或
(define (f2) (values) )
或
(define (f3) (define var 10))
如何检查f
是否返回任何内容?
提前致谢。
答案 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