1

我只是想随机制作一个列表并在更大的函数中使用它。

        (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)

但我不明白为什么这会起作用而另一个不会。不允许第一个函数产生随机结果的方案是怎么回事?

4

2 回答 2

0

在 Scheme 中,函数是通过显式使用lambda如下定义的:

(define square
  (lambda (x)
    (* x x)))

或者像这样,它是前面语法的简写,并且隐含地使用 a 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显式或隐式使用 a 。因此,您的过程应该使用以下任何一种等效形式来定义:

(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,只需声明一个不带参数的过程。

于 2012-11-25T22:50:16.527 回答
0

在您的第一个片段中,您将一次性计算的结果分配给一个变量。您需要在这里定义一个函数,该函数将在每次调用时进行评估。您的第二个片段正是这样做的,但有一种更短的表达方式:

(define (make-random-list x)
(if
  (= (random x) 0) (list 2 3)
                   (list 3 2)))

请注意语法上的差异:函数定义将函数定义与括号中的形式参数名称一起括起来,而变量名称周围没有括号。

于 2012-11-25T22:03:28.233 回答