List 方案过滤器-“;要应用的值错误:“f”;

List 方案过滤器-“;要应用的值错误:“f”;,list,filter,scheme,lisp,conditional,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 (la

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

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语句中):

有什么想法吗?谢谢

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

,所以
(用当前的延续调用…
)在代码中用额外的括号括起来,这意味着Scheme应该在得到结果时将其作为过程运行

通常在LISP计算器中,应用是运行过程的过程。例如

(定义(测试)(显示“hello”))
(定义(获取过程)测试)
((获取过程));==>未定义,显示“hello”
但是,您的代码尝试执行此操作,因为#f不是一个过程,所以#f不能像它是一个过程一样运行它

对其余部分的评论。如果您没有使用
return
,那么您真的不应该对当前的continuation使用
call,而且
对每个
执行的操作与您想象的完全不同
nowhitespace?
在修复问题后,将始终计算为
#f
,因为延续lambda主体中的最后一个表达式是
#f
(返回值)

我猜您正在寻找类似于:

;;需要导入(srfi:1)
(定义(非空白?str)
(每(λ(x)(非(字符空白?x)))
(列表->字符串字符串)
;; 需要导入(srfi:13)
(定义(非空白2?str)
(不是(字符串索引str字符空白?)

我已经更新了OP;然而,我仍然得到了错误。有什么想法吗?你的括号还是太多了。在第一个
#f
之后删除多余的。这似乎有帮助,但列表实际上是空的。这个问题超出了范围,但你知道为什么吗?我去掉了多余的括号,这似乎奏效了。但是,列表返回空(可能是谓词有问题)。你知道是什么导致它这样做吗?@NelsonLiu它的计算结果是
#f
。空是
()
。请参见编辑。请查看。错误消息略有不同,但问题是相同的:表单(例如,
((call/cc…)
)周围有一组额外的括号,这意味着您正在评估表单(在本例中,
(call/cc…
)以生成一个值(在本例中为
#f
),然后尝试将其作为函数调用。即,
((call/cc…)=>(#f)=>错误
。当您查看该问题时,请查看侧边栏上的“链接”问题;有许多与同一问题类似的问题。
(updated-strlist(filter notwhitespace? strlist))