方案过滤器 - "错误的应用价值:#f"

时间:2014-07-24 22:46:30

标签: list filter scheme lisp conditional

我正在尝试根据我自己编写的谓词过滤掉一个列表,但是当我运行过滤器时,我得到了

ERROR: Wrong value to apply: #f

谓词的代码:

;;;Predicate for checking if a string is not empty or full of whitespaces
(define (notwhitespace? str)
  (if (equal? str "") #F (
    (call-with-current-continuation
     (lambda (return)
      (for-each
       (lambda (c)
         (if (not (char-whitespace? c)) #T #F))
        (string->list str))
        #F))
      )
    )
)

这是我对过滤器的实现(它在一个let语句中):

(updated-strlist(filter notwhitespace? strlist))

任何想法?谢谢!

2 个答案:

答案 0 :(得分:0)

不要写(#f),它应该是#f

答案 1 :(得分:0)

因此,代码中的(call-with-current-continuation ...)在括号中包装,这意味着Scheme应该获取结果并在获取结果时将其作为过程运行。

通常在LISP评估程序中apply是运行过程的过程。例如

(define (test) (display "hello"))
(define (get-proc) test)
((get-proc)) ; ==> undefined, displays "hello"

然而,您的代码尝试执行此操作(#f),因为#f不是一个过程apply无法运行它,就好像它是一个。

对其余部分的评论。如果您没有使用return,那么您根本不应该使用call-with-current-continuationfor-each完全不同于您的想法。当您修复问题时,nowhitespace?将始终评估为#f,因为延续lambda正文中的最后一个表达式为#f(返回值)。

我猜你正在寻找类似的东西:

;; needs to import (srfi :1)
(define (notwhitespace? str)
  (every (lambda (x) (not (char-whitespace? x)))
         (list->string str)))

;; needs to import (srfi :13)
(define (notwhitespace2? str)
  (not (string-index str char-whitespace?)))