在do循环中填充列表,将列表返回为空

时间:2018-10-24 06:10:06

标签: scheme lisp 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为空吗?

更新
我已经按照以下结果测试了以下说明:

> (my-procedure '((a . 1)(b . 2)(c . 3)))
'a

> (set! lst (my-procedure '((a . 1)(b . 2)(c . 3))))
> (display lst)
'a

执行循环时,我仍然不知道为什么lst为空。

4 个答案:

答案 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)))