Comments (4)
I think the solution with annotations is the better one, since using inheritance could get convoluted for units with many different abilities. It's probably easier to explain, too. I would just suggest switching the symbols for the first and second operation as @
and +
are already used in different contexts in nyan.
Using @
for the 2nd case instead of the 1st one would be better because this is more in line with @
signifying the override/replacement of an operator when its placed in front of it. In this context, it would signify the "override" of a parent with a child object which is very similar to the other use of @
.
+
already appears in an entirely different context (patching inheritance), so I would avoid using it here. Maybe $
, ~
or ?
are better?
from nyan.
Since this seems to be a syntactical problem, how about declaring the 3 possibilities like python decorators? i.e
Unit(Entity):
@replacedByChild
Move(Ability):
speed = 1.0
abilities += {Move}
Villager(Unit):
VillagerMove(Unit.Move):
speed = 10.0
# this now automatically replaces `Move` with `VillagerMove`
abilities += {VillagerMove}
from nyan.
(Sorry for the very delayed reply.....) Unfortunately it's not just syntactic, we are changing the set semantics here and need to configure that syntactically. Using decorators (at least to annotate the object itself) is probably not such a good choice since in a different set, the rule may not apply. So this needs to be a configuration for each set.
from nyan.
@heinezen and I just found a solution for this.
The realization was that we need both directions for these modifications:
- Inserting a specialized object into the set should replace all parents
- Removing a parent object (may not be in the set itself) should remove all children
This means the inheritance hierarchy should be enforced. This can be done by configuring theset
to ensure the inheritance hierarchy by overwrites.
Example:
Entity:
abilities : set(Ability, hierarchy_overwrite=True) = {}
Unit(Entity):
Move(Ability):
speed = 1.0
abilities += {Move}
Villager(Unit):
VillagerMove(Unit.Move):
speed = 10.0
# VillagerMove replaces Move, since the set was configured with hierarchy_overwrite!
abilities += {VillagerMove}
Regarding "Where is the border", i.e. when inserting a child, up until what level should parents be purged from the set? The "maximum anchestor" is the set's member type. In the above example, this means the VillagerMove
insertion removes all parents in the inheritance line between Ability
and VillagerMove
, thus Move
is replaced by VillagerMove
.
This would be @mic-e's "ne andere magic" from his brainstorm in 2018 :) (or actually a "keyword" in the set creation!)
from nyan.
Related Issues (20)
- Build fails with `nyan/config.h:20:17: error: ‘uint64_t’ does not name a type` and `nyan/config.h:23:17: error: ‘order_t’ does not name a type` with GCC 13.1.1. HOT 2
- Use string views HOT 1
- Replace (un)likely macro with C++20 attribute HOT 1
- Replace `fqon_t` with more advanced identifier type HOT 4
- Releasing a new version? HOT 24
- Fixed point type
- Static library support
- Windows UWP
- Add metaclass like python HOT 5
- Add decorator like python HOT 1
- Syntax highlighting for the web HOT 1
- Allow storing abstract object references in members
- Allow operations with float values for int data type HOT 1
- Hot reloading HOT 6
- Mitigate runtime errors for inf values HOT 1
- Number types compatibility (int<->float) considerations HOT 1
- v0.1 tag failed to compile on Windows HOT 5
- File API HOT 2
- Debian package HOT 6
- Prefix nyan object declarations with keyword `obj`
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from nyan.