我有一个方案中的对象列表,如下所述。例如,从列表中取出第一个元素时,如何调用对象函数?
(define persons false)
(define length 10)
(let loop ((n 0))
(if (< n length)
(begin
(define newp (make-person))
(send newp setage (- 50 n))
(cond
((= n 0)
(set! persons (list newp)))
(else
(set! persons (cons persons newp)))
)
(loop (+ n 1))
)
)
)
(define (firstpersonage)
(send (car persons) getage)
)
当调用 firstpersonage 时,我收到错误消息,指出没有这样的方法。有没有办法将第一个对象“转换”为“人”类型?
谢谢!
最佳答案
其次,你的问题是你已经决定使用一堆副作用来构建 Scheme 中的人员列表(结果,你绊倒了其中一个更好的点 列表构造)。
在这种情况下我会做的是写
(define persons
(map (lambda (n)
(let ((newp (make-person)))
(send newp setage (- 50 n))
newp))
(iota 10)))
(define (firstpersonage)
(send (car persons) getage))
也就是说,将person
定义为从50岁到41岁的十个人的列表。这样做可以避免许多错误的可能性,包括你刚刚被咬的那个。
如果您绝对不能忍受与您的 set!
分开,则错误似乎在行中
(set! persons (cons persons newp))
cons
不会附加两个列表,它会向列表的头部添加一个新元素。例如
(cons 3 (list 2 1)) => (3 2 1)
如果你以相反的方式进行,你不会完全得到你要找的东西
(cons (list 1 2) 3) => ((1 2) . 3)
关于list - 方案:列表中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8653161/