首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时使用定义以及何时在球拍中使用let

何时使用定义以及何时在球拍中使用let
EN

Stack Overflow用户
提问于 2018-12-06 00:50:34
回答 1查看 3.3K关注 0票数 4

我正在学习let,我有一个关于何时使用define和何时使用let的问题。

我有这个函数:

代码语言:javascript
复制
(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用于声明局部变量。我看过difference的文档,但它没有提到任何区别。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-06 05:21:34

一个不同之处是:内部定义在相互递归的作用域中,但let绑定不在此范围内。

这意味着比在let

代码语言:javascript
复制
(let ([x expr-1] [y expr-2])
  body)

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

代码语言:javascript
复制
(let ([x (stream-cons 1 y)] [y (stream-cons 2 x)])
  x)
;error=> y: unbound identifier in: y

如果xy是在let外部定义的,那么expr-1和expr-2将引用外部定义,而不是let引入的定义。具体地说:

代码语言:javascript
复制
(define x 'outer)
(let ([x 'inner] [y x]) ; <- this x refers to outer,
  y)                    ;    so y is 'outer
;=> 'outer

但是,内部定义有一个相互递归的作用域,这意味着在

代码语言:javascript
复制
(block
  (define x expr-1)
  (define y expr-2)
  body)

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

代码语言:javascript
复制
(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的作用域

代码语言:javascript
复制
....A....
(define (f)
  (define t1 ..B..)
  (define x ..C..)
  (define t2 ..D..)
  ....E....)
....F....

xf的主体中随处可见,但不在主体之外。这意味着它在BCDE中可见,但在A或F中不可见。

let的作用域

代码语言:javascript
复制
....A....
(define (f)
  (let ([t1 ..B..]
        [x ..C..]
        [t2 ..D..])
    ....E....))
....F....

在这里,xlet的主体中随处可见,但不在主体之外。这意味着它在E中可见,但在A、B、C、D或F中不可见。

let*的作用域

代码语言:javascript
复制
....A....
(define (f)
  (let* ([t1 ..B..]
         [x ..C..]
         [t2 ..D..])
    ....E....))
....F....

在这里,xlet*的主体和之后的let*绑定中随处可见,但不能超出它的范围。这意味着它在DE中可见,但在A、B、C或F中不可见。

letrec的作用域

代码语言:javascript
复制
....A....
(define (f)
  (letrec ([t1 ..B..]
           [x ..C..]
           [t2 ..D..])
    ....E....))
....F....

xletrec主体和letrec绑定中随处可见,但不在其外。这意味着它在BCDE中可见,但在A或F中不可见。

letrec中的变量作用域和本地define变量的作用域非常相似,因为letrecdefine都使用相互递归的作用域。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53637079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档