检测Scheme列表中的#<unspecified>

Roh*_*nde 2 scheme guile

我有一个返回值列表的函数.其中一些值可能是空列表本身,而有些则不是.但是,在每个列表的末尾,都存在一个#<unspecified>值.我知道当函数没有返回任何内容时会返回此值.

我想修剪此值以及其他空列表.

我的清单是这样的:
(() () MD- MC+. #<unspecified>)

我打算将过滤功能应用于此列表.我将要应用的标准是null?.
但是,当这个应用于该#<unspecified>值时,它会给我错误.如何#<unspecified>从列表中删除值?

应用过滤函数后,此列表的输出应为: (MD- MC+)

我该怎么做呢?

Syl*_*ter 6

您的列表不是正确的列表,而是虚线列表.像所有的高阶函数filter,fold,map,...要求清单以适当所以不能使用该名单.

我想知道你是否坚持这样的列表的原因可能是由于产生列表的过程中的错误.通常,如果你有一个递归程序..

(define (list-add1 lst)
  (if (pair? lst) 
      (cons (add1 (car lst)) (list-add1 (cdr lst)))))
Run Code Online (Sandbox Code Playgroud)

现在,每个策划者都会立即看到这与以下内容相同:

(define (list-add1 lst)
  (if (pair? lst) 
      (cons (add1 (car lst)) (list-add1 (cdr lst)))
      'UNDEFINED-IMPLEMENTATION-SPECIFIED-VALUE))
Run Code Online (Sandbox Code Playgroud)

使用时,您将把正确的列表更改为虚线列表:

(list-add1 '(1 2 3)) ; ==> (2 3 4 . UNDEFINED-IMPLEMENTATION-SPECIFIED-VALUE)
Run Code Online (Sandbox Code Playgroud)

修复是为了使虚线列表处理两个分支的过程if.例如.

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

(list-add1 '(1 2 3)) ; ==> (2 3 4)
Run Code Online (Sandbox Code Playgroud)

当然,如果不是这种情况,你可以通过将最终值保持在自己的缺点或删除它来将点线变换为正确:

(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)
Run Code Online (Sandbox Code Playgroud)