Sugar went on a diet

In one of the recent builds of Sugar for the OLPC XO, I found that “out of the box” the machine barely has enough memory to run programs. Tonight I installed the most recent operating system version, 8.2.0, and found the amount of free memory to be drastically increased:

Total MB Used MB Free MB
Sugar 8.2.0 230 162 67
Sugar Previous 232 220 12

With 55MB more free memory, I expect this machine to play a lot nicer with its users!
I used

free -m

to get these measurements.

The Joy programming language

A few weeks ago I was asking about stack based languages in #scheme. I would like to learn more about them and I was looking for a good language with which to start.
Joy was pointed out as a great place to start, and in particular this tutorial is the best place to start with Joy.
From what the Joyer in #scheme shared and from what I have read, Joy seems to be a very interesting language as it is very Lisp like in its simplicity and extensibility.

Automata via Macros

Last year I asked a question about Automata via Macros to the PLT Discussion List. The paper is about an extended example of a problem posed by Shriram Krishnamurthi at the Lightweight Languages 1 conference. I was trying to understand how one might use the same FSA language to generate different outputs. Many folks explained how that would work and the thread finished. It didn’t finish for me, though. To say my understanding of the solution was superficial would be an overstatement. I knew I didn’t “get it”, and kept it on my list to revisit once I had a better grasp on things. That was a year and a half ago.
Over my holiday I revisited the paper and found, for lack of a better way to say it, that it “made sense”. In the past year I’ve tried to: read a lot, write a lot of code, read other people’s code, and most importantly do so with some discipline and attention to detail that I had not applied before. That seems to have paid off; as it felt like I was reading the paper with brand new eyes.
This time around, I also listened to a recording of the presentation itself and watched the PowerPoint that went along with it. This was especially valuable because it drew attention to various tidbits that appeared in the paper but were much easier to delineate by virtue of Shriram pointing them out in context of the presentation. It was those comments, along with what I had learned in the past year that really got me thinking about things again.
In a conversation with Aaron Hsu, he once said something to the effect that “Scheme is hard because it is subtle.”, and that sort of rang true with my intuition, but I had a difficult time verbalizing exactly why I thought that to be true. Outwardly Scheme appears to be “simple”, but the more you learn about it and the deeper you dig, you start to see that it is Deceptively Simple.
Scheme seems to take only a few days to learn, but a few years to master; but why? I don’t know yet, but what I do know is that some of the ideas and topics presented in this paper and presentation are surely some of the aforementioned “subtleties” that serve as landmarks on this multi-year path towards understanding Scheme. For my own reference, and for others who may be studying Scheme and wondering exactly why “Subtlety is hard”, perhaps this paper will serve to shed some light on things.
My advice: read LAMBDA: The Ultimate Imperative and LAMBDA: The Ultimate GOTO first.

Abstract

Lisp programmers have long used macros to extend their language. Indeed, their success has inspired macro notations for a variety of other languages, such as C and Java. There is, however, a paucity of effective pedagogic examples of macro use. This paper presents a short, non-trivial example that implements a construct not already found in mainstream languages. Furthermore, it motivates the need for tail-calls, as opposed to mere tail-recursion, and illustrates how support for tail-call optimization is crucial to support a natural style of macro-based language extension.

Key notes from the audio

These are mostly my notes and summaries for some key points that rang true with me. The ideas that they represent may or may not be contained within my summary as it would be too far outside the scope of this blog post to address them. Such work is better done by other papers and presentations.

  • 09:00: Without the hidden gems, syntax, macros, and tail calls, it all falls apart.
  • 11:16: What you generate must fit well into the language.
  • 18:00: It is really tail-transfer (tail-calls) that matter, not tail-recursion.
  • 21:00: Scheme is really an indentation based language.
  • 23:00: Macro languages belong in modules; you can use your data (DSL) where you wish.
  • 25:30: If you claim to be smart, leverage the work of others.
  • 26:10: Scheme is subtle. Takes years to understand what is beautiful. You can look at a book but you won’t notice. The language hides it jewels.
  • 26:45 If you don’t get tail calls, you don’t get it.

