让错误AND返回/打印方案程序的“字符串”

时间:2014-10-02 23:29:32

标签: scheme lisp racket

我的函数检查简单值,并且应该根据结果输出/返回。我有两个问题: 1.当我用表达式(randint (-5 10))替换runner的let值(-1),其中randint是另一个返回-5到10之间的随机数的过程时,它不起作用

  1. 我想返回/打印前两个if语句的字符串,如果它们是真的,不知道如何在方案中这样做。
  2. 以下是代码:

    (define (check)
      (let (runner(randint -5 10)
        (cond ((and (< runner 1) (> runner -3))
               (display "yes"))
              ((and (< runner -2) (> runner -6))
               (display "no"))
              ((> runner 0)
               (display runner))))))
    

    以下是randint的代码:

    (define random
    (let ((a 69069) (c 1) (m (expt 2 32)) (seed 19380110))
     (lambda new-seed
     (if (pair? new-seed)
     (set! seed (car new-seed))
     (set! seed (modulo (+ (* seed a) c) m)))
     (/ seed m))))
    
    (define (randint . args)
     (cond ((= (length args) 1)
     (floor (* (random) (car args))))
     ((= (length args) 2)
     (+ (car args) (floor (* (random) (- (cadr args) (car args))))))
     (else (error 'randint "usage: (randint [lo] hi)"))))
    

3 个答案:

答案 0 :(得分:3)

除了@Rptx指出的语法问题之外,你的代码中还有一个杀手锏:你不能在Racket中拥有单臂if(意思是:他们必须有结果和替代方案)。您可以嵌套它们,或者更好:使用cond,这非常适合测试多个条件。这应该有效:

(define (check)
  (let ((runner (randint -5 10)))
    (cond ((and (< runner 1) (> runner -3))
           "yes")
          ((and (< runner -2) (> runner -6))
           "no")
          ((> runner 0)
           runner))))

像这样使用:

(display (check))

关于randint的问题:现在您已经发布了代码,我可以确认问题与您传递参数的方式有关。如上所示,这是正确的方法:

(randint -5 10)

答案 1 :(得分:2)

在隐含的3个表达式中,每个自己的if都没有替代方案,这真的让我很痛苦。这是一个使用cond的版本(仅因为它的2个术语和另一个选项)另请注意,只有一个<并且变量的每一边都有边界,这已足够了而不是将它分成两部分,逻辑and之间。

(define (check)
  (let ((runner -1))
    (cond ((< -3 runner 1)  "yes")
          ((< -6 runner -2) "no")
          (else "runner"))))

(display (check)) ; ==> void, displays the result of check

答案 2 :(得分:1)

您的代码中存在多个错误。

  1. 你遗失了check周围的问题。您目前将check作为变量定义,而不是作为过程。
  2. 您缺少要打印的程序。
  3. 打印和返回不是一回事。该过程将返回最后一个语句 让回归的身体。在您的情况下,如果(&gt;转轮0)为真,它将返回'runner,否则返回false。
  4. 如果您没有发布使用randint时收到的错误,我们无法知道错误。
  5. 以下是您的程序的工作版本:

    (define (check)
      (let ((runner -1))
        (if (and (< runner 1) (> runner -3)) (display "yes"))
        (if (and (< runner -2) (> runner -6)) (display "no"))
        (if (> runner 0) (car '(runner)))))