swarm-0.4: data/scenarios/Testing/479-atomic.yaml
# See also 479-atomic-race.
version: 1
name: Atomic grab/harvest/place
description: |
'atomic' blocks should be able to prevent crashes due to race conditions
https://github.com/swarm-game/swarm/issues/479
stepsPerTick: 1
creative: true
objectives:
- condition: |
try {
p <- robotNamed "planter";
as p {n <- count "weed"; return (n == 0)}
} { return false }
solution: |
def forever = \c. force c ; forever c end
def tryharvest =
atomic (
b <- ishere "weed";
if b {harvest; return ()} {}
);
n <- random 4; wait n
end;
forever {tryharvest}
robots:
- name: base
loc: [0,0]
dir: [1,0]
devices:
- logger
- harvester
inventory:
- [1, lambda]
- name: planter
loc: [0,0]
dir: [1,0]
devices:
- logger
- grabber
inventory:
- [25, weed]
program: |
def forever = \c. force c ; forever c end
def tryplant =
atomic (
b <- ishere "weed";
if b {} {place "weed"}
)
end;
forever {tryplant}
entities:
- name: weed
display:
attr: plant
char: 'W'
description:
- A fast-growing weed.
properties: [known, portable, growable]
growth: [1,2]
world:
palette:
'.': [grass]
upperleft: [0,0]
map: |
.