方案:剩余功能 - 合同违规

时间:2015-12-14 01:23:35

标签: scheme modulo

我正在创建一个实际执行以下操作的功能:

(mateval '(ADD 3 (MUL 2 5))
13
(mateval '(MOD 10 (MUL (DIV 8 4) (SUB 5 3))))
2

或基本上使用ADD而不是+等来计算数学。问题是当我调用我的主函数并且它使用MOD(余数)一个

(mod
 (lambda (exp)
  (cond((null? exp) null)
       ((null? (cdr exp)) null)
       (else(remainder (init (car exp))(init (cdr exp)))))))

它显示以下问题:

  

余额:合同违规

     

预期:整数?

     

给出:'(MUL(DIV 8 4)(SUB 5 3))

     

参数位置:第二个

     

其他论点。:

Init是在需要时调用其他函数的函数:

(init
 (lambda (exp)
  (cond((not(pair? exp)) exp)
       ((null? exp) null)
       ((null? (cdr exp))(car exp))
       ((eqv? 'ADD (car exp))(add (cdr exp)))
       ((eqv? 'SUB (car exp))(sub (cdr exp)))
       ((eqv? 'MUL (car exp))(mul (cdr exp)))
       ((eqv? 'DIV (car exp))(div (cdr exp)))
       ((eqv? 'MOD (car exp))(mod (cdr exp)))
       (else null))))

其他函数具有类似的代码,所以似乎只有其余的(尝试模数)函数才能创建麻烦。多次尝试,不是语法错误,我甚至在第一个参数中使用相同的内容,它只在第二个崩溃而不知道发生了什么,似乎只是想让第二个参数崩溃。而不是在“init”中使用(cdr exp)它只是抛出(cdr exp)并崩溃。 有任何想法吗?谢谢你的阅读。

1 个答案:

答案 0 :(得分:1)

在最后一行,您需要访问表达式的cadr,而不是cdr - 请尝试以下操作:

(mod
 (lambda (exp)
   (cond ((null? exp) null)
         ((null? (cdr exp)) null)
         (else (remainder (init (car  exp))
                          (init (cadr exp)))))))