Scheme 集的用法不同!定义
在以下代码中:Scheme 集的用法不同!定义,scheme,lisp,racket,Scheme,Lisp,Racket,在以下代码中: (define x 14) (display x) ; x = 14 (set! x 13) (display x) ; x = 13 (define x 14) (display x) ; x = 14 (set! y 13) ; SchemeError: y not found! (display y) 我们所说的是一个有人想使用set的用例即可可用于+实际定义本身?define在名称和值(变量)之间创建
(define x 14)
(display x) ; x = 14
(set! x 13)
(display x) ; x = 13
(define x 14)
(display x) ; x = 14
(set! y 13) ; SchemeError: y not found!
(display y)
我们所说的是一个有人想使用
set的用例只要定义
,如果定义
可用于设置的所有内容,则代码>即可
可用于+实际定义本身?define
在名称和值(变量)之间创建一个新的绑定,set代码>变异现有绑定。这些操作不同,像Python这样的语言会混淆操作
特别是像
(define x 1)
...
(define x 2)
非法:只能创建一次变量。实现可能不会对此进行检查,但这并不意味着它是合法的。创建绑定后,如果要修改它,需要使用set代码>
实现(包括Racket)故意对此马虎的一种特殊情况是交互使用它们时。通常,如果您与系统交互,您可能会想说,例如:
> (define square (λ (x) (+ x x)))
... ooops, that's not right, is it?
... Better fix it using the command-line editing
> (define square (λ (x) (* x x)))
在这样的情况下,允许对事物进行重复定义显然对实现更好,因为这将使用户的生活变得非常简单
但是在程序中,相同范围内的重复定义(几乎?)总是错误,它们确实应该被捕获:如果你想改变绑定,请使用set代码>。尤其是球拍肯定会吐在这些东西上
最后请注意,define
在设置的所有地方都是不合法的代码>is:即使在Racket中(允许定义的地方比Scheme多),这也不是一个稍微合法的代码:
(define (foo x)
(define v x)
(if (odd? x)
(define v (* v 2))
(define v (/ v 2)))
v)
虽然这是
(define (foo x)
(define v x)
(if (odd? x)
(set! v (* v 2))
(set! v (/ v 2)))
v)
(这仍然是糟糕的代码,但它是合法的。)define
在名称和值(变量)之间创建一个新的绑定,set代码>变异现有绑定。这些操作不同,像Python这样的语言会混淆操作
特别是像
(define x 1)
...
(define x 2)
非法:只能创建一次变量。实现可能不会对此进行检查,但这并不意味着它是合法的。创建绑定后,如果要修改它,需要使用set代码>
实现(包括Racket)故意对此马虎的一种特殊情况是交互使用它们时。通常,如果您与系统交互,您可能会想说,例如:
> (define square (λ (x) (+ x x)))
... ooops, that's not right, is it?
... Better fix it using the command-line editing
> (define square (λ (x) (* x x)))
在这样的情况下,允许对事物进行重复定义显然对实现更好,因为这将使用户的生活变得非常简单
但是在程序中,相同范围内的重复定义(几乎?)总是错误,它们确实应该被捕获:如果你想改变绑定,请使用set代码>。尤其是球拍肯定会吐在这些东西上
最后请注意,define
在设置的所有地方都是不合法的代码>is:即使在Racket中(允许定义的地方比Scheme多),这也不是一个稍微合法的代码:
(define (foo x)
(define v x)
(if (odd? x)
(define v (* v 2))
(define v (/ v 2)))
v)
虽然这是
(define (foo x)
(define v x)
(if (odd? x)
(set! v (* v 2))
(set! v (/ v 2)))
v)
(这仍然是糟糕的代码,但它是合法的。)