将对输入到Scheme的等式中

时间:2015-04-27 00:27:19

标签: scheme

我正试图拿两对'(a.b)'(c.d)并将它们输入一个等式中。

(define dist
    (lambda (pr)
(sqrt (+ (expt (- (car pr) (car pr) 2)(expt (- (cdr pr) (cdr pr) 2)))

我尝试了这个以及其他一些方法,但我只是得到错误。

我的实际方程似乎适用于数字,但我不确定我应该如何输入两对,或者我甚至应该使用类似于我的方程。  我担心我在想这一切都是错的,我的书中没有提到如何处理两对,我的老师也不会回答。我很困惑,任何提示或解释都会很棒。

编辑: 我应该提到,为了测试我的代码,我用数字代替对中的字母,例如:

 (dist '(2 . 5) '(3 . 1)) 

我试图让它成为通用的,因为任何数字都必须能够使用代码。对不起,感到困惑。

2 个答案:

答案 0 :(得分:0)

示例程序:

(lambda (a b)
  (+ a b))

此处ab是两个参数。它们的名称在形式参数列表中声明,它们由正文中的名称使用。 ab可能是数字只能通过它们在过程体中的使用方式来看待,但形式参数列表本身并没有说明类型。它们可以是成对的,+可能是词法绑定的过程,它做的事情与添加数字完全不同。

在您的程序中,您定义了一个绑定变量pr。这似乎是代码中的一对,因为您同时应用了carcdr。如果您需要添加另一对,则必须将其添加到正式参数列表中,并使用您选择的名称(例如pr),并在过程体中使用该名称。

您可以详细了解lambda expressions in the R6RS standard的格式。

答案 1 :(得分:0)

你已经展示了一个接受两个参数的函数dist

(dist '(2 . 5) '(3 . 1))

其中第一个参数是'(2 . 5),第二个参数是'(3 . 1)。但是,您定义了一个函数dist,它接受​​一个您命名为pr的参数。这是行不通的 - 一个参数定义,但两个参数应用。

怎么样:

(define dist 
  (lambda (arg1 arg2)
    (let ((x1 (car arg1))
          (y1 (cdr arg1))

          (x2 (car arg2))
          (y2 (cdr arg2)))

      (sqrt (+ (expt (- x2 x1) 2)
               (expt (- y2 y1) 2))))))