我正在尝试根据我自己编写的谓词过滤掉一个列表,但是当我运行过滤器时,我得到了
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))
任何想法?谢谢!
答案 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-continuation
而for-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?)))