DrRacket定义开始设置!可能应该工作但不要

时间:2014-06-12 01:44:14

标签: scheme lisp racket

我正在使用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值吗?

有什么问题? 提前谢谢

3 个答案:

答案 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")))

您的代码有什么问题:

  • 这可能是一个复制粘贴错误,但在Scheme中我们使用"字符分隔字符串,而不是代码中的。最后一行缺少结束"
  • 虽然某些解释器接受没有初始值的define,但标准是变量名称后必须存在值
  • set!
  • 末尾缺少右括号
  • 可以将defineset!行合并为一行:(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))