我正试图拿两对'(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))
我试图让它成为通用的,因为任何数字都必须能够使用代码。对不起,感到困惑。
答案 0 :(得分:0)
示例程序:
(lambda (a b)
(+ a b))
此处a
和b
是两个参数。它们的名称在形式参数列表中声明,它们由正文中的名称使用。 a
和b
可能是数字只能通过它们在过程体中的使用方式来看待,但形式参数列表本身并没有说明类型。它们可以是成对的,+
可能是词法绑定的过程,它做的事情与添加数字完全不同。
在您的程序中,您定义了一个绑定变量pr
。这似乎是代码中的一对,因为您同时应用了car
和cdr
。如果您需要添加另一对,则必须将其添加到正式参数列表中,并使用您选择的名称(例如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))))))