何时使用定义以及何时使用让球拍

时间:2018-12-05 16:50:34

标签: scheme racket

我正在学习球拍,并且对何时使用define和何时使用let有疑问。

我有这个功能:

(define my-function
  (lambda (param1 param2 list1)
    (/
     (count
      (lambda (x)

        (define a (param1 (remove x list1)))

        (define b (drop-right x 1))

        (define c (param2 a x-sin-clase))

        (eq? (last x) (last c)))
      (cdr list1))
     (length (cdr list1))))) 

不知道以上功能的作用。在函数体内使用define是否正确?

我在某处读到define用于声明全局变量,而let用于声明局部变量。我看过球拍的文档,但没有谈论任何区别。

2 个答案:

答案 0 :(得分:2)

一个区别:内部定义在相互递归的范围内,但让绑定不在。

这意味着比let中的情况:

(let ([x expr-1] [y expr-2])
  body)

expr-1expr-2不能引用xy。更具体地说,

(let ([x (stream-cons 1 y)] [y (stream-cons 2 x)])
  x)
;error=> y: unbound identifier in: y

如果在x之外定义了ylet,则expr-1和expr-2将引用 outer 定义,而不是由let介绍的。具体来说:

(define x 'outer)
(let ([x 'inner] [y x]) ; <- this x refers to outer,
  y)                    ;    so y is 'outer
;=> 'outer

但是,内部定义具有相互递归的范围,这意味着在

(block
  (define x expr-1)
  (define y expr-2)
  body)

expr-1expr-2 可以引用xy。具体来说,

(require racket/block)

(block
  (define x (stream-cons 1 y))
  (define y (stream-cons 2 x))
  (stream->list (stream-take x 5)))
;=> (list 1 2 1 2 1)

define

的范围
....A....
(define (f)
  (define t1 ..B..)
  (define x ..C..)
  (define t2 ..D..)
  ....E....)
....F....

x的内容在f正文中的任何位置都可见,但在其外部看不到。这意味着它在BCDE中可见,但在A或F中不可见。

let

的范围
....A....
(define (f)
  (let ([t1 ..B..]
        [x ..C..]
        [t2 ..D..])
    ....E....))
....F....

此处xlet正文中的任何位置都是可见的,但在该位置之外不可见。这意味着它在E中可见,但在A,B,C,D或F中不可见。

let*

的范围
....A....
(define (f)
  (let* ([t1 ..B..]
         [x ..C..]
         [t2 ..D..])
    ....E....))
....F....

此处xlet*主体中的任何地方以及在之后let*绑定中都是可见的,但不在该范围之外。这意味着它在DE中可见,但在A,B,C或F中不可见。

letrec

的范围
....A....
(define (f)
  (letrec ([t1 ..B..]
           [x ..C..]
           [t2 ..D..])
    ....E....))
....F....

xletrec的主体和letrec的绑定中的任何位置都是可见的,但在此之外不可见。这意味着它在BCDE中可见,但在A或F中不可见。

letrec中的变量范围和局部define中的变量范围非常相似,因为letrecdefine都使用相互递归的范围。

答案 1 :(得分:0)

我终于了解了我读到的define的变量是“全局变量”。

R。肯特·迪布维格(R. Kent Dybvig)在《方案编程语言第四版》一书的2.6. Top Level Definitions中说:

  

由let和lambda表达式绑定的变量不可见   这些表达式的主体之外。