関数が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
は正確に 1 つの値を返しますが、レポートでは定義されていません (Scheme 標準)。つまり、呼び出しごとに変化する可能性があり、結果(eq? (display "test1") (display "test2"))
は不明です。
実装は通常、未定義の値を表すためにシングルトン値を選択しますが、それに依存することはできません。実装は何でも自由です。例えば。少なくとも1つのScheme実装でこれが起こることを私は知っています:
(define test 10)
(+ (display 5) (set! test 15))
; ==> 20 (side effects prints 5, and test bound to 15)
これを実際に使用するのはクレイジーですが、おそらく REPL で役立つでしょう。