我的函数检查简单值,并且应该根据结果输出/返回。我有两个问题:
1.当我用表达式(randint (-5 10))
替换runner的let值(-1),其中randint
是另一个返回-5到10之间的随机数的过程时,它不起作用
以下是代码:
(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)"))))
答案 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)
您的代码中存在多个错误。
check
周围的问题。您目前将check作为变量定义,而不是作为过程。'runner
,否则返回false。 randint
时收到的错误,我们无法知道错误。 以下是您的程序的工作版本:
(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)))))