我正在学习球拍,但我不知道为什么lst总是空的:
#lang racket
(define sort-asc-by-second
(lambda (lst)
(sort lst
(lambda (x y) (< (cdr x) (cdr y))))))
(define sum
(lambda (lst)
(apply + (map cdr lst))
)
)
(define greater-than
(lambda (lst y)
(cond ((null? lst) (void))
((>= (cdr (car lst)) y) (car lst))
(else (greater-than (cdr lst) y)))))
(define my-procedure
(lambda (lst)
(define sorted (sort-asc-by-second lst))
(define suma (sum lst))
(define probabilidades (map (lambda (p) (cons (car p) (/ (cdr p) suma))) sorted))
(define prob (random))
(car (greater-than lst prob))
)
)
(define lst '())
(do ([x 6000 (- x 1)]
(set! lst (my-procedure '((a . 1)(b . 2)(c . 3)))))
((zero? x) lst))
(display lst)
我想修改do内的第一个列表,但是没有。
你知道为什么lst为空吗?
更新
我已经按照以下结果测试了以下说明:
> (my-procedure '((a . 1)(b . 2)(c . 3)))
'a
> (set! lst (my-procedure '((a . 1)(b . 2)(c . 3))))
> (display lst)
'a
执行循环时,我仍然不知道为什么lst
为空。
答案 0 :(得分:2)
(do (initialisers)
(stop-condition end-expression)
body)
格式为
(do (initialiser body)
(stop-condition end-expression))
但是你写了
(my-procedure '((a . 1)(b . 2)(c . 3)))
不幸的是,set!
的值已在循环内绑定到名称lst
,并且#pragma STDC FENV_ACCESS ON
从未被修改。
答案 1 :(得分:1)
我猜你是这个意思lst
:
(define lst '())
您将其定义为空列表。您永远不会将它设置为其他任何东西。
也许documentation of set!
有点帮助。在此期间,请查找do
的文档。
您可能遇到的下一个问题是,将某物重复设置为相同的值不会产生可观察到的效果(可能会导致CPU温度升高)。
答案 2 :(得分:1)
您的代码
(do ([x 6000 (- x 1)]
(set! lst (my-procedure '((a . 1)(b . 2)(c . 3)))))
((zero? x) lst))
与
相同(do ( [x 6000 (- x 1) ]
[set! lst (my-procedure '((a . 1)(b . 2)(c . 3)))] )
((zero? x) lst))
您将set!
定义为循环变量之一(另一个为x
)。 lst
是其初始值,(my-procedure '((a . 1)(b . 2)(c . 3)))
是其步长表达式。
因此,set!
递减计数到'a
时,x
的您的本地绑定被重复设置为0
;然后返回相同的lst
(从未更改过)。
尝试一下:
> (do ([x 0 (- x 1)]
(set! 1 (my-procedure '((a . 1)(b . 2)(c . 3)))))
((zero? x) set!))
1
答案 3 :(得分:0)
这就是我的工作方式:
(do ([x 6000 (- x 1)])
((zero? x))
(set! lst (cons (my-procedure '((a . 1)(b . 2)(c . 3))) lst)))