I think it is something of a constant for software developers who have their own projects (And I can’t imagine many don’t) to also have a graveyard of abandoned or forgotten projects they’ve left behind. I, of course, am no exception. I’ve left behind a lot of software and programs, half-finished, buggy messes waiting for me to return to them and fix that-annoying-bug or implement that huge refactor.

In some respects it is somewhat overwhelming. Thankfully, there are some “Abandoned” projects that are effectively in a complete, usable state. I’ve mentioned by Expression evaluator, which I wrote over 8 years ago in Visual Basic 6, which is still going strong and which I still use as a quick-access calculator on the command line.

On the other hand, it also manages to put things in perspective. For each abandoned project that I no longer am bothered to work on, there was a time when it was my “main” project.

What prompted this particular post was that I “revived”- if only temporarily – my work on my first C# project, which was, coincidentally, a C# rewrite of my VB6 Expression evaluator library that I mentioned. It wasn’t completely functional and had some strange issues where it would give incorrect results, and I ended up losing interest in determining the cause of the problem (particularly since my VB6 version was working fine) and moved on to other projects. I put the source on github some time ago. It is effectively a recursive descent parser. It doesn’t actually compile anything. My understanding is that it would be possible to use Reflection.Emit to compile it to a .NET assembly, and execute that, or use Expressions. However I’ve kept it simple- if I was interested in speed, it would be possible to simply write whatever I was doing with it C# or VB.NET or some other language. The main purpose of the Evaluator is to provide powerful, expressive features; things like built-in support of Complex numbers (take the square root of a negative number, or use the i constant directly; as well as support for Lists (delimited by braces) and supporting cross-type operations as well. Another aim is to make adding new functions and operators as straightforward as possible, and even support special new concepts within separate classes. For example the Complex number support is a standard Complex number class, but which has also been enhanced to support a particular interface which allows extended evaluator features.

Somewhat embarrassingly, the issue/bug which eventually caused me to lose interest ended up being relatively straightforward to discover. Something which may have caused me to lose interest was that I had turned on IntelliTrace debugging, which made stepping and single stepping incredibly slow operations. I eventually found the bug to be caused by the implementation that attempted to cache evaluated stacks indexed by the expression- the code would check if it was in the dictionary, yield all the elements in the cached stack… but then fell through and ran the standard parsing routine all over again, resulting in the resulting stack having twice as many elements, with the original stack being repeated twice. With that issue fixed I was able to also add implicit multiplication (5(5+5) get’s evaluated to 50). And I found the actual implementation more feature complete overall then I remembered. It could probably replace my VB6 version if implemented into a proper console application for that purpose.

BASeBlock has practically become an abandoned project as well. a bit of a shame but it’s become the victim of my earlier design choices. I was able to refactor some parts but right now the issue is the serialization, since I want to get it using the new XML Serialization library I created and implementing that throughout the project is a rather large undertaking that I simply haven’t found the time or motivation to properly tackle. I occasionally jump in and try to write a save/load implementation for one of the game’s various objects and have tackled more than half of them, but considering they all need to be implemented before I can truly test them it is something of a pain.

I’m sure I could go on about my various abandoned projects- fact is that we (as developers) tend to create quite a few projects and we simply don’t have the time to keep them all up to date, so some of them end up abandoned, unfortunately. Ideally abandoned projects would at least be in a functioning state, but sometimes even that isn’t guaranteed.