我正在使用DrRacket学习lisp中的编程考试。
在讲座的演示中,我发现了这段代码:
(define (f a b c)
(define delta)
(begin
(set! delta (- (* b b) (* 4 a c))
(if (>=? delta 0)
(writeln ”są pierwiastki”)
(writeln ”nie ma pierwiastków)))))
但它不起作用。 DrRacket正在展示:
. define: bad syntax (missing expression after identifier) in: (define delta)
我以后不能设置delta
值吗?
有什么问题? 提前谢谢
答案 0 :(得分:3)
原始错误消息是因为
(define delta)
缺少值。相反它应该是这样的:
(define delta 0)
还有其他一些问题:
双引号不是"
字符,无法识别
by Racket。
有些人错了。
此外,我不知道为什么define
- 正在delta
,然后立即
set!
- 它。
我试图修复/简化你发布的内容,然后想出了 以下。但我不确定该功能应该是什么 do,所以我不知道示例输出是否正确。
#lang racket
(define (f a b c)
(define delta (- (* b b) (* 4 a c)))
(if (>= delta 0)
(displayln "są pierwiastki")
(displayln "nie ma pierwiastków")))
;; Example output:
(f 1 2 3)
;;-> nie ma pierwiastków
(f 1 200 3)
;;-> są pierwiastki
答案 1 :(得分:2)
试试这个:
#lang racket
(define (f a b c)
(define delta 0)
(set! delta (- (* b b) (* 4 a c)))
(if (>= delta 0)
(displayln "są pierwiastki")
(displayln "nie ma pierwiastków")))
您的代码有什么问题:
"
字符分隔字符串,而不是代码中的”
。最后一行缺少结束"
。define
,但标准是变量名称后必须存在值set!
行define
和set!
行合并为一行:(define delta (- (* b b) (* 4 a c)))
>=?
运算符在Scheme中不是标准运算符,它可能适用于您的解释器,但如果可能,请使用标准>=
writeln
程序在Scheme中不是标准,在Racket中您可以将其替换为displayln
begin
,它是隐式的总结:问题中的代码似乎是针对不同的解释器,这个问题被标记为racket
但是相信我,你所拥有的是无效的Racket代码 - 哎呀,甚至不是标准的Scheme。确保使用正确的解释器,并对文本中的拼写错误保持警惕。
答案 2 :(得分:1)
我认为Greg已经a perfect answer解决了您的问题,但我只是想添加他的代码的明显let
版本:
;; for a given ax^2+bx+c=0
;; this displays if it has at least one
;; real number answer or not
(define (equation-has-answer a b c)
(let ((delta (- (* b b) (* 4 a c))))
(if (>= delta 0)
(displayln "Has answer(s)")
(displayln "Has no answers"))))
要创建谓词,您可以执行此操作:
;; for a given ax^2+bx+c=0
;; this returns #t if it has at least one
;; real number answer and #f otherwise
(define (equation-has-answer? a b c)
(>= (- (* b b) (* 4 a c)) 0))