On Wed, Mar 3, 2021 at 1:38 PM [email protected] <[email protected]>
wrote:
Oops, I see that I should ave written about a special value for p.v, not
> for p.
>
The special value is None :-) I want to emphasize the following important
points:
1. Leo *should* crash when any script, including Leo's core, tries to
access p.v.whatever when p.v is None.
Imo, it would be a serious blunder to set p.v to anything other than None
in p.moveToParent and p.moveToNthChild. We want Leo to crash *as soon as
possible.* Setting p.v to anything other than None would make debugging
*harder* by delaying the point at which the problems arise. In effect,
setting p.v to anything other than None would put a time bomb in Leo.
2. There is *nothing* wrong with the present code that should be "fixed".
The *only* question is how to keep mypy happy.
3. leojs works exactly the same way. Here are the relevant parts of the
Félix's code:
/**
* Create a new position with the given childIndex and parent stack.
*/
constructor(v: VNode, childIndex: number = 0, stack?: StackEntry[]) {
this._childIndex = childIndex;
this.v = v;
if (stack) {
this.stack = [...stack]; // Creating a copy here is safest and best.
} else {
this.stack = [];
}
}
/**
* Return True if a position is valid.
*
* The tests 'if p' or 'if not p' are the _only_ correct ways to test
* whether a position p is valid.
*
* Tests like 'if p is None' or 'if p is not None' will not work properly.
*/
public __bool__():boolean {
return !!this.v;
}
/**
* Move to Nth child
*/
public moveToNthChild(n:number):Position {
const p:Position = this;
if (p.v && p.v.children.length > n){
p.stack.push([p.v, p._childIndex]);
p.v = p.v.children[n];
p._childIndex = n;
}else{
// * For now, use undefined p.v to signal null/invalid positions
//@ts-ignore
p.v = undefined;
}
return p;
}
*Summary*
Leo's devs must not become confused by type checking issues. Setting p.v to
None is the best way to indicate an invalid position.
Edward
--
You received this message because you are subscribed to the Google Groups
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/leo-editor/CAMF8tS315iO3hqxjcYYFZ9%3D6sUbiJWdXLdWWN-uKj3PuKJHqMg%40mail.gmail.com.