sách gpt4 ai đã đi

scheme - 定义、让和设置之间的区别!

In lại 作者:行者123 更新时间:2023-12-03 07:18:48 33 4
mua khóa gpt4 Nike

好吧,这是一个相当基本的问题:我正在关注 SICP 视频,我对 define,cho phép 之间的区别有点困惑设置!.

1) 根据 Sussman 在视频中的说法,define 只允许为变量附加一个值一次(除了在 REPL 中),特别是不允许在一行中使用两个定义。然而 Guile 很高兴地运行了这段代码

(define a 1)
(define a 2)
(write a)

并输出 2,如预期。事情有点复杂,因为如果我尝试这样做(编辑:在上述定义之后)

(define a (1+ a))

我收到错误,而

(set! a (1+ a))

是允许的。不过,我不认为这是 set!define 之间的唯一区别:我缺少什么?

2)definecho phép 之间的区别让我更加困惑。我知道理论上 cho phép 用于绑定(bind)局部范围内的变量。不过,在我看来,这与 define 的工作原理相同,例如我可以替换

(define (f x)
(let ((a 1))
(+ a x)))

(define (g x)
(define a 1)
(+ a x))

f cũng như g 的工作方式相同:特别是变量 Một 也在 g 之外未绑定(bind).

我认为这个有用的唯一方法是 cho phép 的作用域可能比整个函数定义更短。但在我看来,人们总是可以添加一个匿名函数来创建必要的作用域,并立即调用它,就像在 javascript 中所做的那样。那么,cho phép 的真正优势是什么?

1 Câu trả lời

您的困惑是合理的:“let”和“define”都创建新的绑定(bind)。 “let”的一个优点是它的含义非常明确。对于普通的“let”的含义,各种Scheme系统(包括Racket)之间绝对没有分歧。

“定义”形式是另一回事。与“let”不同,它不会用括号将主体(绑定(bind)有效的区域)括起来。此外,它在高层和内部可能意味着不同的事情。不同的Scheme系统对“定义”的含义截然不同。事实上,Racket 最近通过添加新的上下文来改变“定义”的含义。

另一方面,人们喜欢“定义”;它的缩进较少,并且通常具有“按我的意思做”级别的范围,允许递归和相互递归过程的自然定义。事实上,前几天我就被这个咬了:)。

最后,“设置!”;比如“让”、“设置!”非常简单:它会改变现有的绑定(bind)。

FWIW,在 DrRacket 中理解这些范围的一种方法(如果您正在使用它)是使用“检查语法”按钮,然后将鼠标悬停在各种标识符上以查看它们的绑定(bind)位置。

关于scheme - 定义、让和设置之间的区别!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5406064/

33 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com