我正在学习let
,我有一个关于何时使用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
用于声明局部变量。我看过difference的文档,但它没有提到任何区别。
发布于 2018-12-06 05:21:34
一个不同之处是:内部定义在相互递归的作用域中,但let绑定不在此范围内。
这意味着比在let
中
(let ([x expr-1] [y expr-2])
body)
expr-1
和expr-2
不能引用x
或y
。更具体的说,
(let ([x (stream-cons 1 y)] [y (stream-cons 2 x)])
x)
;error=> y: unbound identifier in: y
如果x
或y
是在let
外部定义的,那么expr-1和expr-2将引用外部定义,而不是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-1
和expr-2
可以指x
或y
。具体来说,
(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
的主体中随处可见,但不在主体之外。这意味着它在B
、C
、D
和E
中可见,但在A或F中不可见。
let
的作用域
....A....
(define (f)
(let ([t1 ..B..]
[x ..C..]
[t2 ..D..])
....E....))
....F....
在这里,x
在let
的主体中随处可见,但不在主体之外。这意味着它在E
中可见,但在A、B、C、D或F中不可见。
let*
的作用域
....A....
(define (f)
(let* ([t1 ..B..]
[x ..C..]
[t2 ..D..])
....E....))
....F....
在这里,x
在let*
的主体和之后的let*
绑定中随处可见,但不能超出它的范围。这意味着它在D
和E
中可见,但在A、B、C或F中不可见。
letrec
的作用域
....A....
(define (f)
(letrec ([t1 ..B..]
[x ..C..]
[t2 ..D..])
....E....))
....F....
x
在letrec
主体和letrec
绑定中随处可见,但不在其外。这意味着它在B
、C
、D
和E
中可见,但在A或F中不可见。
letrec
中的变量作用域和本地define
变量的作用域非常相似,因为letrec
和define
都使用相互递归的作用域。
https://stackoverflow.com/questions/53637079
复制相似问题