Racket Lisp:new-if和if之间的比较

Jer*_*hao 4 lisp scheme sicp racket

(define (sqrt-iter guess x)
    (if (good-enough? guess x)
        guess
        (sqrt-iter(improve guess x)
                  x)))

(define (improve guess x)
  (average guess(/ x guess)))

(define (average x y)
  (/ (+ x y) 2))

(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.0001))

(define (square x)
  (* x x))

(define (sqrt-g x)
  (sqrt-iter 1.0 x))
Run Code Online (Sandbox Code Playgroud)

这是sqrt的一个程序.问题是当你尝试使用new-if替换if-if时会发生什么.

(define (sqrt-iter guess x)
    (if (good-enough? guess x)
        guess
        (sqrt-iter(improve guess x)
                  x)))
Run Code Online (Sandbox Code Playgroud)

这是新的,如果

 (define (new-if predicate then-clause else-clause)
      (cond (predicate then-clause)
            (else else-clause)))
Run Code Online (Sandbox Code Playgroud)

我的观点是两个程序的结果是一样的.因为new-if和if可以产生相同的结果.

然而,新的 - 如果证明是错误的,因为当我尝试时它是一个死圈.

所以为什么?

Bar*_*mar 9

new-if是一个功能.调用函数之前,将评估函数的所有参数.但是sqrt-iter是一个递归函数,当参数已经足够好时,你需要避免进行递归调用.

内置if语法,仅根据条件的值计算then-branch或else-branch.

您可以使用宏来编写new-if.

  • Racket看起来像Scheme方言,Scheme使用术语"语法". (2认同)