字符串作为函数Scheme Racket的参数



我想获得两个字符串作为参数,并检查第一个字符串是否是第二个字符串的开头。我无法得到它,因为我不知道如何获得字符串作为函数的参数。

(define starts-with( lambda (prefix str)
(define str2 (string->list (str)))
(define prefix2 (string->list (prefix)))
( cond ( (= (string-length(prefix2) 0) display "#t")
( (= car(prefix2) car(str2)) (starts-with (cdr(prefix2)cdr(str2) ) ) )
( display "#f")))))
Error:  application: not a procedure; expected a procedure that can be
applied to arguments

给定:"ab"参数…:[无]

有人能解释一下我的错误是什么吗,以及这个方案是如何处理列表或字符串的吗?我想要:

(starts-with "baz" "bazinga!") ;; "#t"

问题不在于如何将字符串作为参数传递,问题在于……首先你必须了解Scheme是如何工作的。括号放错了地方,有些缺失,有些不必要,调用过程的方式也不正确。你的代码中有太多的错误,需要完全重写:

(define (starts-with prefix str)
(let loop ((prefix2 (string->list prefix)) ; convert strings to char lists 
(str2 (string->list str)))      ; but do it only once at start
(cond ((null? prefix2) #t) ; if the prefix is empty, we're done
((null? str2) #f)    ; if the string is empty, then it's #f
((equal? (car prefix2) (car str2)) ; if the chars are equal
(loop (cdr prefix2) (cdr str2)))  ; then keep iterating
(else #f))))                       ; otherwise it's #f

请注意原始实现中的以下错误:

  • 您必须将字符串转换为字符列表,但在开始递归之前只能一次
  • 因为我们将需要一个helper过程,所以最好使用一个名为let的过程——这只是递归过程的语法糖,而不是真正的循环
  • 当字符串短于前缀时,您遗漏了大小写
  • 您不应该display您想要返回的值,只需要返回它们
  • 我们不能使用=来比较字符,正确的方法是使用char=?equal?,后者更通用
  • cond的最后一个条件应该是else
  • 最后但同样重要的是,请记住,在Scheme中,函数的调用方式是这样的:(f x),而不是,调用方式是f(x)。此外,您不能将()放在周围,除非您打算将其作为函数调用,这就是为什么:(str)产生错误application: not a procedure; expected a procedure that can be applied to arguments

相关内容

  • 没有找到相关文章

最新更新