The Nim binding
The generated Nim module imports the core's C functions and native records
through Nim's C backend. Functions return a status and copy results through
pointers. CY_NONE means absent; CY_SHORT gives the required buffer size.
check(robot, status) raises CoreError with the core's error text for
negative statuses. Nim's style-insensitive names allow either
cy_sensors_nearest or cySensorsNearest.
Install with make install SDK=/opt/clunkyard/sdk. Build with
nim c -d:release --path:/opt/clunkyard/sdk/bindings/nim --out:bot bot.nim.
The installed module resolves its core header and static library relative to
its SDK directory. The artifact carries only the native executable.
Call run(turn, start) with callbacks receiving the core handle. start is
optional. Exceptions are logged with their trace and the turn sends its
controls already set. Raise Forfeit with its code field set to forfeit.
play(lines, turn, start) uses a memory session for tests. The run loop
recovers a core fault by sending the empty reply and reading the next state.
A tiny robot
import clunkyard
proc turn(robot:pointer)=
var target:CyContact
var heading:cdouble
check(robot,cyMeHeading(robot,addr heading))
if cySensorsNearest(robot,addr target)!=CY_OK:
check(robot,cyDriveThrottle(robot,0.75));check(robot,cyDriveTurn(robot,0.25))
check(robot,cyScannerHeading(robot,heading));check(robot,cyScannerArc(robot,40))
var last:CyScan
check(robot,cyScannerLast(robot,addr last))
check(robot,cyStatusText(robot,"SEARCH",6));check(robot,cyStatusValue(robot,last.arc))
return
var power:cdouble
var aim:CySolution
check(robot,cyGunPowerForFlightTime(robot,target.range,1,addr power))
if cyGunLead(robot,addr target,power,addr aim)!=CY_OK:aim.heading=target.bearing;aim.pitch=target.elevation
check(robot,cyGunAimHeading(robot,aim.heading));check(robot,cyGunAimPitch(robot,aim.pitch))
var canFire:cint
check(robot,cyGunCanFire(robot,power,10,addr canFire))
if canFire!=0:check(robot,cyGunFire(robot));check(robot,cyGunPower(robot,power))
var delta,control:cdouble
check(robot,cyAnglesAngleDiff(target.bearing,heading,addr delta));check(robot,cyAnglesClamp(delta,-1,1,addr control))
check(robot,cyDriveThrottle(robot,0.5));check(robot,cyDriveTurn(robot,control))
check(robot,cyScannerHeading(robot,target.bearing));check(robot,cyScannerArc(robot,10))
check(robot,cyStatusText(robot,"TRACK",5));check(robot,cyStatusValue(robot,target.range))
run(turn)
make test checks every generated Nim declaration against the core's full
conformance vectors, including typed foreign arguments and records, exact
floating-point results and serialized acts.
Names
Every entry of the robot API 2.0.0 in Nim. names.md has every language side by side.
| Canonical | Form | Nim |
|---|---|---|
match.mode |
property | cy_match_mode |
match.ruleset |
property | cy_match_ruleset |
match.control |
property | cy_match_control |
match.robots |
property | cy_match_robots |
match.is_3d |
property | cy_match_is_3d |
match.tick_rate |
property | cy_match_tick_rate |
match.max_ticks |
property | cy_match_max_ticks |
match.robot_id |
call | cy_robot_id |
clock.tick |
property | cy_clock_tick |
clock.seconds |
property | cy_clock_seconds |
clock.remaining_ticks |
property | cy_clock_remaining_ticks |
arena.size |
property | cy_arena_size |
arena.gravity |
property | cy_arena_gravity |
arena.terrain_kind |
property | cy_arena_terrain_kind |
arena.ground_height |
call | cy_arena_ground_height |
me.health |
property | cy_me_health |
me.position |
property | cy_me_position |
me.velocity |
property | cy_me_velocity |
me.heading |
property | cy_me_heading |
me.pitch |
property | cy_me_pitch |
me.roll |
property | cy_me_roll |
me.angular_velocity |
property | cy_me_angular_velocity |
me.attitude |
property | cy_me_attitude |
me.grounded |
property | cy_me_grounded |
me.altitude |
property | cy_me_altitude |
me.applied |
property | cy_me_applied |
battery.charge |
property | cy_battery_charge |
battery.capacity |
property | cy_battery_capacity |
battery.regen |
property | cy_battery_regen |
battery.sustainable_drive |
property | cy_battery_sustainable_drive |
battery.compute |
property | cy_battery_compute |
battery.drive_cost |
call | cy_battery_drive_cost |
drive.hover_lift |
property | cy_drive_hover_lift |
drive.set |
control | cy_drive_throttle, cy_drive_turn, cy_drive_pitch_turn |
drive.forces |
control | cy_drive_thrust, cy_drive_strafe, cy_drive_lift, cy_drive_yaw_torque, cy_drive_pitch_torque, cy_drive_roll_torque, cy_drive_brake |
drive.get |
call | cy_drive_get_throttle, cy_drive_get_turn, cy_drive_get_pitch_turn, cy_drive_get_thrust, cy_drive_get_strafe, cy_drive_get_lift, cy_drive_get_yaw_torque, cy_drive_get_pitch_torque, cy_drive_get_roll_torque, cy_drive_get_brake |
gun.aim_now |
property | cy_gun_aim_now |
gun.cooldown_ticks |
property | cy_gun_cooldown_ticks |
gun.spread |
property | cy_gun_spread |
gun.max_power |
property | cy_gun_max_power |
gun.damage_scale |
property | cy_gun_damage_scale |
gun.can_fire |
call | cy_gun_can_fire |
gun.shot_speed |
call | cy_gun_shot_speed |
gun.shot_cost |
call | cy_gun_shot_cost |
gun.reload_ticks |
call | cy_gun_reload_ticks |
gun.shot_damage |
call | cy_gun_shot_damage |
gun.power_for_speed |
call | cy_gun_power_for_speed |
gun.power_for_flight_time |
call | cy_gun_power_for_flight_time |
gun.lead |
call | cy_gun_lead |
gun.lead_point |
call | cy_gun_lead_point |
gun.aim |
control | cy_gun_aim_heading, cy_gun_aim_pitch |
gun.fire |
control | cy_gun_fire, cy_gun_power |
gun.get |
call | cy_gun_get_aim_heading, cy_gun_get_aim_pitch, cy_gun_get_fire, cy_gun_get_power |
scanner.last |
property | cy_scanner_last |
scanner.proximity_range |
property | cy_scanner_proximity_range |
scanner.reach |
call | cy_scanner_reach |
scanner.arc_for_reach |
call | cy_scanner_arc_for_reach |
scanner.set |
control | cy_scanner_heading, cy_scanner_arc, cy_scanner_pitch |
scanner.get |
call | cy_scanner_get_heading, cy_scanner_get_arc, cy_scanner_get_pitch |
sensors.contacts |
property | cy_sensors_contacts |
sensors.nearest |
property | cy_sensors_nearest |
sensors.cues |
property | cy_sensors_cues |
sensors.contact |
call | cy_sensors_contact |
sensors.position_of |
call | cy_sensors_position_of |
tracker.cue |
property | cy_tracker_cue |
tracker.nearest_bearing_rate |
property | cy_tracker_nearest_bearing_rate |
tracker.velocity |
call | cy_tracker_velocity |
tracker.position |
call | cy_tracker_position |
tracker.last_seen |
call | cy_tracker_last_seen |
tracker.configure |
call | cy_tracker_configure |
nav.zone |
property | cy_nav_zone |
nav.zone.margin |
call | cy_nav_zone_margin |
nav.zone.contains |
call | cy_nav_zone_contains |
nav.zone.distance_from |
call | cy_nav_zone_distance_from |
nav.storm |
property | cy_nav_storm |
nav.storm.margin |
call | cy_nav_storm_margin |
nav.storm.contains |
call | cy_nav_storm_contains |
nav.storm.distance_from |
call | cy_nav_storm_distance_from |
nav.hill |
property | cy_nav_hill |
nav.hill.margin |
call | cy_nav_hill_margin |
nav.hill.contains |
call | cy_nav_hill_contains |
nav.hill.distance_from |
call | cy_nav_hill_distance_from |
nav.pickups |
property | cy_nav_pickups |
nav.nearest_pickup |
call | cy_nav_nearest_pickup |
nav.field_distance |
call | cy_nav_field_distance |
score.me |
property | cy_score_me |
score.best |
property | cy_score_best |
score.armour |
property | cy_score_armour |
angles.normalize |
call | cy_angles_normalize |
angles.angle_diff |
call | cy_angles_angle_diff |
angles.bearing_to |
call | cy_angles_bearing_to |
angles.elevation_to |
call | cy_angles_elevation_to |
angles.direction |
call | cy_angles_direction |
angles.distance |
call | cy_angles_distance |
angles.clamp |
call | cy_angles_clamp |
status.set |
control | cy_status_text, cy_status_value |
status.get |
call | cy_status_get_text, cy_status_get_value |
raw.number |
call | cy_raw_number |
raw.text |
call | cy_raw_text |
raw.has |
call | cy_raw_has |
raw.flag |
call | cy_raw_flag |
raw.count |
call | cy_raw_count |
raw.line |
call | cy_raw_line |
raw.extra |
call | cy_raw_extra |
session.event |
property | cy_session_event |
session.next |
call | cy_session_next |
session.send |
call | cy_session_send |
session.forfeit |
call | cy_session_forfeit |
session.log |
call | cy_session_log |
session.feed |
call | cy_session_feed |
session.reply |
call | cy_session_reply |