如何访问双重结构的字段?

时间:2013-12-06 08:47:08

标签: structure common-lisp

我有一个包含学生群体的结构年份。学生是另一种结构

(DEFSTRUCT student
   (fname "nil" :type string)
   (lname "nil" :type string)
   (initGroup 0 :type integer)
   (options nil)
   (marks nil)
   (newGroup nil)
)

马克是一个结构

(DEFSTRUCT mark
   (avgy1 0.0 :type single-float)
   (avgy22 0.0 :type single-float)
   (avgy33 0.0 :type single-float)
   (finalAvg 0.0 :type single-float) 
)

我希望通过我的年度结构访问这个结构的finalAvg字段,因为我想要按照我一年中的所有学生排序。

我尝试了很多组合,但似乎没有任何效果。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

这样的事情:

(setf (year-students *year-2013*)
      (sort (year-students *year-2013*)
            '>
            :key (lambda (student)
                   (loop for mark in (student-marks student)
                         maximize (mark-finalavg mark)))))

样式备注:

  • 避免在自己的行上悬挂括号
  • 避免像finalAvg这样的CamelCase。使用final-avg或类似内容。

答案 1 :(得分:2)

Rainer's answer已经确定了这一点,但我只想添加以下内容:要注意的核心是您可以对其他访问器的结果使用访问器。例如,如果变量jim持有学生,则以下内容将为您提供他的第一个平面标记(假设marksmark结构的列表):

(final-avg (first (marks jim)))

它可能用像Python这样的语言编写:

jim.marks[0].final-avg