在球拍中定义变量时出现问题
Problem while defining variables in racket
我正在尝试创建一个递归函数,该函数从列表中选取 n 个项目,返回选取的值和没有值的列表,但是当我创建变量时,出现此错误:
new-list: unbound identifier in: new-list
这是我的代码:
(define(pick-randomr list n picked) ;;Picked always called as empty list
(if(= n 0) (values list picked)
((let* ([aux list]
[r (random (length aux))]
[value (list-ref aux r)]
[new-picked (cons value picked)]
[new-list (values (remove value aux))])
(values aux r new-list))
(pick-randomr new-list (- n 1) new-picked))))
编辑:
行:
(values aux r new-list)
就是为了不空身
您的语法有几个问题:
- 您不应使用
list
作为参数名称,它与同名的内置过程冲突。
- 不要用 两个 括号将
let*
括起来,这是一个常见的错误,括号 不像 中的大括号其他语言,您不能使用它们来定义语句块,为此使用 begin
- 但在这种特殊情况下我们不需要它。
- 您得到的第一个错误声明您必须而不是定义一个
let*
具有空主体。但是你添加的表达式不对,你必须写出使用let*
里面的变量的表达式,否则new-list
变量不会可见。
这就是您要写的内容:
(define (pick-randomr lst n picked)
(if (= n 0)
(values lst picked)
(let* ([aux lst]
[r (random (length aux))]
[value (list-ref aux r)]
[new-picked (cons value picked)]
[new-list (values (remove value aux))])
(pick-randomr new-list (- n 1) new-picked))))
我们来测试一下:
(pick-randomr '(1 2 3 4 5) 2 '())
=> '(1 2 5)
'(3 4)
我正在尝试创建一个递归函数,该函数从列表中选取 n 个项目,返回选取的值和没有值的列表,但是当我创建变量时,出现此错误:
new-list: unbound identifier in: new-list
这是我的代码:
(define(pick-randomr list n picked) ;;Picked always called as empty list
(if(= n 0) (values list picked)
((let* ([aux list]
[r (random (length aux))]
[value (list-ref aux r)]
[new-picked (cons value picked)]
[new-list (values (remove value aux))])
(values aux r new-list))
(pick-randomr new-list (- n 1) new-picked))))
编辑: 行:
(values aux r new-list)
就是为了不空身
您的语法有几个问题:
- 您不应使用
list
作为参数名称,它与同名的内置过程冲突。 - 不要用 两个 括号将
let*
括起来,这是一个常见的错误,括号 不像 中的大括号其他语言,您不能使用它们来定义语句块,为此使用begin
- 但在这种特殊情况下我们不需要它。 - 您得到的第一个错误声明您必须而不是定义一个
let*
具有空主体。但是你添加的表达式不对,你必须写出使用let*
里面的变量的表达式,否则new-list
变量不会可见。
这就是您要写的内容:
(define (pick-randomr lst n picked)
(if (= n 0)
(values lst picked)
(let* ([aux lst]
[r (random (length aux))]
[value (list-ref aux r)]
[new-picked (cons value picked)]
[new-list (values (remove value aux))])
(pick-randomr new-list (- n 1) new-picked))))
我们来测试一下:
(pick-randomr '(1 2 3 4 5) 2 '())
=> '(1 2 5)
'(3 4)