0

私は何をしているのか疑問に思って(cons? list-name)いました。list-name空でないリストではないことを確認するだけですか?の反対のようなもの(empty? list-name)ですか?もしそうなら、代わりにただ言っ(empty? list-name)てから言うほうがいいのではないですか?例えば:elsecons?

(define (f list-name)
   (cond
     [(empty? list-name) empty]
     [(cons? list-name) "do something]))
4

2 に答える 2

1

cons?cons値がセルかどう(cons foo bar)fooをチェックしますbar

> (cons? 1)
#f
> (cons? '())
#f
> (cons? (list 1 2 3))
#t
> (cons? (cons 1 2))
#t

(cons? a)が true の場合carcdronを安全に使用できますa

これは、引数が空のリストである場合にのみ true であるため、 soempty?の反対ではありません。empty?(empty? 1) == (cons? 1) == #f

補足:PLEASE HELP!!質問のタイトルに「または類似」を入れないでください。ここにいる全員が喜んで助けてくれますが、読むのは少し不快です。今後気をつけたいことばかりです。SOへようこそ。

于 2013-12-02T18:52:01.977 に答える
1

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同じことを行いますがfirstrestcarcdr、何かを 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 ...
于 2013-12-02T19:04:03.613 に答える