list - 方案:列表中的对象

标签 list object scheme

我有一个方案中的对象列表,如下所述。例如,从列表中取出第一个元素时,如何调用对象函数?

(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 时,我收到错误消息,指出没有这样的方法。有没有办法将第一个对象“转换”为“人”类型?

谢谢!

最佳答案

请先do学会indent Lisp 正确。

其次,你的问题是你已经决定使用一堆副作用来构建 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/

相关文章:

javascript - 如何基于对象键/值配对创建有序列表?

javascript - 为什么我收到此错误 : Uncaught TypeError: cannot read property 'john' of undefined

recursion - 对象不适用于 MIT 方案(不同的阿克曼函数)

c++ - 作为类成员的结构的 STL 列表

arrays - 如何在flutter中按子列表值对列表进行排序?

c# - 我如何将 Linq var 转换为列表

c++ - 将 Lisp 转换为 C++

c# - 一种简化提供的代码的优雅方式

Javascript 对象作为一种迷你数据库?

dictionary - 通过应用给定的操作将矩阵转换为向量的函数