jozefg の答えは、コンス セルでも空のリストでもないもの (たとえば、数値) があるため、一般に(cons? x)と同じではないことを指摘する点で正しいです。(not (empty? x))
ただし、変数は だっlist-nameたので、その値が実際にはリストであると予想する何らかの理由があるかもしれません。リストは、Scheme では次のいずれかです。
- 空のリスト; また
carがリストのfirst要素であり、 がリストの でcdrあるコンス セルrest。
このため、リストを渡す必要がある関数を作成している場合は、単純に を使用して単純なケース (空のリスト) をチェックし、empty?リストが必要なため、そのケースに一致しないものはすべて、cdrandを呼び出すことができるコンス セルですcdr。これは、
(cons? x) == (not (empty? x))
一般的な値には当てはまりませんが、リストには当てはまります。つまり、それがlstリストであることをすでに知っている場合、
(cons? lst) == (not (empty? lst))
本当です。リストとコンスセルについて話しているとき、同じことをする関数がたくさんあります。たとえば、empty?とnull?は同じことを行いますが、プログラマ側の意図がわずかに異なることを示しています。同様に、carと と とcdr同じことを行いますがfirst、restとcarはcdr、何かを 2 つのもののペアとして扱っている可能性があることを示します。一方first、 とrestは、リストを操作しているという意図を明確に示します。
あなたのコードは、リストを期待しているように見えるので、おそらく次のようになるはずです。なぜなら、リストの場合、それが空のリストでない場合、それは短所でなければならないからです。
(define (f lst)
(cond
[(empty? lst) empty]
[else "do something]))
より一般的には、記述するコードは、期待する入力の種類に依存する必要があります。たとえば、最初のケースでは、リストを期待しているので、空のチェックを行い、それ以外の場合は短所を想定することは問題ありません。2 番目のケースでは、表示される可能性のあるさまざまな種類のものをすべてチェックする必要があります。
(define (frob-list lst)
(cond
[(empty? lst) empty] ; arg is ()
[else ...])) ; arg is (x . y)
(define (frob-object obj)
(cond
[(null? obj) ...] ; arg is ()
[(cons? obj) ...] ; arg is (x . y)
[(number? obj) ...] ; arg is r
... ; arg is ...
[else ...])) ; else ...