Geometry Scheme程序,返回给定两对线的斜率,这两对线表示坐标平面上的两个点

Geometry Scheme程序,返回给定两对线的斜率,这两对线表示坐标平面上的两个点,geometry,scheme,coordinates,line,racket,Geometry,Scheme,Coordinates,Line,Racket,我试图创建一个Scheme函数,返回两点之间直线的斜率,给定两对表示笛卡尔坐标平面上的两点 我创建了这段代码,但不断出现错误: (define (slope-of-line p1 p2) (let ((m (/ (- (cdr p2) (cdr p1)) (- (car p2) (car p1)))) (b (- (cdr p1) (* m (car p1))))) (lambda (x) (+ (* m

我试图创建一个Scheme函数,返回两点之间直线的斜率,给定两对表示笛卡尔坐标平面上的两点

我创建了这段代码,但不断出现错误:

(define (slope-of-line p1 p2)
  (let ((m (/ (- (cdr p2) (cdr p1))
               (- (car p2) (car p1))))
         (b (- (cdr p1)
               (* m (car p1)))))
    (lambda (x) (+ (* m x) b))))

感谢您的帮助。提前谢谢你

看起来还可以,但我注意到您试图在绑定
b
的表达式中使用
m
。在该表达式出现时,
m
不存在。如果您想知道为什么可以将let转换为匿名函数调用,那么它的语法是:

((lambda (m b)
   (lambda (x) (+ (* m x) b)))
 (/ (- (cdr p2) (cdr p1)) (- (car p2) (car p1)))
 (- (cdr p1) (* m (car p1))))
在这里,您可以清楚地看到
m
是在定义它的lambda之外使用的。 可以通过将
let
替换为
let*
来修复代码

(define (slope-of-line p1 p2)
  (let* ((m (/ (- (cdr p2) (cdr p1))
               (- (car p2) (car p1))))
         (b (- (cdr p1)
               (* m (car p1)))))
    (lambda (x) (+ (* m x) b))))

(define slope (slope-of-line '(1 . 3) '(6 . 4)))
(slope 20) ; ==> 34/5 (which is close to ~6,8)
之所以这样做是因为
let*
只是嵌套
let
的语法糖:

(let* ((a a-expression)
       (b b-expression))
  body ...)
同:

(let ((a a-expression))
  (let ((b b-expression))
    body ...))

不要使用大量的
car
s和
cdr
s,而是使用
let
,用简短的可管理名称定义新变量,命名点的组件。这样就很容易完成您的任务:

(define (slope-of-line p1 p2)
  ;; to-be-called-as:  
  ;;      (slope-of-line '(1 . 3) '(6 . 4))
  (let
     ((x1 (car p1))   (y1 (cdr p1))
      .... )
     ;; slope is (y2-y1)/(x2-x1)
     ;;   or do you want the arctan of that
     (atan  .... )))

谢谢你的帮助!我运行了代码,它运行得很好,但是当我添加这段代码时,我得到了一些错误<代码>(直线(1.3)的斜率)(6.4))。我输入错误了吗?@Annabelle你说的“这件”是什么意思?你是说你添加了一个
*
,但仍然有错误?除了第二个块,我的答案中的每个块都包含您的原始错误或伪代码,它们将以未定义的标识符结尾。我有以下代码:
(定义(线p1p2的斜率)(let((m(/(((cdr p2)(cdr p1))((car p2)(car p1()())))(let((b(-(cdr p1(()())))))(lambda(x)(+((((((((
然后为了测试它是否有效,我在最后添加了这个以获得最终输出;然而,当我这样做的时候,我犯了错误
(直线斜率(1.3)-(6.4))
我做错了什么?@Annabelle因此没有用
let*
替换
let
,而是嵌套了
let
。好啊两者都很好。你会犯什么样的错误?如果然后尝试将其称为
(行的斜率'(1.3)'(6.4))
,它将返回一个过程。因此,如果您将其分配给一个名称,例如
(定义斜率(直线的斜率)(1.3)'(6.4))
,那么您可以使用x值调用它以获得y
(斜率20);=>34/5
。我觉得很好,西尔维斯特,等等。我的代码中不需要斜率截距表单,因为我只寻找两点之间直线的斜率。因此,在示例
(直线的斜率'(1.3)'(6.4))
,斜率应该是1/5(斜率=(4-3)/(6-1))。那么,我如何修改我的代码,使其只计算两点之间的斜率呢?是的,这很有意义,而且它确实使代码更易于管理。非常感谢你的意志@安娜贝利:你真是太棒了