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は正確に 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 で役立つでしょう。

于 2015-11-19T09:35:47.050 に答える