Key notes from the paper

  • P2P3: “A macro gives the programmer a consistent, representation-independent means of describing the datum
    while still resolving the representation before compilation.”
  • P7P4: Macros are likely to be used to optimize the abstraction that the data represents.
  • P8P3: Scheme’s macro system could be called “a lightweight compiler API”.
  • P9P2: Tail-calls ought to be called tail-transfer per Steele. I wonder why they didn’t push that definition more.
  • P9P3: Here is a good explanation of tail calls.
  • P9P5: “languages represent the ultimate form of reuse, because we get to reuse everything from the mathematical (semantics) to the practical (libraries), as well as decades of research and toil in compiler construction (Hudak, 1998).”
  • P13P2: “it shows how features that would otherwise seem orthogonal, such as macros and tail-calls, are in fact intimately wedded together; in particular, the absence of the latter would greatly complicate use of the former.”

The automaton language

; An automaton that recognizes the language c(ad)*r
(define m
  (automaton init
             (init :
                   (c → more))
             (more :
                   (a → more)
                   (d → more)
                   (r → end))
             (end : accept)))

Dynamically avoiding duplicate identifiers in PLT Scheme

In this thread on the PLT discussion list, the original poster was encountering a problem while implementing a DSL where definitions were getting defined more than once in the code that he was generating. The problem is that the define function will not define the same name twice:

(define x 10)
(define x 12)
=> duplicate definition for identifier in: x

The solution would be to check if the given name is already bound before defining: if it was not defined, the define function should be used, otherwise the set! function should be used:

(define x 10)
(set! x 12)

Here is Andre’s solution from the thread:

(define-syntax define-if-not
  (λ (stx)
    (syntax-case stx ()
      [(_ var val)
       (with-syntax ([set!define (if (identifier-binding #'var 0)
                                      #'set!
                                      #'define)])
         (syntax
          (set!define var val)))])))

identifier-binding returns true unless the name is a top level binding or is not bound at all. If the name is already bound, use set!; otherwise use define.

Unicode in Emacs

From what I can see, Emacs supports Unicode just fine. I had asked about it on the PLT discussion list, where it was explained that set-language-environment function will configure Emacs to use Unicode wherever possible. Here is the documentation:

(set-language-environment LANGUAGE-NAME)
Set up multi-lingual environment for using LANGUAGE-NAME. This sets the coding system priority and the default input method and sometimes other things. LANGUAGE-NAME should be a string which is the name of a language environment. For example, “Latin-1” specifies the character set for the major languages of Western Europe.

Here is how to get a list of valid LANGUAGE-NAMEs:

(sort (mapcar (lambda (linfo) (car linfo)) language-info-alist) 'string<)

(Execute the command C:u before evaluating it with xe to import the result into the buffer)
Here is how to set it to Unicode:

(set-language-environment "UTF-8")

WordPress 2.7 is out

WordPress 2.7 is out. While there are a lot of great new features, there are two that piqued my interest:

Comment threading is just that, comment threading. This is a useful feature that has always been provided by a plugin.
WordPress Upgrader “will give you the option of downloading, installing, and upgrading to the latest WordPress version from your Administration Panel.” This is particulary helpful as the WordPress developers are very proactive about addressing security risks and adding new (extensively tested) features. It can become a hassle to keep up with ugprades.
Most folks use a plugin to perform upgrades, but with my not-uncommon-set-up where the blog is installed in a sub-directory but served on the root, that plugin only worked 1/10th of the time. Consequently, all of my upgrades were manual, until now at least. Thanks WordPress team!

It is what you know that you don't know that matters most

The idea that “It is what you know that you don’t know that matters most” has been coming up a lot lately. Here is one fellow’s take on it via this post:

I have the the distinction of being the “programming languages guru” here at Dobbs Code Talk. So what does this mean to me? It means that after many years of programming and studying language design, I am reasonably aware about what it is that I don’t know about programming languages. Contrast this to something like helicopter mechanics, for which the only meaningful thing I can say is that I know nothing about it.
It is perhaps a dubious achievement to be knowledgable about the limits of your understanding, but at the same time I don’t really think you can do any better.

Agreed.

When you can't be lazy

When it comes to learning, and “doing things well” for it, you can’t be lazy. You simply can not be lazy.
You won’t get away with it. Eventually you will screw up. Maybe you will catch it, and maybe you won’t. Maybe it won’t matter to anyone else or maybe it will. The only thing that you should care about is that it matters to you because you want better for yourself.
You should always work hard and study smart and give yourself the time that you need to learn.

LaTeX Advice

While reading this article, it occurred to me that one ought to approach LaTeX coding much as one would code in any other language: re-use whenever possible.
Aspiring TeXnicians should get comfortable with searching for packages that contain the desired functionality, and using them, rather than starting from scratch each time.
Perhaps this is something of a no-brainer, but, it is very easy to get caught up in the fact that you are writing, rather then coding, while using LaTeX.