这个问题可能很容易,但是我花了一些时间,却无法弄清问题所在。我是Scheme的新手;)好的,这是我的代码:
(define foo
(lambda (x)
((if(equal? (car x) 4) "A" "B")
(if(equal? (car (cdr x)) 3) "A" "B")
(if(equal? (car(cdr (cdr x))) 5) "A" "B")
)
))
(foo '(4 3 5))
运行代码时出现以下错误:
> application: not a procedure; expected a procedure that can be
> applied to arguments given: "A" arguments...: "A" "A"
要解决该错误,只需执行以下操作:
(define foo
(lambda (x)
(if (equal? (car x) 4) "A" "B")
(if (equal? (car (cdr x)) 3) "A" "B")
(if (equal? (car (cdr (cdr x))) 5) "A" "B")))
问题?在您的代码中()
,if
表达式周围有一对错误的附加信息,因此Scheme认为if
返回的是函数(不是)。请记住,在Scheme中,这:的(f)
意思是:f
作为不带参数的函数执行。
现在我们发现了语法错误,让我们看看代码还有什么问题。对于初学者,如果在过程内编写一系列表达式,则仅返回最后一个的值,因此前两个if
将被完全忽略!阅读我的理解是要返回的意见后"AAA"
为输入'(4 3 5)
或"ABA"
输入'(4 6 5)
。这里的窍门是我们必须使用string-append
所有字符串将它们粘在一起:
(define foo
(lambda (x)
(string-append
(if (equal? (car x) 4) "A" "B")
(if (equal? (cadr x) 3) "A" "B")
(if (equal? (caddr x) 5) "A" "B"))))
现在,它可以按预期工作:
(foo '(4 3 5))
=> "AAA"
(foo '(4 6 5))
=> "ABA"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句