scheme - 在 do 循环中填充列表返回列表为空
问题描述
我正在学习球拍,但我不知道为什么 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
当我做循环时,我仍然不知道为什么是空的。
解决方案
-do
形式是
(do (initialisers)
(stop-condition end-expression)
body)
但你写了
(do (initialiser body)
(stop-condition end-expression))
不幸的是, 的值(my-procedure '((a . 1)(b . 2)(c . 3)))
已绑定到set!
循环内的名称,并且lst
永远不会被修改。
推荐阅读
- php - Powershell foreach 语法到 PHP
- javascript - 简化 If 语句
- android - org.ksoap2.serialization.SoapPrimitive 不能转换为 org.ksoap2.serialization.SoapObject
- javascript - 为什么我无法访问函数内的属性?
- javascript - Using var in js for cloud firestore
- android - Is there another way to implement data into activity besides an adapter?
- mysql - MySQL上传数据,其中一列以特定日期格式
- c - C套接字打印时缺少值的前两个字符
- r - 在R中将矩阵的所有元素向下移动一个索引
- python - Python C-Api……如何从 C 创建一个“IntEnum”对象