как получить список всех экземпляров конкретной структуры

#racket

Вопрос:

Я пытаюсь понять, как получить список всех экземпляров конкретной структуры, скажем: empInfo-это мое имя структуры, и у него может быть более трех экземпляров. Потому что имена экземпляров являются динамическими. Таким образом, мне нужно указать имя экземпляра, используя цикл for, или значение любого поля всех экземпляров. Структура относится к ее экземпляру, и в этот момент я ее получу.

Наконец, мне нужно ИМЯ всех экземпляров конкретной структуры.

 (struct empInfo(FNAME LNAME IDNO PHONE EMAIL)#:mutable)

(define PersonOne(empInfo "S" "R" 13 " 44" "A@email.com"))
(define PersonTwo(empInfo "H" "I" 31 " 44" "H@email.com"))
(define PersonThree(empInfo "A" "Q" 1 " 44" "S@email.com"))

(define ilist(list (empInfo-FNAME PersonOne) (empInfo-FNAME PersonTwo) (empInfo-FNAME PersonThree)))
 

в окне взаимодействия

 > ilist
'("S" "H" "A")
 

Я просто хотел сделать это с петлей.

Ответ №1:

Как правило, мы бы использовали map для этого:

 (define people (list PersonOne PersonTwo PersonThree))
(map empInfo-FNAME people)
=> '("S" "H" "A")
 

Если вы ищете решение с нуля, просто пройдите по списку и примените empInfo-FNAME его к каждому элементу, создав новый список в качестве вывода:

 (define (first-names lst)
  (if (null? lst)
      '()
      (cons (empInfo-FNAME (car lst))
            (first-names (cdr lst)))))

(first-names people)
=> '("S" "H" "A")
 

Комментарии:

1. Удивительно: как это повторяется, я имею в виду, что это цикл. но как это происходит. S, H и A принадлежат разным экземплярам. могу ли я использовать for-цикл между ними.

2. Вот как вы «повторяете» в схеме, выполняя рекурсию. Забудьте о циклах for 🙂 в схеме все работает по-другому. Я предлагаю хорошую книгу, чтобы привыкнуть к ней, например «Как разрабатывать программы» или «Маленький интриган». Чтобы работать с различными экземплярами структуры, вы должны поместить их в список, вот что я сделал people .