无论如何检查一个函数是否在Scheme中什么都不返回?
例如:
(define (f1)
(if #f #f)
)
或者
(define (f2) (values) )
或者
(define (f3) (define var 10))
如何检查是否不f
返回任何内容?
提前致谢。
是的。您可以将调用包装在生成值列表的内容中。例如。
(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 中很有用。
在 GNU Guile 中,检查这一点的功能是unspecified?
:
(unspecified? (if #f #f)); returns #t
(unspecified? '()); returns #f