解析列表以确定元素的类型

时间:2014-04-01 03:25:48

标签: scheme racket r5rs

我正在尝试创建一个简单的递归函数,它接受一个列表,并根据列表的元素应用适当的函数。输入时:

Input:  (myfunct '(plus ( minus(5 4) 3 ) )
Output: 4

所以我检查字符串是什么,然后相应地递归求解表达式。

这就是我现在所拥有的(只是为了加号):

(define (myfunct lis)
    ((integer? (car lis)) (car lis))
    ((equal? 'plus (car lis)) (+ myfunct(car (cdr(lis)) myfunct(cdr(cdr lis)))))                                              
 )
 //if its an integer, return it
 //if its plus, call myfunct with the 2 next heads of the list

这会产生错误(输入"(myfunct'(加上4 5))":

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #f
  arguments...:
   plus

我无法查明错误的原因,请问我有解释/解决方法吗?

编辑:

(define (myfunct lis)
  (cond  ((integer? lis) lis)
         ((integer? (car lis)) (car lis))
         ((equal? 'plus (car lis))
          (+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))))

适用于:(myfunct '(plus (plus 4 5) 6) 但是,它仍无法与... (myfunct '(plus (plus 4 5) (plus 2 3)))一起使用。第二个论点不断回归无效"()"。我绘制了递归树,但我无法找到该错误的原因。有什么想法吗?

编辑2: 最后的工作答案,不是百分之百确定为什么这个有效而不是另一个,我最好的猜测是第二个参数是(在某一点上)((加1 1))而不是(加1 1),并且车上的那个会返回错误的值。

(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)))))

1 个答案:

答案 0 :(得分:2)

括号中有几个问题(有些问题丢失,有些错位等)使用IDE的工具来捕捉这样的错误。特别是,围绕身体两条线的括号是错误的,因为Racket认为你正在尝试应用一个程序 - 这就是你得到application: not a procedure错误的原因:

  ((integer? (car lis)) (car lis))
  ^                              ^
wrong                          wrong

除此之外,您必须使用conditionalsifcond等)来区分不同的情况。而且你没有正确处理每个表达式的各个部分,弄清楚如何访问列表的第一,第二和第三个元素。

我建议您首先熟悉语法,在处理此练习之前编写更短,更简单的过程。我会给你一些提示,让你开始,填写空白:

(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