#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
.