Scheme 解析列表以确定元素的类型
我试图创建一个简单的递归函数,它接受一个列表,并根据列表的元素应用适当的函数。输入时:Scheme 解析列表以确定元素的类型,scheme,racket,r5rs,Scheme,Racket,R5rs,我试图创建一个简单的递归函数,它接受一个列表,并根据列表的元素应用适当的函数。输入时: Input: (myfunct '(plus ( minus(5 4) 3 ) ) Output: 4 所以我检查字符串是什么,然后相应地递归求解表达式 这就是我现在所拥有的(仅用于补充): 这会产生错误(输入时为“(myfunct'(加4 5))”: 我不能准确地指出错误的原因,请给我一个解释/修复好吗 编辑: 使用:(myfunct'(加上4 5)6) 但是,它仍然不能用于…(myfunct'(加4
Input: (myfunct '(plus ( minus(5 4) 3 ) )
Output: 4
所以我检查字符串是什么,然后相应地递归求解表达式
这就是我现在所拥有的(仅用于补充):
这会产生错误(输入时为“(myfunct'(加4 5))”:
我不能准确地指出错误的原因,请给我一个解释/修复好吗
编辑:
使用:(myfunct'(加上4 5)6)
但是,它仍然不能用于…(myfunct'(加4 5)(加2 3))
。第二个参数一直返回为void“()”。我绘制了递归树,我看不出出现该错误的任何原因。有什么想法吗
编辑2:
最后一个有效答案,不是100%确定为什么这个有效,而不是另一个,我最好的猜测是,第二个参数是(在某个点上)((加11))而不是(加11),并且这辆车会返回错误的值
(define (myfunct lis)
(cond ((integer? lis) lis)
;;((integer? (car lis)) (car lis))
((equal? 'plus (car lis))
(+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))
(else (myfunct (car lis)))))
括号有几个问题(有些缺少,有些放错地方,等等)使用IDE的工具捕捉这样的错误。特别是,正文中围绕两行的括号是错误的,因为Racket认为您正在尝试应用一个过程-这就是为什么您会得到一个
应用程序:而不是一个过程错误:
((integer? (car lis)) (car lis))
^ ^
wrong wrong
除此之外,您必须使用(if
,cond
等)来区分不同的情况。如果您没有正确处理每个表达式的部分,请找出如何访问列表的第一、第二和第三个元素
我建议您从熟悉语法开始,在进行此练习之前编写更短、更简单的过程。我将给您一些提示,帮助您开始,并填写以下空白:
(define (myfunct lis)
(cond ((integer? lis)
lis)
((equal? 'plus <first element>)
(+ (myfunct <second element>) (myfunct <third element>)))
(<similarly for the 'minus case>)
正在处理您的代码,我将在一分钟内更新。尝试使嵌套的plus工作(singular plus正在工作)。(cdr(cdr lis))
将是一个列表,如果表达式都是正确的列表。也许(caddr lst)
更适合,然后您就不需要再检查(car x)
是否为整数。
(define (myfunct lis)
(cond ((integer? lis) lis)
;;((integer? (car lis)) (car lis))
((equal? 'plus (car lis))
(+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))
(else (myfunct (car lis)))))
((integer? (car lis)) (car lis))
^ ^
wrong wrong
(define (myfunct lis)
(cond ((integer? lis)
lis)
((equal? 'plus <first element>)
(+ (myfunct <second element>) (myfunct <third element>)))
(<similarly for the 'minus case>)
(myfunct '(plus 4 5))
=> 9
(myfunct '(plus (minus 5 4) 3))
=> 4