Это полная модель. Просто измените print north-color-map
на print north-color
, чтобы попробовать версию foreach
.
to testme
clear-all
ask patches [if random-float 1 < 0.8 [sprout 1]]
print north-color-map
end
to-report north-color
let outlist []
foreach sort-on [who] turtles
[ this-turtle -> ifelse any? turtles-on [patch-at 0 1] of this-turtle
[ set outlist lput [color] of one-of turtles-on [patch-at 0 1] of this-turtle outlist ]
[ set outlist lput "none" outlist ]
]
report outlist
end
to-report north-color-map
report map
[ this-turtle -> ifelse-value any? turtles-on [patch-at 0 1] of this-turtle
[ [color] of one-of turtles-on [patch-at 0 1] of this-turtle ]
[ "none" ]
]
sort-on [who] turtles
end
Версия foreach
, вероятно, легче понять. Он довольно точно соответствует тому, что вы пытались сделать - начните с пустого списка, а затем просмотрите список всех черепах в порядке who
(sort-on [who] turtles
создает этот список) и вычисляет цвет черепахи на севере. патч. Чтобы найти север, нужно набрать patch-at 0 1
, но вы также должны указать север от чего - следовательно, [patch-at 0 1] of this-turtle
. И one-of
- это выбрать одну черепаху из набора всех черепах в этом патче - NetLo go не может сказать, что у него всегда будет одна или ни одна, поэтому вы получите ошибку, по существу, говорящую: 'Я не знаю цвет какой черепахи найти.
Во второй версии используется map
. Он делает то же самое, но применяет функцию ко всем членам списка без явного создания l oop. Код немного проще, потому что вам не нужен пустой список и различные операторы lput
. Вы также должны представить все как репортер, а не как команду. Но map
может быть немного сложнее, чтобы разобраться в этом.