我只是想随意让一个列表,并在更大的功能使用。
(define make-random-list
(if
(= (random 2) 0) (list 2 3)
(list 3 2)))
这仅产生列表(2 3),我不知道为什么。 发生了什么事导致此?
我可以使功能工作,如果我把它写这样的
(define make-random-list
(lambda (x)
(if
(= (random x) 0) (list 2 3)
(list 3 2))))
并调用(使随机列表2)
但我不明白为什么会工作,另一个不会。 这是怎么回事用方案,将不允许第一函数来产生随机的结果?
在你的第一个片段,就分配一次计算到变量的结果。 你所需要的就是定义将在每次它被调用时进行评估的功能。 你的第二个片段正是这么做的,但表达同样一个较短的方式:
(define (make-random-list x)
(if
(= (random x) 0) (list 2 3)
(list 3 2)))
注意语法的区别:一个函数的定义,在括号中的正式参数名一起包住函数定义,同时有周围变量名没有括号。
在流程,功能是通过明确使用规定的lambda
是这样的:
(define square
(lambda (x)
(* x x)))
还是这个样子,这是简写形式,以前的语法和隐式使用lambda
引擎盖下-过程定义的风格都完全等价的:
(define (square x)
(* x x))
你的代码的第一个版本是行不通的,因为这仅仅是指定的评估结果if
给一个变量叫做make-random-list
:
(define make-random-list
(if (= (random 2) 0)
(list 2 3)
(list 3 2)))
对于计划确定的程序,你必须使用一个lambda
,或隐或显。 所以,你的程序应该使用任何的这个等价形式来定义:
(define make-random-list
(lambda ()
(if (= (random 2) 0)
(list 2 3)
(list 3 2)))
(define (make-random-list)
(if (= (random 2) 0)
(list 2 3)
(list 3 2)))
请注意,您不必通过x
参数,如果唯一可能的值是2
,简单地声明一个过程,不带参数。