私はこれを行うにはさまざまな方法を考えることができます:
to go
let list-1 [1 2 2]
let list-2 [13 7 8]
; the most straightforward, imperative way:
let list-3 []
(foreach list-1 list-2 [
if ?1 = 2 [ set list-3 lput ?2 list-3 ]
])
print list-3
; an uglier imperative version using indices:
let list-4 []
let i 0
while [ i < length list-1 ] [
if item i list-1 = 2 [ set list-4 lput item i list-2 list-4 ]
set i i + 1
]
print list-4
; using reduce, sentence and map:
print reduce sentence (map [
ifelse-value (?1 = 2) [ ?2 ] [ [] ]
] list-1 list-2)
; using map, filter, and indices:
print map [ item ? list-2 ] filter [
item ? list-1 = 2
] n-values length list-1 [ ? ]
; another variant using `filter`:
print map last filter [ first ? = 2 ] (map list list-1 list-2)
end
私はそれが表現だと思うと、最後の一つは、はるかに私のお気に入りであること他のものよりも優れていると思っていますが、それは主観的かもしれません。
は、あなたがレポーターにお好みの方法を隔離することができ、再利用可能なものを作るには:
to-report filtered-by-first-list [ filtering-task list-1 list-2 ]
report map last filter [
(runresult filtering-task first ?)
] (map list list-1 list-2)
end
をそして、あなたはこのようにそれを呼び出すことができます。NetLogo 6構文にこのすべてを変換する
observer> show filtered-by-first-list task [ ? = 2 ] [1 2 2] [13 7 8]
observer: [7 8]
読者には練習として残されています。 :-)