我只是想随机创建一个列表并在更大的函数中使用它。
(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))))
并致电(make-random-list 2)
但我不明白为什么会这样,而另一个则不行。如果方案不允许第一个函数产生随机结果会怎样?
答案 0 :(得分:1)
在您的第一个片段中,您将一次性计算的结果分配给变量。你需要的是定义一个每次调用时都要评估的函数。你的第二个片段确实如此,但有一个较短的表达方式:
(define (make-random-list x)
(if
(= (random x) 0) (list 2 3)
(list 3 2)))
请注意语法的不同之处:函数定义将函数定义与括号中的形式参数名称一起包含在内,而变量名称周围没有括号。
答案 1 :(得分:1)
在Scheme中,函数通过显式使用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)))
为了在Scheme中定义过程,您必须显式或隐式地使用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
参数,只需声明一个没有参数的过程。