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)
(这仍然是糟糕的代码,但它是合法的。)