gpt4 book ai didi

scheme - 何时使用定义,何时使用让 Racket

转载 作者:行者123 更新时间:2023-12-04 12:06:26 24 4
gpt4 key购买 nike

我正在学习 Racket ,但我对何时使用 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用于声明局部变量。我查看了 Racket 的文档,但没有提到任何区别。

最佳答案

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

这意味着比 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

如果 xylet 之外定义, 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-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....
xf 的正文中随处可见,但不在此之外。这意味着它在 B 中可见, C , D , 和 E ,但不在 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*在它之后的绑定(bind),但不在它之外。这意味着它在 D 中可见和 E ,但不在 A、B、C 或 F 中。
letrec的范围
....A....
(define (f)
(letrec ([t1 ..B..]
[x ..C..]
[t2 ..D..])
....E....))
....F....
xletrec 的主体中随处可见并在 letrec 的绑定(bind)中,但不在此之外。这意味着它在 B 中可见, C , D , 和 E ,但不在 A 或 F 中。
letrec中变量的作用域和本地范围 define变量非常相似,因为两者都是 letrecdefine使用相互递归的作用域。

关于scheme - 何时使用定义,何时使用让 Racket ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53637079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com