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