2

値のリストを返す関数があります。これらの値には、それ自体が空のリストである場合もあれば、そうでない場合もあります。ただし、すべてのリストの最後には#<unspecified>値があります。関数が何も返さない場合にこの値が返されることを理解しています。

この値を、他のヌル リストと一緒に削除したいと考えています。

私のリストは次のようなものです:
(() () MD- MC+. #<unspecified>)

このリストにフィルター機能を適用するつもりです。私が適用する基準は ですnull?
ただし、これを#<unspecified>値に適用すると、false になります。#<unspecified>リストから値を削除するにはどうすればよいですか?

フィルター関数を適用した後のこのリストの出力は次のようになります。 (MD- MC+)

どうすればいいですか?

4

4 に答える 4

6

あなたのリストは適切なリストではなく、ドット リストです。filterfold、 、...などのすべての高階関数mapはリストが適切である必要があるため、そのようなリストは使用できません。

このようなリストに固執している理由は、リストを作成した手順のバグのためではないかと思います。通常、再帰的な手順がある場合..

(define (list-add1 lst)
  (if (pair? lst) 
      (cons (add1 (car lst)) (list-add1 (cdr lst)))))

さて、すべてのスキーム作成者は、これが次と同じであることをすぐに理解します。

(define (list-add1 lst)
  (if (pair? lst) 
      (cons (add1 (car lst)) (list-add1 (cdr lst)))
      'UNDEFINED-IMPLEMENTATION-SPECIFIED-VALUE))

そして、使用すると、適切なリストをドット リストに変更します。

(list-add1 '(1 2 3)) ; ==> (2 3 4 . UNDEFINED-IMPLEMENTATION-SPECIFIED-VALUE)

修正は、ドット リストが の両方のブランチを処理するようにする手順を変更することですif。例えば。

(define (list-add1 lst)
  (if (pair? lst) 
      (cons (add1 (car lst)) (list-add1 (cdr lst)))
      '()))

(list-add1 '(1 2 3)) ; ==> (2 3 4)

もちろん、そうでない場合は、最終的な値を独自のコンスに保持するか、ドロップすることで、ドットを適切な値に変換できます。

(define (dotted->proper lst keep-value)
  (cond ((pair? lst) (cons (car lst) (dotted->proper (cdr lst) keep-value)))
        ((null? lst) '())
        (keep-value (cons lst '()))
        (else '())))

(dotted->proper '(1 2 . 3) #f) ; ==> (1 2)
(dotted->proper '(1 2 . 3) #t) ; ==> (1 2 3)
于 2015-03-07T16:19:02.267 に答える
4

Guile ではunspecified?、指定されていない値をテストするために使用できます。したがって、次のようにフィルタ関数を記述できnull-or-unspecified?ます。

(define (null-or-unspecified? x)
  (or (null? x) (unspecified? x)))
于 2015-03-07T07:16:54.413 に答える
1

値を返さないことと未指定の値を返すことには違いがあります。values値を返さないために使用できます。

> (values)
> 

RnRS 標準が戻り値が指定されていないと述べている場合、それは、さまざまな実装が好きな値を自由に返すことができることを意味します。実際には、「返された値を使用しないでください。使用する実装は、未指定の値という名前の具体的な値を作成することを選択しました。それは出力され#<unspecified>ます。リストから未指定の値を削除するのではなく、どこにあるかを把握することをお勧めします。値は最初から来ます。

于 2015-03-07T09:08:49.390 に答える
0

Guile と Chicken には特別な述語unspecified?があります。次のようにリストをフィルタリングできます。

(filter (compose not unspecified?) lst)

ラケットにはvoid関数とvoid?述語があります。

また、自分で定義することもできますunspecified?:

(define unspecified (begin))
(define (unspecified? v)
    (eq? unspecified v)
)
于 2016-07-03T17:39:41.410 に答える