Lentic 0.7

Lentic is an Emacs mode which supports multiple views over the same text. This can be used for a form of literate programming. It has specific support for Clojure which it can combine with either LaTeX, Asciidoc or Org-Mode. Two lentic buffers, by default, the two share content but are otherwise independent. Therefore, you can have two buffers open, each showing the content in different modes; to switch modes, you simply switch buffers. The content, location of point, and view are shared. However, lentic also allows a bi-directional transformation between lentic buffers --- the buffers can have different but related text. This allows, for example, one buffer to contain an Emacs lisp file, while the other contains the same text but with ";;" comment characters removed leaving the …

Documenting Lentic

With a previous release of lentic [@url:www.russet.org.uk/blog/3035] I got a couple of suggestions. One of which was a complaint that it was hard to get going, because lentic lacks documentation. This is a bit unfortunate. Lentic actually did have documentation but it is hidden away as comments in source code; although, it's not specific to it, I wanted lentic to enable literate programming and it uses itself to document itself. Now, this makes perfect sense, but there is a problem. The end-user form of the documentation needs generating from the source code. This is true in general in Emacs land, although the standard form is texinfo. The usual solution to this problem is to generate the documentation up during the packaging process. This should work, but it doesn't. Or, rather, it does n…

William Henry Lord

As on a previous, happier, occasion, I ask for my readers indulgence for this personal post. This was my reading delivered today, 29th January, 2015. My father once said that he could not understand how people found so much to say at funerals; at his, he said, his life story would be over in just a few lines. Perhaps, here, I will prove him right. My father used to describe himself as a blessed man --- he meant this in a very simple way, which was that he was a happy man, contented with his life and his family. My father did not want for things for physical possessions but he did want to look after the things that he had. He loved to make and build things, to define simple solutions to little problems; his garage has shelves and cupboards that he crafted like a fitted kitchen. He was happi…

Lenticular Text

Like many developers I often edit both code and documentation describing that code. There are many systems for doing this; these can be split into code-centric systems like Javadoc which allow commenting of code, or document-centric systems like Markdown which allow interspersing code in documentation. Both of these have the fundamental problem that by focusing on one task, they offer a poor environment for the other. In this article, I introduce my solution which I call lenticular text. In essence, this provides two syntactic views over the same piece of text. One view is code-centric, one document-centric but neither has primacy over the other, and the author can edit either as they choose, even viewing both at the same time. I have now implemented a useful version of lenticular text for…

Support for Axiom Annotations

Since the early development of Tawny-OWL and easy to use syntax has been a specific objective [@url:www.russet.org.uk/blog/2214] as well as hiding some of the complexity of the OWL API. The intension has always been for Tawny-OWL to be an ontology developer tool first and a programmatic library second and keeping this in mind has been part of the reason that I believe does fill these objectives. Unfortunately, the other part of the reason is that Tawny-OWL does hides functionality that is available in the OWL API. Or, more strictly, does not uncover it. Tawny-OWL is implemented in Clojure and what is possible in Java is also possible in Java. One of the key decisions was to hide the support that the OWL API provides for certain forms of annotation, in particular annotatons on axioms. Of co…

Tawny-OWL 1.3

Less than one month after the release of Tawny-OWL 1.2.0 [@url:www.russet.org.uk/blog/3018] I am pleased to announce the 1.3.0 release. This is a much smaller release than 1.2.0, but provides two useful changes. First, I have now added support for axiom annotations as more extensively documented in my past post [@url:www.russet.org.uk/blog/3028] While I expect these are still a minority requirement, they are used heavily by some people, and so they need supporting. Second, I have reworked the support for patterns. This has been through the addition of three functions. p allows writing classes with optionality. So, for instance, consider this code: (p o/owl-class o partition-name :comment comment :super super) comment and super are optional here; they can be nil. In this case, the…

Tawny-OWL 1.2

About six months after the release of Tawny-OWL 1.1.0 [@url:www.russet.org.uk/blog/2989] I am pleased to announce the 1.2 release. There have been a number of changes in this release, some planned, some not. The planned changes have been an extension of the rendering capabilities of Tawny-OWL; it is now possible to render an OWLEntity entirely into Clojure data structures. The main reason for this was to allow use of core.logic for building an effective syntactic query language over OWL. This is now complete, although more work needs to be done on tawny.query if this is to be exploited to it's fullest. The main unplanned release was caused by a change in the OWL API which had dramatic (and negative) consequences for Tawny-OWL performance. The details of this change have been documented els…

Adventures in Text Land

In this post, I describe the different technologies that I've tried for writing a new book, from markdown to LaTeX. One of the questions that I have been asked about Tawny-OWL [@url:www.russet.org.uk/blog/2366] was whether there was a manual or not. Actually, the answer is, yes, there is and has been since well before the 1.0 release. However, it's not rich enough. It makes requires both a reasonably good background in Clojure and in Ontology development. Given that the overlaps between these two areas of knowledge is probably limited to myself and Jennifer Warrendar this is rather less than ideal. So, I've started a new manual in the form of a book called Take-Wing. Getting a nice environment has been an interesting journey. Markdown The orginal version of the documentation was written in…

When is a recursive function not a recursive function?

Yesterday, I came across a very strange bug in my Tawny-OWL library [@url:arxiv.org/abs/1303.0213] The bug was my fault, but fixing it was exacerbated by what has to go into my list of Clojure gotchas [@url:www.russet.org.uk/blog/2991] Consider this very simple piece of Clojure code. Is this a recursive function, i.e. one that calls itself? Intuitively the answer is yes, but I would argue that actually, you cannot tell from the information given. It could be, but is not necessarily so. (defn countdown [n] (if (pos? n) (cons n (countdown (- n 1))) '(LiftOff))) Let's run this code: test-project.core> (countdown 10) (10 9 8 7 6 5 4 3 2 1 LiftOff) All is working as it should and the function is recursing, so there appears to be no problem. However, countdown is a b…

Open-Access Communism

Godwin's law says that sooner or later every argument on the internet ends up with someone being called a Nazi. Interestingly in the Open Access debate, this has turned out not to be true; in this case, it's been communists instead. Perhaps the best known example of this was the Jeffrey Beale rant, which uses the term "anti-corporatist" and "collectivizing". A more direct communist angle comes from Moshe Vardi at ACM. He defends the idea that publishing is expensive because of all the fixed costs, something seen from the ACM before, and which I have commented on [@url:www.russet.org.uk/blog/1924] He also makes the tired confusion that "free software" is the same thing as "anti-copyright". Now, personally, I do not particularly mind being called a com…