【发布时间】:2018-10-24 20:56:17
【问题描述】:
我正在学习 Racket 不知道为什么 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 列表,但没有。
你知道为什么 lst 是空的吗?
更新
我已经测试了以下指令,结果如下:
> (my-procedure '((a . 1)(b . 2)(c . 3)))
'a
> (set! lst (my-procedure '((a . 1)(b . 2)(c . 3))))
> (display lst)
'a
我仍然不知道为什么我在循环时lst 是空的。
【问题讨论】:
-
您没有收到一些错误消息吗?
-
没有。我没有任何错误。
-
当您尝试在 REPL 提示符处评估它时,
(set! (my-procedure '((a . 1)(b . 2)(c . 3))) lst)是否按预期工作?当您在 REPL 提示符下尝试时,(my-procedure '((a . 1)(b . 2)(c . 3)))返回了什么? -
@WillNess REPL 提示?
-
@VansFannel 我已经添加了答案。