在Scheme中更改object-property-value

时间:2011-05-10 14:36:55

标签: list object scheme

我一直在处理一个没有任何成功的问题。在我的程序中,我定义了一个列表,让我们称之为“L”,通过移动一个几何对象,一个圆圈,多次。所以L由manu圈组成。对象圆也是一个包含其属性的列表:center(center。#V),(height.H),radius(radius.R)等。因此,属性半径是列表圈的第3个位置中的一对。如果我这样做(对象 - 属性 - 值圆'半径)= R.现在,我想要做的是创建一个新的列表,L-disorder,由与L的相同位置的圆组成,但每个都有不同的(随机)半径。然后,我试试这个:

(define L-disorder (map
                     (lambda(obj) 
                      (set-cdr! (list-ref obj 3) (random:normal))
                     obj)
                     L))

我的问题是它以同样的方式改变了所有圆圈的半径!我希望所有这些都有不同的(随机)值。

我真的非常感谢任何帮助或建议!!

1 个答案:

答案 0 :(得分:2)

如果要创建新列表,则不应使用变异函数(set-cdr!)。 (map )函数为您做了所有的魔术:它遍历源列表,并创建新列表。

 (define L-disorder 
   (map (lambda (circle)
      ; here we creating new circle
      (list (car circle) (cadr circle) (random:normal)))
    L))