我试图根据我自己写的谓词筛选出一个列表,但是当我运行筛选时,我得到

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))

有什么想法吗?谢谢!

最佳答案

因此,代码中的(call-with-current-continuation ...)被包装在额外的括号中,这意味着Scheme应该获取结果,并在获得结果时将其作为过程运行。
通常在LISP evaluator中apply是运行过程的过程如。

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

但是,您的代码会尝试这样做,因为f不是过程,所以不能像运行它一样运行它。
对其他地方的评论如果你不使用(#f),你真的不应该使用apply,而且return与你想象的完全不同当您修复了问题时,call-with-current-continuation的计算结果总是for-each,因为continuation lambda主体中的最后一个表达式是nowhitespace?(返回值)。
我想你想找的是:
;; 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?)))

10-06 07:07