Scheme 在过程中定义一个变量

Scheme 在过程中定义一个变量,scheme,lisp,Scheme,Lisp,我可以在过程中定义变量吗?在我看来,我只能在过程中定义另一个过程。我在做SICP练习时提出了这个问题,(rand)不是我想要的,因为它生成两个不同的随机数,而我想要在这两个位置上有一个相同的数 (定义(尝试x) (定义(兰德)(+1(随机(-x1))) (=(兰德)(expmod(兰德)x))) 我在下面加入了expmod的代码 (定义%余数) (定义(正方形a)(*a)) (定义(偶数?a)(=(%a2)0)) (定义(expmod基本功率模块) (续) (=功率0) 1) ((偶数?po

我可以在过程中定义变量吗?在我看来,我只能在过程中定义另一个过程。我在做SICP练习时提出了这个问题,
(rand)
不是我想要的,因为它生成两个不同的随机数,而我想要在这两个位置上有一个相同的数

(定义(尝试x)
(定义(兰德)(+1(随机(-x1)))
(=(兰德)(expmod(兰德)x)))

我在下面加入了
expmod
的代码

(定义%余数)
(定义(正方形a)(*a))
(定义(偶数?a)(=(%a2)0))
(定义(expmod基本功率模块)
(续)
(=功率0)
1)
((偶数?pow)
(((方形(expmod base(/pow 2)mod))mod)
(其他
((*base(expmod base(-pow 1)mod))mod)
(定义(尝试x)
(定义兰德(+1(随机(-x1)))
(=(兰德)(expmod(兰德)x)))
(定义(尝试x)
(let((兰特(+1(随机(-x1‘);)))
(=(兰德)(expmod(兰德)x)))

这两种方法都有效。

是的,当然可以。特别是

(define (x ...) ...)
这只是

(define x (lambda (...) ...))
所以您已经定义了一个变量:
rand
,它的值是一个函数

您可能想要的是:

(define (try x)
  (define rand (+ 1 (random (- x 1)))
  (= rand (expmod rand x x)))
这反过来又与

(define (try x)
  (let ([rand (+ 1 (random (- x 1)))])
    (= rand (expmod rand x x))))
是的,你可以

(define (try x)
  (define rand (+ 1 (random (- x 1))))
  (= rand (expmod rand x x)))
您还必须知道
=
try
也是变量,它们对过程进行评估。通常创建的过程如下所示:

(define double (lambda (n) (+ n n)))
然而,编写itL的方法很短

(define (double n) (+ n n))
现在看看你的代码。您不是在用简短的语法为lambda创建一个变量
rand

(define (rand) (+ 1 (random (- x 1))))
评估
rand
应该会给你一些过程输出,比如
#
,调用
(rand)
将执行
(+1(random(-x 1)
)。这类过程称为thunks,通常用于延迟评估

在Scheme中不能做的一件事是从过程中定义顶级变量

(define (make-test v)
  (define test v))
(make-test 5)
(displayln test) ; unbound variable
原因是在一个过程中,它总是生成一个仅存在于该闭包内的本地绑定。可以定义一个顶级变量,然后设置它:

(define test 0) ; make a top level variable
(define (update-test v)
  ;; since no other that top level is named test, 
  ;; that is the binding this is updating. 
  (set! test v)) 
(update-test 5)
(display test) : prints 5

您是否尝试过
(定义rand…
?@molbdnilo我确信上次尝试时它不起作用,但现在它起作用了。也许我在尝试
let
时修复了一些括号问题。谢谢。
rand
是函数还是变量?如何使用它?您尝试过代码吗?