首页 > 解决方案 > 在 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当我做循环时,我仍然不知道为什么是空的。

标签: schemelispracket

解决方案


-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永远不会被修改。


推荐阅读