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