编程点距离公式时出现方案错误 - 尝试应用非过程

Scheme error when programming point-distance formula - attempt to apply non-procedure

我正在尝试使用 Scheme 编写点距公式。我快要搞定了,只是出现错误。

准确的错误是:

Traceback (most recent call last):

File "In [54]", line 5, col 11, in 'application'

File "In [54]", line 5, col 11

RunTimeError: attempt to apply non-procedure '4'

这是我的代码:

; code for the distance procedure

(define (distance p1 p2) (sqrt (+ (* (- (car(p2)) (car(p1))) (- (car(p2)) (car(p1)))) (* (- (car(cdr(p2))) (car(cdr(p1)))) (- (car(cdr(p2))) (car(cdr(p1))))))))

(distance (4 5) (3 2))

供参考,点距公式为:

√((x2 - x1)^2 + (y2 - y1)^2)

通常最好正确格式化 Scheme 代码,而不是将所有内容都放在一行中。

并且命名中间值很有用。如果您的公式包含 x1x2y1y2,请使用这些名称创建 Scheme 变量。这样更容易理解解决方案。

Scheme 有几个嵌套 carcdr 函数的缩写。如果你需要一个cdrcar,你可以使用cadr.

Scheme 允许您在变量名中使用数学符号。如果变量包含 x2x1 的差异,则可以将其命名为 x2-x1。这增强了 Scheme 的波兰表示法的可读性。

(define (distance p1 p2)
  (let ((x1 (car p1))
        (y1 (cadr p1))
        (x2 (car p2))
        (y2 (cadr p2)))
    (let ((x2-x1 (- x2 x1))
          (y2-y1 (- y2 y1)))
      (sqrt (+ (* x2-x1 x2-x1)
               (* y2-y1 y2-y1))))))

如果你想将列表文字传递给函数,你必须引用它们以防止计算。

(distance '(4 5) '(3 2))

或正确使用评价:

(distance (list 4 5) (list 3 2))