[erlang-questions] If you are homesick for object.selector

Loïc Hoguin essen@REDACTED
Thu Jan 24 16:18:36 CET 2013


On 01/24/2013 03:16 PM, David Goehrig wrote:
> On Jan 23, 2013, at 9:37 PM, Loïc Hoguin <essen@REDACTED> wrote:
>
>> Character.current_weapon.ability.points_req
>>
>> Or
>>
>> Character.inventory[0].name
>
> Putting my game programmer hat back on, given a choice I would prefer:
>
>    Character weapon ability cost
>
> Where each is an application of a method on the prior or in Erlangy speak:
>
>      cost(ability(weapon(Character)))
>
> Where in each function destructs and returns an element of the nested structure. I might for sake of argument want to further name them:
>
>    costOf(abilityOf(weaponOf(Character)))
>
> Now in a typical game, weaponOf vectors to the currently selected item from the inventory. AbilityOf vectors off of the currently selected special assigned to the B button / right click slot, and the cost is tied to the level of the character for scaling (if you assume a fixed sized mana pool).
>
> Usually each of these behaviors require implicit knowledge of other state, and would likely make extensive use of get/put  in the Character's process dictionary to vector accordingly.
>
> This would imply these structures are best managed in an entirely different manner, where the Character process should memoize the values in a process dictionary, and the interrogation should happen only once upon an equip(Weapon) method.
>
> Same issue goes with inventory. We probably need a weapons manual process that can be interrogated for details based on names.  These changes would make it more likely to be a bunch of message sends. To WeaponManual, Inventory, Character, etc.
>
> It would be difficult to justify the dot notation as it wouldn't even remotely resemble how one would structure the message sends.

Process dictionary? Messages? I don't understand.

Assume a variable Character. This variable contains everything about the 
character. How do you best access and modify Character? The answer must 
not involve the process dictionary, processes or message passing. Today 
I have to write each access and modification function. Or I can generate 
it, but either way I end up with hundreds of functions in many modules. 
Or I could use records, and have one line per sub-record per 
modification function I write. That's not *easy* nor *practical*. Easy 
and practical is:

   Character.weapon.ability.cost

for access, and:

   Character.weapon.ability.cost = 123

for modification.

Now I know this isn't the Erlang way, but I'm sure there can be a 
solution that allows to write something similar. Frames looked like a 
pretty good step in the right direction. Regardless of syntax, I'm sure 
we can have something like:

   Character2 = Character{weapon{ability{cost=123}}}

Where it would be checked against the proper type, evaluated at runtime, 
and return a copy of Character with the requested modifications. This 
can work for access, "modification", and pattern match. The user would 
be aware that it has runtime costs, but will likely still choose this 
because it allows him to actually get the work done. There's many 
projects that I wouldn't even dream to do because of how tedious it 
would be, as I want to get my project running and not battle endlessly 
to modify my data.

-- 
Loïc Hoguin
Erlang Cowboy
Nine Nines
http://ninenines.eu



More information about the erlang-questions mailing list