字符串作为函数 Scheme Racket 的参数
Strings as argument to function 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"
参数...:[none]
任何人都可以解释我的错误是什么,以及一般情况下 scheme 如何处理列表或字符串..?我想要:
(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
请注意原始实施中的以下错误:
- 您必须将字符串转换为字符列表,但在开始递归之前只需 一次。
- 因为我们将需要一个辅助过程,所以使用命名的
let
是个好主意 - 它只是递归过程的语法糖,而不是真正的循环
- 您错过了字符串比前缀短的情况
- 你不应该
display
你想要 return 的值,只是 return 它们
- 一定不要用
=
来比较字符,正确的做法是用char=?
或者equal?
,比较通用
cond
的最后一个条件应该是 else
- 最后但同样重要的是,请记住,在 Scheme 中,函数是这样调用的:
(f x)
而 而不是 是这样的:f(x)
。此外,你不能将 ()
放在 周围,除非你打算将其作为函数调用,这就是为什么:(str)
产生错误 application: not a procedure; expected a procedure that can be applied to arguments
我想获取两个字符串作为参数,并检查第一个字符串是否是第二个字符串的开头。我无法得到它,因为我不知道如何将字符串作为函数的参数。
(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" 参数...:[none]
任何人都可以解释我的错误是什么,以及一般情况下 scheme 如何处理列表或字符串..?我想要:
(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
请注意原始实施中的以下错误:
- 您必须将字符串转换为字符列表,但在开始递归之前只需 一次。
- 因为我们将需要一个辅助过程,所以使用命名的
let
是个好主意 - 它只是递归过程的语法糖,而不是真正的循环 - 您错过了字符串比前缀短的情况
- 你不应该
display
你想要 return 的值,只是 return 它们 - 一定不要用
=
来比较字符,正确的做法是用char=?
或者equal?
,比较通用 cond
的最后一个条件应该是else
- 最后但同样重要的是,请记住,在 Scheme 中,函数是这样调用的:
(f x)
而 而不是 是这样的:f(x)
。此外,你不能将()
放在 周围,除非你打算将其作为函数调用,这就是为什么:(str)
产生错误application: not a procedure; expected a procedure that can be applied to arguments