首页 > 解决方案 > 方案程序

问题描述

我正在尝试创建一个 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))))

谢谢!

标签: scheme

解决方案


看起来不错,但我注意到您正试图m在 binding 的表达式中使用b。在那个表达式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 ...))

推荐阅读