The Erlang binding
The generated Erlang API calls one in-process NIF over the robot core.
Facts are functions of the robot handle, records are maps, controls take a
map of fields, and an absent result is undefined. Numeric and enum
arguments are explicit. The fold's on_start/1 returns its memory and
on_turn/2 returns the next memory. All geometry and tracking live in core.
Install with make install SDK=/opt/clunkyard/sdk. Build a robot with
erlc -pa /opt/clunkyard/sdk/bindings/erlang bot.erl. Run with
erl -noshell -pa /opt/clunkyard/sdk/bindings/erlang -pa . -s bot start.
The NIF is compiled in the builder and loads libclunkyard.so.2.
A tiny robot
-module(bot).
-export([start/0,on_turn/2]).
start()->clunkyard:run(?MODULE),halt().
on_turn(R,State)->
case clunkyard:sensors_nearest(R) of
undefined->
clunkyard:drive_set(R,#{throttle=>0.75,turn=>0.25}),
clunkyard:scanner_set(R,#{heading=>clunkyard:me_heading(R),arc=>40}),
clunkyard:status_set(R,#{text=><<"SEARCH">>,value=>maps:get(arc,clunkyard:scanner_last(R))});
Target->
Power=clunkyard:gun_power_for_flight_time(R,maps:get(range,Target),1),
Aim=clunkyard:gun_lead(R,Target,Power),
case Aim of undefined->clunkyard:gun_aim(R,#{heading=>maps:get(bearing,Target),pitch=>maps:get(elevation,Target)});_->clunkyard:gun_aim(R,#{heading=>maps:get(heading,Aim),pitch=>maps:get(pitch,Aim)})end,
case clunkyard:gun_can_fire(R,Power,10)of true->clunkyard:gun_fire(R,#{power=>Power});false->ok end,
Turn=clunkyard:angles_clamp(clunkyard:angles_angle_diff(maps:get(bearing,Target),clunkyard:me_heading(R)),-1,1),
clunkyard:drive_set(R,#{throttle=>0.5,turn=>Turn}),
clunkyard:scanner_set(R,#{heading=>maps:get(bearing,Target),arc=>10}),
clunkyard:status_set(R,#{text=><<"TRACK">>,value=>maps:get(range,Target)})
end,State.
make test SDK=... checks the actual generated API against every core
vector, including exact floating-point results and act lines. Core errors
raise a language error carrying their status. A core fault during input
sends its empty act and continues with the next state. User exceptions are
logged and send the controls already set. Use the binding’s forfeit helper
to give up a match; play runs protocol lines in memory for tests.
Names
Every entry of the robot API 2.0.0 in Erlang / Elixir. names.md has every language side by side.
| Canonical | Form | Erlang / Elixir |
|---|---|---|
match.mode |
property | clunkyard:match_mode |
match.ruleset |
property | clunkyard:match_ruleset |
match.control |
property | clunkyard:match_control |
match.robots |
property | clunkyard:match_robots |
match.is_3d |
property | clunkyard:match_is_3d |
match.tick_rate |
property | clunkyard:match_tick_rate |
match.max_ticks |
property | clunkyard:match_max_ticks |
match.robot_id |
call | clunkyard:match_robot_id |
clock.tick |
property | clunkyard:clock_tick |
clock.seconds |
property | clunkyard:clock_seconds |
clock.remaining_ticks |
property | clunkyard:clock_remaining_ticks |
arena.size |
property | clunkyard:arena_size |
arena.gravity |
property | clunkyard:arena_gravity |
arena.terrain_kind |
property | clunkyard:arena_terrain_kind |
arena.ground_height |
call | clunkyard:arena_ground_height |
me.health |
property | clunkyard:me_health |
me.position |
property | clunkyard:me_position |
me.velocity |
property | clunkyard:me_velocity |
me.heading |
property | clunkyard:me_heading |
me.pitch |
property | clunkyard:me_pitch |
me.roll |
property | clunkyard:me_roll |
me.angular_velocity |
property | clunkyard:me_angular_velocity |
me.attitude |
property | clunkyard:me_attitude |
me.grounded |
property | clunkyard:me_grounded |
me.altitude |
property | clunkyard:me_altitude |
me.applied |
property | clunkyard:me_applied |
battery.charge |
property | clunkyard:battery_charge |
battery.capacity |
property | clunkyard:battery_capacity |
battery.regen |
property | clunkyard:battery_regen |
battery.sustainable_drive |
property | clunkyard:battery_sustainable_drive |
battery.compute |
property | clunkyard:battery_compute |
battery.drive_cost |
call | clunkyard:battery_drive_cost |
drive.hover_lift |
property | clunkyard:drive_hover_lift |
drive.set |
control | clunkyard:drive_set |
drive.forces |
control | clunkyard:drive_forces |
drive.get |
call | clunkyard:drive_get |
gun.aim_now |
property | clunkyard:gun_aim_now |
gun.cooldown_ticks |
property | clunkyard:gun_cooldown_ticks |
gun.spread |
property | clunkyard:gun_spread |
gun.max_power |
property | clunkyard:gun_max_power |
gun.damage_scale |
property | clunkyard:gun_damage_scale |
gun.can_fire |
call | clunkyard:gun_can_fire |
gun.shot_speed |
call | clunkyard:gun_shot_speed |
gun.shot_cost |
call | clunkyard:gun_shot_cost |
gun.reload_ticks |
call | clunkyard:gun_reload_ticks |
gun.shot_damage |
call | clunkyard:gun_shot_damage |
gun.power_for_speed |
call | clunkyard:gun_power_for_speed |
gun.power_for_flight_time |
call | clunkyard:gun_power_for_flight_time |
gun.lead |
call | clunkyard:gun_lead |
gun.lead_point |
call | clunkyard:gun_lead_point |
gun.aim |
control | clunkyard:gun_aim |
gun.fire |
control | clunkyard:gun_fire |
gun.get |
call | clunkyard:gun_get |
scanner.last |
property | clunkyard:scanner_last |
scanner.proximity_range |
property | clunkyard:scanner_proximity_range |
scanner.reach |
call | clunkyard:scanner_reach |
scanner.arc_for_reach |
call | clunkyard:scanner_arc_for_reach |
scanner.set |
control | clunkyard:scanner_set |
scanner.get |
call | clunkyard:scanner_get |
sensors.contacts |
property | clunkyard:sensors_contacts |
sensors.nearest |
property | clunkyard:sensors_nearest |
sensors.cues |
property | clunkyard:sensors_cues |
sensors.contact |
call | clunkyard:sensors_contact |
sensors.position_of |
call | clunkyard:sensors_position_of |
tracker.cue |
property | clunkyard:tracker_cue |
tracker.nearest_bearing_rate |
property | clunkyard:tracker_nearest_bearing_rate |
tracker.velocity |
call | clunkyard:tracker_velocity |
tracker.position |
call | clunkyard:tracker_position |
tracker.last_seen |
call | clunkyard:tracker_last_seen |
tracker.configure |
call | clunkyard:tracker_configure |
nav.zone |
property | clunkyard:nav_zone |
nav.zone.margin |
call | clunkyard:nav_zone_margin |
nav.zone.contains |
call | clunkyard:nav_zone_contains |
nav.zone.distance_from |
call | clunkyard:nav_zone_distance_from |
nav.storm |
property | clunkyard:nav_storm |
nav.storm.margin |
call | clunkyard:nav_storm_margin |
nav.storm.contains |
call | clunkyard:nav_storm_contains |
nav.storm.distance_from |
call | clunkyard:nav_storm_distance_from |
nav.hill |
property | clunkyard:nav_hill |
nav.hill.margin |
call | clunkyard:nav_hill_margin |
nav.hill.contains |
call | clunkyard:nav_hill_contains |
nav.hill.distance_from |
call | clunkyard:nav_hill_distance_from |
nav.pickups |
property | clunkyard:nav_pickups |
nav.nearest_pickup |
call | clunkyard:nav_nearest_pickup |
nav.field_distance |
call | clunkyard:nav_field_distance |
score.me |
property | clunkyard:score_me |
score.best |
property | clunkyard:score_best |
score.armour |
property | clunkyard:score_armour |
angles.normalize |
call | clunkyard:angles_normalize |
angles.angle_diff |
call | clunkyard:angles_angle_diff |
angles.bearing_to |
call | clunkyard:angles_bearing_to |
angles.elevation_to |
call | clunkyard:angles_elevation_to |
angles.direction |
call | clunkyard:angles_direction |
angles.distance |
call | clunkyard:angles_distance |
angles.clamp |
call | clunkyard:angles_clamp |
status.set |
control | clunkyard:status_set |
status.get |
call | clunkyard:status_get |
raw.number |
call | clunkyard:raw_number |
raw.text |
call | clunkyard:raw_text |
raw.has |
call | clunkyard:raw_has |
raw.flag |
call | clunkyard:raw_flag |
raw.count |
call | clunkyard:raw_count |
raw.line |
call | clunkyard:raw_line |
raw.extra |
call | clunkyard:raw_extra |
session.event |
property | clunkyard:session_event |
session.next |
call | clunkyard:session_next |
session.send |
call | clunkyard:session_send |
session.forfeit |
call | clunkyard:session_forfeit |
session.log |
call | clunkyard:session_log |
session.feed |
call | clunkyard:session_feed |
session.reply |
call | clunkyard:session_reply |