Hey Ionuț,
Let's start with a smaller example so that we can discuss how bind works.
Take the following block, which marks anyone under the age of 18 as underage (in the U.S.) for voting.
search
person = [#person]
person.age < 18
bind
person += #underage
Once you've created the block and added it to the program, it will begin running. When it starts we'll parade the existing facts in the system past it as potential input. If anything matches, it will get processed. From then on, every new fact added to the system (including those from this and other blocks!) will also be considered as input.
Let's create some people to test that out.
commit
[#person name: "Jeff" age: 14 birthday: "09-07"]
[#person name: "Jorge" age: 23 birthday: "01-13"]
[#person name: "Jen" age: 17 birthday: "05-01"]
// we'll use this later on...
[#celebrate-birthday date: "05-01"]
As we would expect, both Jeff and Jen will be tagged #underage. Now, what happens if Jen's birthday passes? Let's celebrate!
search
celebrate = [#celebrate date]
person = [#person birthday: date]
commit
celebrate := none // We wouldn't want to celebrate twice!
person.age := person.age + 1
So, Jen is 18 now. This new fact enters the system and gives every block a chance to run again. We really want the block to stop saying that Jen is underage since she no longer meets its requirements. Luckily for us, that's exactly how bind works in Eve. Since her age doesn't pass the `< 18` test, the block stops asserting that she's `#underage` and everything is right with world.
That same logic carries over to your case. Let's look at the following setup.
Here's a person with no age:
commit
[#person name: "Jeff"]
And a block to attach a default age to people:
search
person = [#person]
not(person.age)
bind
person.age := 21
First, we introduce Jeff to the block. Since he matches, (he is a person and he's got no age) we assign an age to him. This new fact enters the system about Jeff, so we need to check to make sure he still matches. Unfortunately, now that Jeff has an age (even though it's one we provided!) he no longer matches our terms. Therefore, we stop asserting that Jeff has an age. Where this goes from bad to worse is that this change affects the block yet again. It considers whether Jeff (now ageless again) matches and indeed he does. We reassert the age and continue the cycle until Eve detects the divergence and stops executing.
There are several ways to fix this problem, depending on what you want to happen. For a case of defaults like this, you can either do as Chris suggests above with an if/else, or you can change the bind to a commit. Commits are permanent, unlike binds, so they won't get retracted even when the inputs that caused them to trigger cease existing. So long as that's really the behavior you're looking for, commit should be a one word fix for your existing block. :)
Please feel free to ask any other questions you have here on the mailing list as well. Chances are if there's something in the language you struggle with, other people are struggling too. Helping you helps us improve the language and documentation for everybody!