关于球拍剩余预期参数

时间:2017-10-11 02:01:08

标签: lisp racket sicp

最近,我正在学习sicp,但我遇到一个奇怪的问题:

<html>
  <head>
    <meta charset="utf-8" />
    <script data-require="jquery" data-semver="3.1.1" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="add.js"></script>
  </head>

  <body>

    <select id="droplist">
    	<option>Select</option>
		<option value="1">One</option>
		<option value="2">Two</option>
		<option value="3">Three</option>
    </select>


    <form id="boxes">
		<input type='hidden' name='eventname' value='$eventname '>
    </form>

  </body>

</html>

这是我的代码

Error:
remainder: contract violation
  expected: integer?
  given: '(3 4 5 6)
  argument position: 1st
  other arguments...:
   2
  1. os:win10
  2. lang:racket v6.10.1
  3. 告诉余数预期整数参数 我想我给了一个整数到余数而不是列表。那么有人可以告诉我我的代码有什么问题。我陷入了极大的困境。提前谢谢。

1 个答案:

答案 0 :(得分:0)

发生此错误是因为您的过程对未知数量的多个参数进行操作 - 这就是.在声明过程时的含义,而other被解释为args列表。它在调用过程时传递正确的args,但是第一次调用递归时,它会失败。

一种解决方案是确保我们始终对多个参数应用该过程,而不是将 list 作为第二个参数传递,这是您的代码现在正在执行的操作,从而导致错误。试试这个:

(define (same-parity sample . other)
  (if (null? other)
      (cons sample '())
      (if (= (remainder sample 2) (remainder (car other) 2))
          (cons (car other) (apply same-parity sample (cdr other)))
          (apply same-parity sample (cdr other)))))