我试图根据我自己写的谓词筛选出一个列表,但是当我运行筛选时,我得到
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?)))